passwordcheck 插件说明

1. 概述

passwordcheck 用于在创建用户或修改用户密码时检查密码是否符合预设安全策略。 当密码不满足要求时,数据库会拒绝该操作并返回错误信息。

该插件适用于以下场景:

  • 企业数据库统一口令策略

  • 多用户数据库环境的弱口令管控

  • 对密码长度和复杂度有明确要求的业务系统

插件主要在以下语句执行时触发:

  • CREATE USER

  • CREATE ROLE ... LOGIN

  • ALTER USER ... PASSWORD

  • ALTER 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 性能影响很小。

主要开销来自:

  • 密码长度与字符类别统计

  • 用户名包含关系判断