【云小课】EI第24课 GaussDB(DWS)数据落盘安全吗?来直面三大灵魂拷问!

GaussDB(DWS)作为一款运行在华为云上的核心数据仓库,客户大量的数据存储在DWS的数据节点中,DWS不仅拥有海量数据查询的极致性能,在安全方面还需要有加固防护措施。

当前数据库都是多个用户共同访问数据,这些数据都具有重要价值,关系到用户的核心资产和用户隐私,如何禁止别有用心的用户窃取以及黑客攻击,本课程给您提供数据的安全管理方法。

云小课插图.jpg

云数仓安全层层防护

  • 云数仓外部:由华为云的云安全管理产品保驾护航。如:Anti-DDoS、DDoS、Web应用防火墙、漏洞扫描服务、企业主机安全、数据加密服务、SSL证书管理、云堡垒机等。

  • 云数仓内部:主要通过三权分立、行级访问控制、审计管理三种方式进行防护。这三方式结合到数据开发实际场景中,简单可以概括为(1)谁能看?(2)能看啥?(3)看没看? 下面我们从这三个方面一一介绍:

(1)谁能看?

通过DWS三权分立模型,将管理员分成三类:系统管理员,安全管理员和审计管理员,不存在“一手遮天”的管理员,当某个管理员密码泄露时,使数据库破坏降到最低。从此各司其职,安全管理员负责用户审计管理员负责日志审计系统管理员负责系统运维

表1 三权分立

管理员名称

能否创建用户

能否查看审计日志

是否有系统管理员权限

系统管理员

安全管理员

审计管理员


开启三权分立后,对象权限变化如下表说明:

表1 未开启三权分立

对象名称

系统管理员

安全管理员|审计管理员

表空间

对表空间有创建、修改、删除、访问、分配操作的权限。

不具有对表空间进行创建、修改、删除、分配的权限,访问需要被赋权。

对所有表有所有的权限。

仅对自己的表有所有的权限,对其他用户的表无权限。

索引

可以在所有的表上建立索引。

仅可以在自己的表上建立索引。

模式

对所有模式有所有的权限。

仅对自己的模式有所有的权限,对其他用户的模式无权限。

函数

对所有的函数有所有的权限。

仅对自己的函数有所有的权限,对其他用户放在public这个公共模式下的函数有调用的权限,对其他用户放在其他模式下的函数无权限。

自定义视图

对所有的视图有所有的权限。

仅对自己的视图有所有的权限,对其他用户的视图无权限。

系统表和系统视图

可以查看所有系统表和视图。

只可以查看部分系统表和视图。


表1 开启三权分立

对象名称

系统管理员

安全管理员|审计管理员

表空间

无变化

无变化。

权限缩小。只对自己的表有所有权限,对其他用户放在属于各自模式下的表无权限。

无变化。

索引

权限缩小。只可以在自己的表上建立索引。

无变化。

模式

权限缩小。只对自己的模式有所有的权限,对其他用户的模式无权限。

无变化。

函数

权限缩小。只对自己的函数有所有的权限,对其他用户放在属于各自模式下的函数无权限。

无变化。

自定义视图

权限缩小。只对自己的视图及其他用户放在public模式下的视图有所有的权限,对其他用户放在属于各自模式下的视图无权限。

无变化。

系统表和系统视图

无变化。

无变化。


开启方法:

  1. 录GaussDB(DWS) 管理控制台。在左侧导航树中,单击集群管理

  2. 在集群列表中,单击指定集群的名称,然后单击安全设置,打开三权分立开关。

    依次设置安全管理员用户名、密码、审计管理员用户、密码。

  3. 单击应用。在弹出的保存配置窗口中,选择是否勾选立即重启集群,然后单击,重启后生效。

(2)能看啥?

行级访问控制特性是将数据库访问控制精确到数据表行级别,使数据库达到行级访问控制的能力。不同用户执行相同的SQL查询操作,读取到的结果是不同的。即同一张表,不同用户只能查看自身相关的数据信息,不能查看其他用户的数据信息。

