• 沒有找到結果。

1 | anny | *.*

2 | bob | *.*

3 | cici | (3 rows)

12. 无需为表emp设置敏感策略,删除脱敏策略mask_emp。

DROP REDACTION POLICY mask_emp ON emp;

7.2 设置安全策略

7.2.1 设置帐户安全策略

背景信息

GaussDB(DWS)为帐户提供了自动锁定和解锁帐户、手动锁定和解锁异常帐户和删除 不再使用的帐户等一系列的安全措施,保证数据安全。

自动锁定和解锁帐户

● 为了保证帐户安全,如果连接数据库时输入密码次数超过10次,系统将自动锁定 该帐户。

● 帐户被锁定时间超过1天后,自动解锁。

手动锁定和解锁帐户

若管理员发现某帐户被盗、非法访问等异常情况,可手动锁定该帐户。

当管理员认为帐户恢复正常后,可手动解锁该帐户。

以手动锁定和解锁用户joe为例,用户的创建请参见用户,命令格式如下:

● 手动锁定

ALTER USER joe ACCOUNT LOCK;

● 手动解锁

ALTER USER joe ACCOUNT UNLOCK;

删除不再使用的帐户

当确认帐户不再使用,管理员可以删除帐户。该操作不可恢复。

当删除的用户正处于活动状态时,此会话状态不会立马断开,用户在会话状态断开后 才会被完全删除。

以删除帐户joe为例,命令格式如下:

DROP USER joe CASCADE;

7.2.2 设置帐号有效期

注意事项

创建新用户时,需要限制用户的操作期限(有效开始时间和有效结束时间)。

不在有效操作期内的用户需要重新设定帐号的有效操作期。

操作步骤

步骤1 创建用户并制定用户的有效开始时间和有效结束时间。

CREATE USER joe WITH PASSWORD 'password' VALID BEGIN '2015-10-10 08:00:00' VALID UNTIL '2016-10-10 08:00:00';

步骤2 用户已不在有效使用期内,需要重新设定帐号的有效期,这包括有效开始时间和有效 结束时间。

ALTER USER joe WITH VALID BEGIN '2016-11-10 08:00:00' VALID UNTIL '2017-11-10 08:00:00';

----结束 说明

若在“CREATE ROLE”或“ALTER ROLE”语法中不指定“VALID BEGIN”,表示不对用户的开 始操作时间做限定;若不指定“VALID UNTIL”,表示不对用户的结束操作时间做限定;若两者 均不指定,表示该用户一直有效。

7.2.3 设置用户密码

用户密码存储在系统表pg_authid中,为防止用户密码泄露,GaussDB(DWS)对用户密 码进行加密存储。

● 密码复杂度

帐户密码的复杂度要求如下:

– 包含大写字母(A-Z)的个数为0~999,包含小写字母(a-z)的个数为 0~999,包含数字(0-9)的个数为0~999,包含特殊字符的个数为0~999

(特殊字符的列表请参见表7-3)。

说明

帐户密码至少包含上述四类字符中的三类。

– 密码的最小长度6,默认值为8。

– 密码的最大长度999,默认值为32。

– 不能和用户名、用户名倒写相同。

– 不能和当前密码、当前密码的倒写相同。

● 密码重用

用户修改密码时,只有持续未使用天数超过60天的历史密码才可以被重新使用。

● 密码有效期限

数据库用户的密码都有密码有效期(默认值为90天),当达到密码到期提醒天数

(7天)时,系统会在用户登录数据库时提示用户修改密码。

说明

考虑到数据库使用特殊性及业务连续性,密码过期后用户还可以登录数据库,但是每次登 录都会提示修改密码,直至修改为止。

● 密码修改

– 在安装数据库时,会新建一个和初始化用户重名的操作系统用户,为了保证 帐户安全,请定期修改操作系统用户的密码。

以修改用户user1密码为例,命令格式如下:

passwd user1

根据提示信息完成修改密码操作。

