数据库安全策略即根据用户的需要,建立规则等方面的限制来制定的安全指导方针,有助于保证数据库的使用安全
1.设置帐户安全策略
- PanWeiDB 为帐户提供了自动锁定和解锁帐户、手动锁定和解锁异常帐户等一系列的安全措施,保证数据安全。
1.1 自动锁定和解锁帐户
- 为了保证帐户安全,如果用户输入密码次数超过一定次数(failed_login_attempts),系统将自动锁定该帐户。次数设置越小越安全,但是在使用过程中会带来不便。
- 当帐户被锁定时间超过设定值(password_lock_time),则当前帐户自动解锁。时间设置越长越安全,但是在使用过程中会带来不便。
- 参数 password_lock_time 的取值范围:整型,最小值为 1,最大值为 525600,单位为分钟。
- 参数 failed_login_attempts 的取值范围:整型,最小值为 1,最大值为 1000。
- 参数 failed_login_attempts 表示在任意时候,如果输入密码错误的次数达到设定值则当前帐户被锁定,password_lock_time分钟后被自动解锁。因此,只有两个配置参数都为正数时,才可以进行常规的密码失败检查、帐户锁定和解锁操作。
1.2 配置 failed_login_attempts 参数
- 1)omm用户登录数据库主节点。
postgres=# show failed_login_attempts;
failed_login_attempts
-----------------------
5
(1 row)
- 2)执行以下命令修改为 3次
gs_guc reload -I all -N all -c "failed_login_attempts=3"
1.3 配置 password_lock_time 参数
- 1)omm用户登录数据库主节点。
postgres=# show password_lock_time;
password_lock_time
--------------------
1440
(1 row)
- 2)执行以下命令修改为 2分钟
gs_guc reload -I all -N all -c "password_lock_time=2"
1.4 手动锁定和解锁帐户
- 若管理员发现某帐户被盗、非法访问等异常情况,可手动锁定该帐户。当管理员认为帐户恢复正常后,可手动解锁该帐户。
- 以手动锁定和解锁用户 u1 为例,命令格式如下:
- 手动锁定
postgres=# ALTER USER u1 ACCOUNT LOCK;
- 手动解锁
postgres=# ALTER USER u1 ACCOUNT UNLOCK;
1.5 用户锁定测试
- 1)新建用户
postgres=# create user test with password 'qweASD#123';
CREATE ROLE
- 2)查看账号状态
postgres=# SELECT a.usename,b.failcount,b.locktime,b.rolstatus FROM pg_user a,pg_user_status b WHERE a.usesysid=b.roloid and a.usename='test';
usename | failcount | locktime | rolstatus
---------+-----------+-------------------------------+-----------
test | 0 | 2024-11-25 19:04:52.266766+08 | 0
pg_user_status列名解释:
1)failcount 尝试失败次数。
2)locktime 默认显示角色创建时间,如果角色被管理员锁定或者登录失败次数超过阈值被锁定,则显示角色被锁定的时间
3)rolstatus 角色的状态。
0:正常状态。
1:由于登录失败次数超过阈值被锁定了一定的时间。
2:被管理员锁定。
- 3)尝试输错3次密码
postgres=# \c postgres test
Password for user test:
FATAL: Invalid username/password,login denied.
Previous connection kept
- 4)再次查看状态,用户状态为 1
postgres=# SELECT a.usename,b.failcount,b.locktime,b.rolstatus FROM pg_user a,pg_user_status b WHERE a.usesysid=b.roloid and a.usename='test';
usename | failcount | locktime | rolstatus
---------+-----------+-------------------------------+-----------
test | 3 | 2024-11-25 19:26:37.038099+08 | 1
(1 row)
postgres=# \c postgres test
Password for user test:
FATAL: The account has been locked.
Previous connection kept
- 5)等待两分钟,自动解锁后,再次查看用户状态,恢复正常
postgres=# select now();
now
-------------------------------
2024-11-25 19:28:40.813186+08
(1 row)
postgres=# SELECT a.usename,b.failcount,b.locktime,b.rolstatus FROM pg_user a,pg_user_status b WHERE a.usesysid=b.roloid and a.usename='test';
usename | failcount | locktime | rolstatus
---------+-----------+-------------------------------+-----------
test | 0 | 2024-11-25 19:26:37.038099+08 | 0
(1 row)
- 6)手动锁定用户,查看用户状态为 2
postgres=# alter user test account lock;
ALTER ROLE
postgres=# SELECT a.usename,b.failcount,b.locktime,b.rolstatus FROM pg_user a,pg_user_status b WHERE a.usesysid=b.roloid and a.usename='test';
usename | failcount | locktime | rolstatus
---------+-----------+-------------------------------+-----------
test | 0 | 2024-11-25 19:29:31.307115+08 | 2
(1 row)
2.密码安全策略
- 用户密码存储在系统表 pg_authid 中,为防止用户密码泄露,PanWeiDB 对用户密码进行加密存储,所采用的加密算法由配置参数password_encryption_type 决定。
- 当参数 password_encryption_type 设置为 0 时,表示采用 md5 方式对密码加密。MD5 加密算法安全性低,存在安全风险,不建议使用。
- 当参数 password_encryption_type 设置为 1 时,表示采用 sha256 和md5 方式对密码加密。
- 当参数 password_encryption_type 设置为 2 时,表示采用 sha256 方式对密码加密。
- 当参数 password_encryption_type 设置为 3 时,表示采用 sm3 方式对密码加密。
postgres=# show password_encryption_type;
password_encryption_type
--------------------------
1
(1 row)
3.配置密码安全参数
3.1 密码复杂度
- 初始化数据库、创建用户、修改用户时需要指定密码。密码必须要符合复杂度 password_policy 的要求,否则会提示用户重新输入密码。
- 参数 password_policy 设置为 1 时表示采用密码复杂度校验。
- 参数 password_policy 设置为 2 时启用密码复杂度校验,且密码需满足四类字符中的四类。
- 参数 password_policy 设置为 0 时表示不采用密码复杂度校验,但需满足密码不能为空并且只包含有效字符,有效字符范围为大写字母(A-Z)、小写字母(a-z)、数字(0-9)及特殊字符。设置为 0会存在安全风险,不建议设置为 0。
postgres=# show password_policy;
password_policy
-----------------
1
(1 row)
3.2 帐户密码的复杂度要求
- 包含大写字母(A-Z)的最少个数(password_min_uppercase)
- 包含小写字母(a-z)的最少个数(password_min_lowercase)
- 包含数字(0-9)的最少个数(password_min_digital)
- 包含特殊字符的最少个数(password_min_special)
- 密码的最小长度(password_min_length)
- 密码的最大长度(password_max_length)
- 至少包含上述四类字符中的三类。
- 不能和用户名、用户名倒写相同,本要求为非大小写敏感
- 不能和当前密码、当前密码的倒写相同。
- 不能是弱口令。
- 弱口令指的是强度较低,容易被破解的密码,对于不同的用户或群体,弱口令的定义可能会有所区别,用户需自己添加定制化的弱口令。
- 弱口令字典中的口令存放在 gs_global_config 系统表中,当创建用户、修改用户需要设置密码时,系统将会把用户设置口令和弱口令字典中存放的口令进行对比,如果符合,则会提示用户该口令为弱口令,设置密码失败。
- 弱口令字典默认为空,用户通过以下语法可以对弱口令字典进行增加和删除,示例如下:
postgres=# CREATE WEAK PASSWORD DICTIONARY WITH VALUES ('password1'), ('password2');
CREATE WEAK PASSWORD DICTIONARY
postgres=# select * from gs_global_config;
name | value
---------------+-----------
weak_password | password1
weak_password | password2
(2 rows)
- 用户修改密码时,只有超过不可重用天数 password_reuse_time 或不可重用次数 password_reuse_max 的密码才可以使用。这两个参数值越大越安全,但是在使用过程中会带来不便。用户可以根据需要重新设置参数,提高安全等级。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