GaussDB(DWS)主要通过“ALTER TABLE tablename ENABLE ROW LEVEL SECURITY”语法实现行级访问控制,示例如下:

  1. 创建用户alice, bob, peter。

    CREATE ROLE alice PASSWORD 'Gauss@123';
    CREATE ROLE bob PASSWORD 'Gauss@123';
    CREATE ROLE peter PASSWORD 'Gauss@123';

  2. 创建表public.all_data,包含不同用户数据信息。

    CREATE TABLE public.all_data(id int, role varchar(100), data varchar(100));
  3. 向数据表插入数据。

    INSERT INTO all_data VALUES(1, 'alice', 'alice data');
    INSERT INTO all_data VALUES(2, 'bob', 'bob data');
    INSERT INTO all_data VALUES(3, 'peter', 'peter data');

  4. 将表all_data的读取权限赋予alice,bob和peter用户。

    GRANT SELECT ON all_data TO alice, bob, peter;
  5. 打开行访问控制策略开关。

    ALTER TABLE all_data ENABLE ROW LEVEL SECURITY;
  6. 创建行访问控制策略,当前用户只能查看用户自身的数据。

    CREATE ROW LEVEL SECURITY POLICY all_data_rls ON all_data USING(role = CURRENT_USER);
  7. 查看表详细信息。

     \d+ all_data
                                   Table "public.all_data"
     Column |          Type          | Modifiers | Storage  | Stats target | Description
    --------+------------------------+-----------+----------+--------------+-------------
     id     | integer                |           | plain    |              |
     role   | character varying(100) |           | extended |              |
     data   | character varying(100) |           | extended |              |
    Row Level Security Policies:
        POLICY "all_data_rls"
          USING (((role)::name = "current_user"()))
    Has OIDs: no
    Distribute By: HASH(id)
    Location Nodes: ALL DATANODES
    Options: orientation=row, compression=no, enable_rowsecurity=true

  8. 切换至用户alice,执行SQL"SELECT * FROM all_data"

    SET ROLE alice PASSWORD 'Gauss@123';
    SELECT * FROM all_data;
     id | role  |    data
    ----+-------+------------
      1 | alice | alice data
    (1 row)
    
    EXPLAIN(COSTS OFF) SELECT * FROM all_data;
                               QUERY PLAN
    ----------------------------------------------------------------
     Streaming (type: GATHER)
       Node/s: All datanodes
       ->  Seq Scan on all_data
             Filter: ((role)::name = 'alice'::name)
     Notice: This query is influenced by row level security feature
    (5 rows)

  9. 切换至用户peter,执行SQL"SELECT * FROM .all_data"

    SET ROLE peter PASSWORD 'Gauss@123';
    SELECT * FROM all_data;
     id | role  |    data
    ----+-------+------------
      3 | peter | peter data
    (1 row)
    
     EXPLAIN(COSTS OFF) SELECT * FROM all_data;
                               QUERY PLAN
    ----------------------------------------------------------------
     Streaming (type: GATHER)
       Node/s: All datanodes
       ->  Seq Scan on all_data
             Filter: ((role)::name = 'peter'::name)
     Notice: This query is influenced by row level security feature
    (5 rows)


(3)看没看?

GaussDB(DWS) 支持对特定数据库操作记录审计日志,包括:日志保留策略、用户越权访问、存储过程以及对数据库对象的DML、SELECT、COPY和DDL操作。

审计日志配置后,当GaussDB(DWS) 集群状态异常,或根据业务需要,用户可以查询审计信息确定故障原因或定位历史操作记录。