– 建议系统管理员和普通用户都要定期修改自己的帐户密码,避免帐户密码被 非法窃取。

以修改用户user1密码为例,使用管理员用户连接数据库并执行如下命令:

ALTER USER user1 IDENTIFIED BY "1234@abc" REPLACE "5678@def";

说明

1234@abc、5678@def分别代表用户user1的新密码和原始密码,这些密码要符合规 则,否则会执行失败。

– 管理员可以修改自己的或者其他帐户的密码。通过修改其他帐户的密码,解 决用户密码遗失所造成无法登录的问题。

以修改用户joe帐户密码为例,命令格式如下:

ALTER USER joe IDENTIFIED BY 'password';

说明

● 系统管理员之间不允许互相修改对方密码。

● 系统管理员可以修改普通用户密码且不需要用户原密码。

● 系统管理员可以修改自己的密码但需要管理员原密码。

● 密码验证

设置当前会话的用户和角色时,需要验证密码。如果输入密码与用户的存储密码 不一致,则会报错。

以设置用户joe为例,命令格式如下:

SET ROLE joe PASSWORD 'password';

7-3 特殊字符

编号 字符 编号 字符 编号 字符 编号 字符

1 ~ 9 * 17 | 25 <

2 ! 10 ( 18 [ 26 .

3 @ 11 ) 19 { 27 >

4 # 12 - 20 } 28 /

5 $ 13 _ 21 ] 29 ?

6 % 14 = 22 ; -

-7 ^ 15 + 23 : -

-8 & 16 \ 24 , -

-7.3 查看审计结果

前提条件

● 需要审计的审计项开关已开启。各审计项及其开启办法,请参考设置操作信息审 计章节。

● 数据库正常运行,并且对数据库执行了一系列增、删、改、查操作,保证在查询 时段内有审计结果产生。

● 数据库各个节点审计日志单独记录,如果使用了LVS负载管理机制,需根据LVS日 志追溯到具体的执行节点,并直接连接该节点查询相关审计日志。

背景信息

● 只有拥有AUDITADMIN属性的用户才可以查看审计记录。有关数据库用户及创建 用户的办法请参见用户。

● 审计查询命令是数据库提供的sql函数pg_query_audit,其原型为:

pg_query_audit(timestamptz startime,timestamptz endtime,audit_log)

参数startime和endtime分别表示审计记录的开始时间和结束时间,audit_log表示 所查看的审计日志信息所在的物理文件路径,当不指定audit_log时,默认查看连 接当前实例的审计日志信息。

通过sql函数pgxc_query_audit可以查询所有CN节点的审计日志,其原型为:

pgxc_query_audit(timestamptz startime,timestamptz endtime) 说明

startime和endtime的差值代表要查询的时间段,其有效值为从startime日期中的00:00:00 开始到endtime日期中的23:59:59之间的任何值。请正确指定这两个参数,否则将查不到需 要的审计信息。

操作步骤

步骤1 使用SQL客户端工具连接数据库。

步骤2 查询审计记录。

SELECT * FROM pg_query_audit('2021-02-23 21:49:00','2021-02-23 21:50:00');

查询结果如下:

begintime | endtime | operation_type | audit_type | result | username | database | client_conninfo | object_name | command_text | detail_info |

transaction_xid | query_id | node_name | thread_id | local_port | remote_port

---+---+---+---+---+---+--- +---+---+---+---+---+---+---+---+---+---q

2021-02-23 21:49:57.76+08 | 2021-02-23 21:49:57.82+08 | login_logout | user_login | ok | dbadmin | gaussdb | gsql@[local] | gaussdb | login db | login db(gaussdb) successfully, the current user is:

ommdbadmin | 0 | 0 | coordinator1 | 140324035360512@667403397820909 | 27777 |

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

步骤3 查询所有CN节点审计记录。

SELECT * FROM pgxc_query_audit('2021-02-23 22:05:00','2021-02-23 22:07:00') where audit_type = 'user_login' and username = 'user1';

查询结果如下:

begintime | endtime | operation_type | audit_type | result | username | database | client_conninfo | object_name | command_text | detail_info |

transaction_xid | query_id | node_name | thread_id | local_port | remote_port

---+---+---+---+---+---+--- +---+---+---+---

2021-02-23 22:06:22.219+08 | 2021-02-23 22:06:22.271+08 | login_lgout | user_login | ok | user1 | gaussdb | gsql@[local] | gaussdb | login db | login db(gaussdb) successfully, the current user is: user1

| 0 | 0 | coordinator2 | 140689577342720@667404382271356 | 27782 |

2021-02-23 22:05:51.697+08 | 2021-02-23 22:05:51.749+08 | login_lgout | user_login | ok | user1 | gaussdb | gsql@[local] | gaussdb | login db | login db(gaussdb) successfully, the current user is: user1

| 0 | 0 | coordinator1 | 140525048424192@667404351749143 | 27777 |

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

----结束

8 开发设计建议

8.1 开发设计建议概述

本开发设计建议约定数据库建模和数据库应用程序开发过程中,应当遵守的设计规 范。依据这些规范进行建模,能够更好的契合GaussDB(DWS)的分布式处理架构,输 出更高效的业务SQL代码。

本开发设计建议中所陈述的“建议”和“关注”含义如下:

● 建议:用户应当遵守的设计规则。遵守这些规则,能够保证业务的高效运行;违 反这些规则,将导致业务性能的大幅下降或某些业务逻辑错误。

● 关注:在业务开发过程中客户需要注意的细则。用于标识容易导致客户理解错误 的知识点(实际上遵守SQL标准的SQL行为),或者程序中潜在的客户不易感知的 默认行为。

8.2 数据库对象命名

数据库对象命名需要满足约束:长度不超过63个字符,以字母或下划线开头,中间字 符可以是字母、数字、下划线、$、#。

● 【建议】避免使用保留或者非保留关键字命名数据库对象。

说明

可以使用select * from pg_get_keywords()查询GaussDB(DWS)的关键字,或者在关键字 章节中查看。

● 【建议】避免使用双引号括起来的字符串来定义数据库对象名称,除非需要限制 数据库对象名称的大小写。数据库对象名称大小写敏感会使定位问题难度增加。

● 【建议】数据库对象命名风格务必保持统一。

– 增量开发的业务系统或进行业务迁移的系统,建议遵守历史的命名风格。

– 数据库对象名称由字母、数字和下划线组成,并且不能由数字开头。建议使 用多个单词组成,以下划线分割。

– 数据库对象名称最好能够望文知意,尽量避免使用自定义缩写(可以使用通 用的术语缩写进行命名)。例如,在命名中可以使用具有实际业务含义的英 文词汇或汉语拼音,但规则应该在集群范围内保持一致。

– 变量名的关键是要具有描述性,即变量名称要有一定的意义,变量名要有前 缀标明该变量的类型。

● 【建议】表对象的命名应该可以表征该表的重要特征。例如,在表对象命名时区 分该表是普通表、临时表还是非日志表:

– 普通表名按照数据集的业务含义命名。

– 临时表以“tmp_+后缀”命名。

– 非日志表以“ul_+后缀”命名。

– 外表以“f_+后缀”命名。

8.3 数据库对象设计

8.3.1 Database 和 Schema 设计

GaussDB(DWS)中可以使用Database和Schema实现业务的隔离,区别在于Database 的隔离更加彻底,各个Database之间共享资源极少,可实现连接隔离、权限隔离等,

Database之间无法直接互访。Schema隔离的方式共用资源较多,可以通过grant与 revoke语法便捷地控制不同用户对各Schema及其下属对象的权限。

● 从便捷性和资源共享效率上考虑,推荐使用Schema进行业务隔离。

● 建议系统管理员创建Schema和Database,再赋予相关用户对应的权限。