passwordcheck 插件说明
1. 概述
passwordcheck 用于在创建用户或修改用户密码时检查密码是否符合预设安全策略。
当密码不满足要求时,数据库会拒绝该操作并返回错误信息。
该插件适用于以下场景:
企业数据库统一口令策略
多用户数据库环境的弱口令管控
对密码长度和复杂度有明确要求的业务系统
插件主要在以下语句执行时触发:
CREATE USERCREATE ROLE ... LOGINALTER USER ... PASSWORDALTER ROLE ... PASSWORD
2. 主要功能
passwordcheck 提供以下能力:
密码最小长度检查
字母数量检查
数字数量检查
特殊字符数量检查
密码中是否包含用户名检查
通过统一的密码策略控制,可以有效降低弱口令带来的安全风险。
3. 配置参数
插件通过 GUC 参数控制行为,支持以下参数:
| 参数名 | 类型 | 取值范围 | 默认值 | 生效级别 | 说明 |
|---|---|---|---|---|---|
passwordcheck.enable |
bool |
true / false |
false |
SIGHUP |
是否启用密码检查 |
passwordcheck.password_length |
int |
8 - 63 |
8 |
SIGHUP |
密码最小长度 |
passwordcheck.password_condition_letter |
int |
2 - 61 |
2 |
SIGHUP |
密码中至少包含的字母个数 |
passwordcheck.password_condition_digit |
int |
2 - 61 |
2 |
SIGHUP |
密码中至少包含的数字个数 |
passwordcheck.password_condition_punct |
int |
0 - 59 |
0 |
SIGHUP |
密码中至少包含的特殊字符个数 |
4. 启用插件
在配置文件中加入:
shared_preload_libraries = 'passwordcheck'
修改完成后,重启数据库实例使配置生效。
例如:
systemctl restart unvdb
或:
pg_ctl restart -D /path/to/pgdata
插件加载后,还需要显式开启密码检查:
ALTER SYSTEM SET passwordcheck.enable = true;
SELECT pg_reload_conf();
5. 配置示例
5.1 启用默认规则
默认规则如下:
最小长度:
8最少字母数:
2最少数字数:
2最少特殊字符数:
0
ALTER SYSTEM SET passwordcheck.enable = true;
ALTER SYSTEM SET passwordcheck.password_length = 8;
ALTER SYSTEM SET passwordcheck.password_condition_letter = 2;
ALTER SYSTEM SET passwordcheck.password_condition_digit = 2;
ALTER SYSTEM SET passwordcheck.password_condition_punct = 0;
SELECT pg_reload_conf();
5.2 设置更严格的规则
例如:
最小长度:
12最少字母数:
3最少数字数:
2最少特殊字符数:
1
ALTER SYSTEM SET passwordcheck.enable = true;
ALTER SYSTEM SET passwordcheck.password_length = 12;
ALTER SYSTEM SET passwordcheck.password_condition_letter = 3;
ALTER SYSTEM SET passwordcheck.password_condition_digit = 2;
ALTER SYSTEM SET passwordcheck.password_condition_punct = 1;
SELECT pg_reload_conf();
6. 使用示例
6.1 创建用户
合法密码
CREATE USER lxs_u WITH PASSWORD 'ab123456';
在默认配置下,该密码满足以下条件:
长度不少于
8至少包含
2个字母至少包含
2个数字
密码过短
CREATE USER lxs_u WITH PASSWORD 'abc1234';
报错示例:
ERROR: password is too short, minimum length is 8
密码包含用户名
CREATE USER lxs_u WITH PASSWORD 'abc_lxs_u_123';
报错示例:
ERROR: password must not contain user name
字母不足
CREATE USER lxs_u WITH PASSWORD '12345678';
报错示例:
ERROR: password must contain at least 2 letter(s)
数字不足
CREATE USER lxs_u WITH PASSWORD 'abcdefgh';
报错示例:
ERROR: password must contain at least 2 digit(s)
特殊字符不足
如果配置如下:
ALTER SYSTEM SET passwordcheck.password_condition_punct = 1;
SELECT pg_reload_conf();
再执行:
CREATE USER lxs_u WITH PASSWORD 'ab123456';
报错示例:
ERROR: password must contain at least 1 special character(s)
6.2 修改密码
非法密码
ALTER USER lxs_u WITH PASSWORD '12345678';
报错示例:
ERROR: password must contain at least 2 letter(s)
合法密码
ALTER USER lxs_u WITH PASSWORD 'Abc12345!';
如果当前配置满足该密码条件,则密码修改成功。
7. 查看当前配置
可以通过以下命令查看当前参数状态:
SHOW passwordcheck.enable;
SHOW passwordcheck.password_length;
SHOW passwordcheck.password_condition_letter;
SHOW passwordcheck.password_condition_digit;
SHOW passwordcheck.password_condition_punct;
8. 性能说明
该插件仅在设置密码时触发,不参与普通查询执行,因此对日常业务 SQL 性能影响很小。
主要开销来自:
密码长度与字符类别统计
用户名包含关系判断