配置方法:

  1. 登录GaussDB(DWS) 管理控制台。单击集群管理

  2. 在集群列表中,单击指定集群的名称,然后单击安全设置

  3. 审计配置区域中,设置审计日志保留策略。

    表1 审计日志保留策略

    参数名

    说明

    审计日志保留策略

    设置审计日志保留策略,支持如下两种策略:

    • 空间优先:表示当单个节点的审计日志超过1G后,将自动淘汰审计日志。

    • 时间优先:表示在审计日志最小保存时间(天)内会保留审计日志,超过时间后,根据存储容量限制(单个节点1G),对审计日志进行自动淘汰。

    审计日志最小保存时间(天)

    审计日志保留策略设置为时间优先策略时,该参数有效。

    可选天数为0~730天,默认值为90天。


  4. 根据需要设置以下操作的审计开关。

    表1 审计项

    参数名

    说明

    审计用户越权访问操作

    表示是否记录用户的越权访问操作,默认关闭。

    审计DML操作

    表示是否对数据表的INSERTUPDATEDELETE操作进行记录,默认关闭。

    审计SELECT操作

    表示是否对SELECT操作进行记录,默认关闭。

    审计存储过程执行

    表示是否在执行存储过程和自定义函数的时候记录操作信息,默认关闭。

    审计COPY操作

    表示是否对COPY操作进行记录,默认关闭。

    审计DDL操作

    表示是否对指定数据库对象的CREATEDROPALTER操作进行记录。除DatabaseSchemaUser默认启用记录,其他默认关闭。


    GaussDB(DWS) 默认还开启了以下的关键审计项。

    表1 关键审计项

    参数名

    说明

    关键审计项

    记录用户登录成功、登录失败和注销的信息。

    记录数据库启动、停止、恢复和切换审计信息。

    记录用户锁定和解锁功能信息。

    记录用户权限授予和权限回收信息。

    记录SET操作的审计功能。


  5. 设置是否开启审计日志转储功能。

  6. 单击应用

查看审计日志:

只有拥有AUDITADMIN属性的用户才有查看权限,查询格式如下:

pg_query_audit(timestamptz startime,timestamptz endtime,audit_log)

  1. 查询审计记录。

    SELECT * FROM pg_query_audit('2015-07-15 08:00:00','2015-07-15 09:47:33');
    查询结果如下:
              time          |     type      | result | username |    database    | client_conninfo |  object_name   |                          detail_info                | node_name |            thread_id            | local_port | remote_port
    ------------------------+---------------+--------+----------+----------------+-----------------+----------------+---------------------------------------------------------------+-----------+---------------------------------+------------+-------------
     2015-07-15 08:03:55+08 | login_success | ok     | dbadmin | gaussdb       | gs_clean@::1    | gaussdb       | login db(gaussdb) success,the current user is:dbadmin       | cn_5003   | 139808902997776@490233835920483 | 9000       | 55805

    该条记录表明,用户ommdbadmin在2021-02-23 21:49:57.82+08登录数据库gaussdb。其中client_conninfo字段在log_hostname启动且IP连接时,字符@后显示反向DNS查找得到的主机名。

  2. 查询所有CN节点审计记录。

    SELECT * FROM pgxc_query_audit('2019-01-10 17:00:00','2019-01-10 19:00:00') where type = 'login_success' and username = 'user1';
    

    查询结果如下:

              time          |     type      | result | username | database | client_conninfo | object_name |                     detail_info                      |  node_name   |            thread_id            | 
    local_port | remote_port 
    ------------------------+---------------+--------+----------+----------+-----------------+-------------+------------------------------------------------------+--------------+---------------------------------+-
    -----------+-------------
     2019-01-10 18:06:08+08 | login_success | ok     | user1    | gaussdb | gsql@[local]    | gaussdb    | login db(gaussdb) success,the current user is:user1 | coordinator1 | 139965149210368@600429968516954 | 
    17560      | null
     2019-01-10 18:06:22+08 | login_success | ok     | user1    | gaussdb | gsql@[local]    | gaussdb    | login db(gaussdb) success,the current user is:user1 | coordinator1 | 139965149210368@600429982697548 | 
    17560      | null
     2019-01-10 18:06:54+08 | login_success | ok     | user1    | gaussdb | gsql@[local]    | gaussdb    | login db(gaussdb) success,the current user is:user1 | coordinator2 | 140677694355200@600430014804280 | 
    17562      | null
    (3 rows)

    查询结果显示,用户user1在CN1和CN2的成功登录记录。


20200805-112140(eSpace).png了解更多华为云数据仓库GaussDB(DWS),请猛戳


(完)