PostgreSQL的扩展 passwordcheck
passwordcheck
是 PostgreSQL 内置的一个密码复杂度检查扩展,用于强制实施基本的密码策略。
一、扩展概述
- 功能:在创建或修改用户密码时检查密码复杂度
- 目的:防止使用过于简单的密码
- 适用版本:PostgreSQL 9.1+
- 检查内容:
- 密码长度
- 是否包含数字和字母
- 是否与用户名相同
- 基本字典检查
二、安装与启用
1. 安装方法
-- 安装扩展(需要超级用户权限)
CREATE EXTENSION passwordcheck;
-- 验证安装
SELECT * FROM pg_available_extensions WHERE name = 'passwordcheck';
2. 配置参数
在 postgresql.conf
中可配置:
# 最小密码长度(默认8)
passwordcheck.min_length = 10
# 是否要求混合大小写(默认off)
passwordcheck.mixed_case = on
# 是否要求数字(默认on)
passwordcheck.require_digit = on
三、密码策略检查内容
基本规则:
- 密码长度 ≥ 8字符(可配置)
- 不能与用户名相同
- 不能包含用户名
复杂度要求:
- 至少包含1个字母和1个数字
- 可选:要求大小写混合
- 检查常见弱密码(如’password’、'123456’等)
错误示例:
-- 密码太短 ALTER USER test WITH PASSWORD 'abc123'; -- 错误: password is too short -- 密码与用户名相同 CREATE USER demo WITH PASSWORD 'demo'; -- 错误: password must not contain user name
四、生产环境配置建议
1. 推荐配置
# postgresql.conf
passwordcheck.min_length = 12
passwordcheck.mixed_case = on
passwordcheck.require_digit = on
passwordcheck.special_chars = on # 如扩展支持
2. 自定义字典检查
创建自定义字典文件:
echo -e "company\n2023\nqwerty" > /etc/postgresql/common_passwords.txt chown postgres:postgres /etc/postgresql/common_passwords.txt
修改扩展代码(需要重新编译):
// 在passwordcheck.c中添加自定义字典路径 #define CUSTOM_DICT_FILE "/etc/postgresql/common_passwords.txt"
五、扩展限制与解决方案
现有限制
- 仅在校验密码更改时生效
- 检查规则相对简单
- 不支持正则表达式等复杂规则
增强方案
方案1:使用pgcrypto扩展+触发器
CREATE OR REPLACE FUNCTION check_password_complexity()
RETURNS event_trigger AS $$
BEGIN
IF tg_tag = 'ALTER ROLE' THEN
-- 从pg_event_trigger_ddl_commands()获取密码
-- 添加自定义复杂度检查逻辑
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE EVENT TRIGGER enforce_password_policy
ON ddl_command_end
WHEN TAG IN ('ALTER ROLE')
EXECUTE FUNCTION check_password_complexity();
方案2:集成CrackLib
安装依赖:
apt-get install libcrack2-dev # Debian/Ubuntu yum install cracklib-devel # RHEL/CentOS
修改passwordcheck.c使用CrackLib:
#include <crack.h> // 在检查函数中添加 if (FascistCheck(password, CRACKLIB_DICTPATH) != NULL) { errmsg("password fails dictionary check"); }
六、与认证延迟结合使用
# 组合安全配置示例
# passwordcheck
passwordcheck.min_length = 10
passwordcheck.mixed_case = on
# auth_delay
auth_delay.milliseconds = 3000
auth_delay.failure_count = 5
# pg_hba.conf
hostssl all all all scram-sha-256
七、企业级密码策略实现
对于需要符合合规性要求(如PCI DSS、GDPR)的环境:
使用LDAP集成:
# postgresql.conf pam_service_name = 'postgresql-ldap' # /etc/pam.d/postgresql-ldap auth required pam_ldap.so password required pam_cracklib.so retry=3 minlen=15 difok=3
商业扩展方案:
- Cybertec Passwordcheck Plus
- EnterprisedB Advanced Password Policy
八、监控与审计
记录密码更改事件:
CREATE TABLE password_change_audit ( username text, change_time timestamp, client_ip text ); CREATE OR REPLACE FUNCTION log_password_change() RETURNS event_trigger AS $$ BEGIN INSERT INTO password_change_audit VALUES (current_user, now(), inet_client_addr()); END; $$ LANGUAGE plpgsql; CREATE EVENT TRIGGER password_audit ON ddl_command_end WHEN TAG IN ('ALTER ROLE') EXECUTE FUNCTION log_password_change();
定期检查弱密码:
# 使用pg_shadow和自定义检查脚本 psql -c "SELECT usename FROM pg_shadow" | while read user; do if check_weak_password.sh $user; then echo "Weak password found for $user" fi done
passwordcheck
提供了基础的密码策略实施能力,对于大多数环境已经足够。对于更高安全要求的场景,建议通过自定义扩展或集成外部认证系统来增强功能。