写点什么

详解数仓的 3A 安全能力

  • 2024-05-07
    广东
  • 本文字数:3512 字

    阅读完需:约 12 分钟

详解数仓的3A安全能力

本文分享自华为云社区《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 记录组成:



一条 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 sha256host 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]。


3.3 用户权限

3.3.1 用户权限授权


将一个角色或用户的权限授予一个或多个其他角色或用户。被授权的角色或用户就拥有授权的角色或用户的权限。当声明了 WITH ADMIN OPTION,被授权的用户可以将该权限再次授予其他角色或用户,以及撤销所有由该角色或用户继承到的权限。当授权的角色或用户发生变更或被撤销时,所有继承该角色或用户权限的用户拥有的权限都会随之发生变更。语法格式为 GRANT role TO user。

3.3.2 预置角色


GaussDB(DWS)提供了一组预置角色,以“gs_role_”开头命名,这些预置角色具有一些固定的权限。当某些用户需要进行相关操作,只需要把预置角色授给用户即可。目前 GaussDB(DWS)的预置角色如下表:


4.Audit——审计


审计是指记录用户的登陆退出以及登陆后在数据库里的行为操作,使得数据库安全管理员可以利用这些日志信息,找出非法操作的用户,时间和内容等。

4.1 设置审计配置项


要使数据库能够审计到某项功能,需要打开审计的总开关(audit_enabled)和对应的审计项开关(audit_operation_exec),二者均支持动态加载,在数据库运行期间修改该配置项的值会立即生效,无需重启数据库。


有两点需要注意,其一如果审计 ddl 操作,需要另外配置 audit_system_object 来审计具体某个对象的 ddl 操作;其二如果是审计事务,事务内部的操作是否审计需要结合其具体的配置项是否配置。审计项的参数控制:


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 existspostgres=# 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+08endtime         | 2021-03-21 11:49:41.652+08operation_type  | ddlaudit_type      | ddl_tableresult          | failedusername        | perfadmdatabase        | postgresclient_conninfo | gsql@[local]object_name     | t1command_text    | create table t1(id int);detail_info     | relation "t1" already existstransaction_xid | 0query_id        | 1062177node_name       | cn_5001thread_id       | 139916885260032@669613657906735local_port      | 6000remote_port     | 
复制代码

5. 其他数据仓库安全技术


数据安全展示:数据脱敏、行级访问控制。


数据安全存储:数据存储加密、透明加密。


点击关注,第一时间了解华为云新鲜技术~

发布于: 29 分钟前阅读数: 5
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
详解数仓的3A安全能力_数据库_华为云开发者联盟_InfoQ写作社区