passwordcheck
是一个 contrib 模块,用于检查用户密码是否满足特定标准。
passwordcheck
在 PostgreSQL 9.0 中添加,为使用 Hook check_password_hook
的代码提供了一个示例实现。
用法
passwordcheck
通过包含在 shared_preload_libraries
中来激活。
目前,它执行有限范围的检查。特别是,它只能检查加密后的密码是否不匹配用户名(任何进一步的检查当然是不可能的),并且在实际安全环境中实用价值有限。鉴于 PostgreSQL 在管理密码有效性方面提供的功能相对有限,建议配置外部身份验证机制,如 GSSAPI、SSPI、LDAP 或 RADIUS。
从 PostgreSQL 18 开始,可以通过配置参数 passwordcheck.min_password_length
指定最小密码长度(以字节为单位,而非字符)。在 PostgreSQL 17 及更早版本中,最小长度硬编码为 8
字节。
变更历史
- PostgreSQL 18
passwordcheck.min_password_length
添加以允许指定最小密码长度(提交 f7e1b382)
- PostgreSQL 9.0
- 添加(提交 c742b795)
示例
passwordcheck
必须通过 shared_preload_libraries
启用
postgres=# SHOW shared_preload_libraries; shared_preload_libraries -------------------------- passwordcheck (1 row)
密码以纯文本形式提供的示例用法
postgres=# ALTER ROLE foo PASSWORD 'foo'; ERROR: password is too short postgres=# ALTER ROLE postgres PASSWORD 'postgres'; ERROR: password must not contain user name postgres=# ALTER ROLE foo PASSWORD 'foobar'; ERROR: password must not contain user name postgres=# ALTER ROLE foo PASSWORD 'boobarbaz'; ERROR: password must contain both letters and nonletters
当密码以加密格式提供时,只能进行一个简单的检查,即密码是否与用户名匹配
postgres=# ALTER ROLE foo ENCRYPTED PASSWORD 'SCRAM-SHA-256$4096:eUHVJZ5WSsEomBt9BgHJzQ==$x57IR2ZcoKl8tlz5I2w636bquX3JmCYmi4LlDIa5lIY=:viXV52BLraOFRaw1gCp22K9VgLe6Rvi1nvcWNR6PTe4='; ERROR: password must not equal user name
其他密码将按原样接受;这里将值 foobar
(以明文形式会被拒绝)作为加密密码传递
postgres=# ALTER ROLE foo ENCRYPTED PASSWORD 'SCRAM-SHA-256$4096:aiSTMi/J+KkJa9WFMgiahg==$f//pUq3yGJ6E8UbCxJWcGvnylc0aNuZR6WuLAcYSzWA=:yzMz+l1TIAYQ28tdQ2YopKwQiIjMwpGAariL2jmeaxU='; ALTER ROLE
参考资料
- PostgreSQL documentation: passwordcheck