赞
踩
本文分享自华为云社区《GaussDB(DWS) 3A安全能力》,作者:yd_281561943。
数据库安全是指保护数据库以防止未授权用户窃取、篡改和破坏数据库中数据信息的技术。数据库安全技术可以简单分为3个A:
连接认证解决用户能否登录数据库的问题。本产品支持如下几种认证方式:
这几种方式都需要配置“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"
分别表示:
local: 仅允许unix domain socket连接。
host: 允许TCP/IP连接,可以匹配SSL和非SSL的连接请求。
hostssl: 允许TCP/IP连接,仅匹配SSL的连接请求。
hostnossl: 允许TCP/IP连接,仅匹配非SSL的连接请求。
trust:白名单,无条件允许连接。
reject:黑名单,无条件拒绝连接。
md5: pg的password认证方式,不安全。
sha256: gaussdb的password认证。
ldap:使用LDAP进行第三方认证。
cert:客户端证书认证模式,此模式需进行SSL连接配置且需要客户端提供有效的SSL证书,不需要提供用户密码。
oneaccess:使用oneaccess进行第三方认证。
权限表示用户对某个数据库对象的操作是否被允许。GaussDB(DWS)中的权限包含三种场景:系统权限、数据对象权限、用户权限。
默认情况下拥有SYSADMIN属性的系统管理员,具备系统最高权限。在实际业务管理中,为了避免系统管理员拥有过度集中的权利带来高风险,可以设置三权分立,将系统管理员的CREATEROLE属性和AUDITADMIN属性权限分别给安全管理员和审计管理员。
系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN和LOGIN。
系统权限可以在创建、修改角色或者用户时进行授权,CREATE/ALTER ROLE/USER user_name [WITH] option语句的option中,可以设置以下字段,来实现系统权限赋权。
决定一个新角色是否为“系统管理员”,具有SYSADMIN属性的角色拥有系统最高权限。缺省为NOSYSADMIN。
定义角色是否有审计管理属性。缺省为NOAUDITADMIN。
决定一个新角色是否能创建数据库。新角色没有创建数据库的权限。缺省为NOCREATEDB。
决定一个角色是否可以创建新角色(也就是执行CREATE ROLE和CREATE USER)。 一个拥有CREATEROLE权限的角色也可以修改和删除其他角色。缺省为NOCREATEROLE。
具有LOGIN属性的角色才可以登录数据库。一个拥有LOGIN属性的角色可以认为是一个用户。缺省为NOLOGIN。
数据对象包括表和视图、指定字段、数据库、函数、模式等,对它们的创建、增、删、改、查等操作就是数据对象权限。授权语法格式为:GRANT [privileges] ON [objects] TO [users],回收权限语法格式为REVOKE [privileges] ON [objects] FROM [users]。
将一个角色或用户的权限授予一个或多个其他角色或用户。被授权的角色或用户就拥有授权的角色或用户的权限。当声明了WITH ADMIN OPTION,被授权的用户可以将该权限再次授予其他角色或用户,以及撤销所有由该角色或用户继承到的权限。当授权的角色或用户发生变更或被撤销时,所有继承该角色或用户权限的用户拥有的权限都会随之发生变更。语法格式为GRANT role TO user。
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集群版本支持。 |
审计是指记录用户的登陆退出以及登陆后在数据库里的行为操作,使得数据库安全管理员可以利用这些日志信息,找出非法操作的用户,时间和内容等。
要使数据库能够审计到某项功能,需要打开审计的总开关(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等。 |
审计查询命令是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 |
数据安全展示:数据脱敏、行级访问控制。
数据安全存储:数据存储加密、透明加密。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。