本文分享自华为云社区《GaussDB(DWS) 3A安全能力》,作者:yd_281561943。
1. 前言
- 适用版本:【8.0.0 (及以上)】
数据库安全是指保护数据库以防止未授权用户窃取、篡改和破坏数据库中数据信息的技术。数据库安全技术可以简单分为3个A:
- Authentication(认证):认证解决让谁进来的问题(进门)
- Authorization(授权):授权解决能干啥的问题(干活)
- Audit(审计):审计解决干了啥的问题(监控)
2. Authentication——认证
连接认证解决用户能否登录数据库的问题。本产品支持如下几种认证方式:
- 基于主机的认证:服务器端根据客户端的IP地址、用户名及要访问的数据库来查看配置文件从而判断用户是否通过认证。
- 口令认证:包括远程连接的加密口令认证和本地连接的非加密口令认证。
- 证书认证:此模式需进行SSL连接配置且需要客户端提供有效的SSL证书,不需要提供用户密码。
- 第三方认证:ldap、oneaccess等
这几种方式都需要配置“pg_hba.conf”文件,pg_hba.conf文件格式,pg_hba有若干行的HBA记录组成:
连接类型 | 数据库 | 用户 | IP地址 | 认证方式 |
TYPE | DATABASE | USER | ADDRESS | METHOD |
一条HBA记录的含义是允许哪些用户(USER),从哪些IP地址(ADDRESS),以哪种连接类型(TYPE),以哪种认证方式(METHOD),连接哪些数据库(DATABASE)。
认证时对每个连接请求从下到下依次检查hba文件中的记录,如果当前记录匹配,就返回。 HBA记录的顺序非常关键。hba的这种逻辑非常重要,轻易不应该变动,否则会引发非常严重的问题。
案例:hba逻辑变动引发的问题
ldap连接出现过一个问题,升级过程中pg_hba.conf文件中的记录会排序,导致升级前后ldap配置行顺序变化,到sha256配置行后面了。由于pg_hba.conf的顺序遍历机制,升级后ldap用户错误匹配到sha256配置行,连接失败。
为解决顺序变动引发的问题,第一版的修改方案是将ldap判断逻辑放在循环遍历的开始位置:先看认证类型,如果是ldap认证就判断配置行method字段是否为ldap,不是就跳到下一行,直到找到method是ldap的为止。
在这版修改方案下,ldap认证方式的连接匹配到的都是ldap的hba记录。用户连接数据库时,可以成功连接,但是业务却无法进行,报错:“Invalid username/password,login denied.”。原因是内部节点执行语句时会进行节点之间的认证,认证类型为trust,不会提供密码。修改之后只会匹配到ldap记录,ldap方式需要密码,从而报错。
升级前后,ldap与sha256配置行位置如下:
升级前:
host all @/etc/ldap/ldap_user 0.0.0.0/0 ldap ldapserver=xxx.xxx.xxx.xxx ldapport=xxx ldapprefix="CN=" ldapsuffix="OU=test_dmj_group,DC=com"
host all all 0.0.0.0/0 sha256
升级后:
host all all 0.0.0.0/0 sha256
host all @/etc/ldap/ldap_user 0.0.0.0/0 ldap ldapserver=xxx.xxx.xxx.xxx ldapport=xxx ldapprefix="CN=" ldapsuffix="OU=test_dmj_group,DC=com"
- TYPE:type是local、host、hostssl、hostnossl四种之一。
分别表示:
local: 仅允许unix domain socket连接。
host: 允许TCP/IP连接,可以匹配SSL和非SSL的连接请求。
hostssl: 允许TCP/IP连接,仅匹配SSL的连接请求。
hostnossl: 允许TCP/IP连接,仅匹配非SSL的连接请求。 - DATABASE:可以用all表示所有数据库,也可以用逗号分隔显式指定数据库。
- USER:可以用all表示所有用户,也可以用逗号分隔显式指定用户。可以是特定数据库用户的名称,也可以是前面带有+的组名称。+标记实际上意味着“匹配直接或间接属于该角色的任何角色” ,而没有+标记的名称仅匹配该特定角色。
- ADDRESS:声明记录所匹配且允许访问的地址。type是local时,表示本机连接,不需要指定IP地址。
- METHOD:认证方式有trust、reject、md5、sha256、ldap、cert、oneaccess等。
trust:白名单,无条件允许连接。
reject:黑名单,无条件拒绝连接。
md5: pg的password认证方式,不安全。
sha256: gaussdb的password认证。
ldap:使用LDAP进行第三方认证。
cert:客户端证书认证模式,此模式需进行SSL连接配置且需要客户端提供有效的SSL证书,不需要提供用户密码。
oneaccess:使用oneaccess进行第三方认证。
3.Authorization——授权
权限表示用户对某个数据库对象的操作是否被允许。GaussDB(DWS)中的权限包含三种场景:系统权限、数据对象权限、用户权限。
3.1 系统权限
3.1.1 三权分立
默认情况下拥有SYSADMIN属性的系统管理员,具备系统最高权限。在实际业务管理中,为了避免系统管理员拥有过度集中的权利带来高风险,可以设置三权分立,将系统管理员的CREATEROLE属性和AUDITADMIN属性权限分别给安全管理员和审计管理员。
3.1.2 系统权限授权
系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN和LOGIN。
系统权限可以在创建、修改角色或者用户时进行授权,CREATE/ALTER ROLE/USER user_name [WITH] option语句的option中,可以设置以下字段,来实现系统权限赋权。
- SYSADMIN | NOSYSADMIN
决定一个新角色是否为“系统管理员”,具有SYSADMIN属性的角色拥有系统最高权限。缺省为NOSYSADMIN。 - AUDITADMIN | NOAUDITADMIN
定义角色是否有审计管理属性。缺省为NOAUDITADMIN。 - CREATEDB | NOCREATEDB
决定一个新角色是否能创建数据库。新角色没有创建数据库的权限。缺省为NOCREATEDB。 - CREATEROLE | NOCREATEROLE
决定一个角色是否可以创建新角色(也就是执行CREATE ROLE和CREATE USER)。 一个拥有CREATEROLE权限的角色也可以修改和删除其他角色。缺省为NOCREATEROLE。 - LOGIN | NOLOGIN
具有LOGIN属性的角色才可以登录数据库。一个拥有LOGIN属性的角色可以认为是一个用户。缺省为NOLOGIN。
3.2 数据对象权限
数据对象包括表和视图、指定字段、数据库、函数、模式等,对它们的创建、增、删、改、查等操作就是数据对象权限。授权语法格式为:GRANT [privileges] ON [objects] TO [users],回收权限语法格式为REVOKE [privileges] ON [objects] FROM [users]。
对象类型 | 权限列表 |
表、视图 | SELECT、INSERT、UPDATE、DEELETE、TRUNCATE、REFERENCES、 TRIGGER、ANALYZE、ANALYSE、VACUUM、ALTER、DROP |
表字段 | SELECT、INSERT、UPDATE、REFERENCES |
数据库 | CREATE、CONNECT、TEMPORARY |
域 | USAGE |
外部数据源 | USAGE |
外部服务器 | USGAE |
函数 | EXECUTE、ALTER、DROP(ALTER、DROP为910版本新加) |
过程语言 | USAGE |
大对象 | SELECT、UPDATE |
序列 | SELECT、UPDATE、USAGE |
子集群 | CREATE、USAGE、COMPUTE |
模式 | CREATE、USAGE、ALTER、DROP |
表空间 | CREATE |
类型 | USAGE |
目录 | READ、WRITE |
3.3 用户权限
3.3.1 用户权限授权
将一个角色或用户的权限授予一个或多个其他角色或用户。被授权的角色或用户就拥有授权的角色或用户的权限。当声明了WITH ADMIN OPTION,被授权的用户可以将该权限再次授予其他角色或用户,以及撤销所有由该角色或用户继承到的权限。当授权的角色或用户发生变更或被撤销时,所有继承该角色或用户权限的用户拥有的权限都会随之发生变更。语法格式为GRANT role TO user。
3.3.2 预置角色
GaussDB(DWS)提供了一组预置角色,以“gs_role_”开头命名,这些预置角色具有一些固定的权限。当某些用户需要进行相关操作,只需要把预置角色授给用户即可。目前GaussDB(DWS)的预置角色如下表:
角色 | 权限描述 |
gs_role_signal_backend | 具有调用函数pg_cancel_backend、pg_terminate_backend、pg_terminate_query、pg_cancel_query、pgxc_terminate_query、pgxc_cancel_query来取消或终止其他会话的权限,但不能操作属于初始用户的会话。 |
gs_role_read_all_stats | 读取系统状态视图并且使用与扩展相关的各种统计信息,包括有些通常只对系统管理员可见的信息。 |
gs_role_analyze_any | 具有系统级ANALYZE权限类似系统管理员用户,跳过schema权限检查,对所有的表可以执行ANALYZE。 |
gs_role_vacuum_any | 具有系统级VACUUM权限类似系统管理员用户,跳过schema权限检查,对所有的表可以执行VACUUM。 |
gs_redaction_policy | 具有创建、修改、删除脱敏策略的权限,对所有的表都可以执行CREATE、ALTER、DROP REDACTION POLICY。9.1.0及以上集群版本支持。 |
gs_role_sql_management | 具有执行plan management相关的管理命令和管理函数的权限。仅8.2.1.200集群版本支持。 |
4.Audit——审计
审计是指记录用户的登陆退出以及登陆后在数据库里的行为操作,使得数据库安全管理员可以利用这些日志信息,找出非法操作的用户,时间和内容等。
4.1 设置审计配置项
要使数据库能够审计到某项功能,需要打开审计的总开关(audit_enabled)和对应的审计项开关(audit_operation_exec),二者均支持动态加载,在数据库运行期间修改该配置项的值会立即生效,无需重启数据库。
有两点需要注意,其一如果审计ddl操作,需要另外配置audit_system_object 来审计具体某个对象的ddl 操作;其二如果是审计事务,事务内部的操作是否审计需要结合其具体的配置项是否配置。审计项的参数控制:
参数名称 | 类型 | 参数范围 | 参数说明 |
audit_enabled | bool | 0,1 | 控制审计进程的开启和关闭。审计进程开启后,将从管道读取后台进程写入的审计信息,并写入审计文件 |
audit_inner_tool | bool | 0,1 | 是否审计GaussDB(DWS)中内部维护工具的各类操作 |
audit_operation_error | enum | none,syn_success,login,user_lock,violation,grant_revoke,ddl,select, insert, update, delete, merge, discard…… | 是否审计GaussDB(DWS)中各类执行失败的操作,由用户根据实际需求进行配置 |
audit_operation_exec | enum | none,all,login,logout,database_process,user_lock,grant_revoke,ddl,select, insert, update, delete, discard…… | 是否审计GaussDB(DWS)中各类执行成功的操作,由用户根据实际需求进行配置 |
audit_system_object | integer | [0,4194303] | 该参数决定是否对数据库对象的CREATE、DROP、ALTER操作进行审计。数据库对象包括Database, schema, user, table等。 |
4.2 查看审计日志
审计查询命令是pgxc_query_audit:
select * from pgxc_query_audit(timestamptz startime,timestamptz endtime,audit_log);
startime 和 endtime 分别表示审计记录的开始时间和结束时间,audit_log 表示所查看的审计日志新的所在的物理文件路径,当不指定audit_log 时,默认查看连接当前实例的审计日志信息。审计查询结果如下例:
postgres=# create table t1(id int);
ERROR: relation "t1" already exists
postgres=# select * from pgxc_query_audit('2021-03-21','2021-03-30') order by endtime desc limit 1;
-[ RECORD 1 ]---+--------------------------------
begintime | 2021-03-21 11:49:41.643+08
endtime | 2021-03-21 11:49:41.652+08
operation_type | ddl
audit_type | ddl_table
result | failed
username | perfadm
database | postgres
client_conninfo | gsql@[local]
object_name | t1
command_text | create table t1(id int);
detail_info | relation "t1" already exists
transaction_xid | 0
query_id | 1062177
node_name | cn_5001
thread_id | 139916885260032@669613657906735
local_port | 6000
remote_port |
5. 其他数据仓库安全技术
数据安全展示:数据脱敏、行级访问控制。
数据安全存储:数据存储加密、透明加密。
标签:审计,数仓,角色,用户,认证,详解,ldap,3A,权限 From: https://blog.51cto.com/u_15214399/10722044