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 $$
BEGINIF 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 $$ BEGININSERT INTO password_change_auditVALUES (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; doif check_weak_password.sh $user; thenecho "Weak password found for $user"fi done
passwordcheck
提供了基礎的密碼策略實施能力,對于大多數環境已經足夠。對于更高安全要求的場景,建議通過自定義擴展或集成外部認證系統來增強功能。