云数据库 PostgreSQL 自定义密码复杂度

这篇说说腾讯云PostgreSQL自研插件tencentdb_pwdcheck,提供密码复杂度检查、认证失败延迟和订阅语句密码脱敏三项能力,并说明支持版本、参数配置及使用方法。默认策略要求密码长度8-32位且含大写、小写、数字、特殊字符各至少1个,超级用户不受限制。 密码检查:创建或修改用户时校验密码复杂度,不满足策略直接报错。 认证延迟:密码认证失败时延迟响应,增加暴力破解成本。 密码脱敏:订阅语句中的连接密码在日。

相关产品
云数据库 PostgreSQL 产品页,含版本规格、价格与购买入口。

tencentdb_pwdcheck 是腾讯云自研的密码安全插件,提供三项能力:

·密码复杂度检查:创建用户或修改密码时,校验密码长度及大写字母、小写字母、数字、特殊字符的组成,不满足策略直接报错。

·认证失败延迟:密码认证失败时延迟响应,增加暴力破解成本。

·订阅语句密码脱敏:CREATE/ALTER SUBSCRIPTION 语句中的连接密码在日志等处自动脱敏为 ********,防止明文密码落入日志。

一、支持版本

PostgreSQL 版本 支持版本
PostgreSQL 10 v10.17_r1.7及以上
PostgreSQL 11 v11.12_r1.6及以上
PostgreSQL 12 v12.7_r1.7及以上
PostgreSQL 13 v13.20_r1.23及以上
PostgreSQL 14 v14.17_r1.31及以上
PostgreSQL 15 v15.12_r1.17及以上
PostgreSQL 16 v16.8_r1.11及以上
PostgreSQL 17 v17.4_r1.5及以上
PostgreSQL 18 v18.0_r1.0及以上

注意:说明:

注意:你可在控制台实例详情页或执行 SHOW tencentdb_version; 查看当前实例的内核版本。

二、注意事项

·预加载插件:使用前请先在控制台参数设置页找到 shared_preload_libraries 参数,在其参数运行值中勾选 tencentdb_pwdcheck,保存后重启实例。

·默认不开启:加载插件后,还需在控制台参数设置页中开启参数 tencentdb_pwdcheck.enable_tencentdb_pwdcheck,密码检查才生效;订阅密码脱敏无需该开关,插件加载后即生效。

·超级用户不受约束:超级用户设置密码不受复杂度检查限制;管理员(tencentdb_superuser)与普通用户均受约束。

·仅接受明文密码:开启检查后,直接设置 md5 等已加密密码串将被拒绝。

三、参数说明

以下参数均为 SIGHUP 级,均可在控制台参数设置中修改,保存后自动生效,无需重启实例。

参数 默认值 说明
tencentdb_pwdcheck.enable_tencentdb_pwdcheck off 密码检查与认证延迟的总开关
tencentdb_pwdcheck.min_length 8 密码最小长度
tencentdb_pwdcheck.max_length 32 密码最大长度
tencentdb_pwdcheck.min_uppercase_number 1 至少包含的大写字母个数
tencentdb_pwdcheck.min_lowercase_number 1 至少包含的小写字母个数
tencentdb_pwdcheck.min_digit_number 1 至少包含的数字个数
tencentdb_pwdcheck.min_special_character_number 1 至少包含的特殊字符个数
tencentdb_pwdcheck.delay_milliseconds 0 认证失败时的延迟毫秒数

有效特殊字符包括:()`~!@#$%^&*-+=_|{}[]:;'<>,.?/(不含反斜杠 \\)。密码中出现其他字符(如空格、中文)将被直接拒绝。

四、使用方法

以下示例假设实例中已有管理员 root(tencentdb_superuser 成员),业务用户为 app_user。

五、1. 开启密码检查

插件加载后,还需开启功能开关(SIGHUP 级参数,修改后无需重启实例)。该参数需在控制台修改:

1.1 登录 云数据库 PostgreSQL 控制台。

1.2 在实例列表,单击实例 ID 或操作列的管理,进入实例详情页面。

1.3 选择参数设置。

1.4 搜索参数 tencentdb_pwdcheck.enable_tencentdb_pwdcheck,将其参数运行值修改为 on 并保存。

开启后,可通过以下语句确认参数状态:

postgres=# SHOW tencentdb_pwdcheck.enable_tencentdb_pwdcheck; tencentdb_pwdcheck.enable_tencentdb_pwdcheck———————————————- on(1 row)

未开启时,弱密码可正常设置(对照):

postgres=# CREATE USER app_user PASSWORD 'weak';CREATE ROLE

六、2. 密码复杂度校验效果

超级用户设置弱密码不受限制:

postgres=# ALTER USER app_user PASSWORD '123';ALTER ROLE

管理员设置密码时受策略约束,以下用例依次演示各类不合规密码的报错,以及合规密码通过:

root=> ALTER USER app_user PASSWORD 'asd';ERROR: Password too short. Minimum length is 8.root=> ALTER USER app_user PASSWORD 'abcdsdefg';ERROR: password need at least 1 uppercase letterroot=> ALTER USER app_user PASSWORD 'Aassdsaddb@';ERROR: password need at least 1 digitroot=> ALTER USER app_user PASSWORD 'Aassadasddb11';ERROR: password need at least 1 special characterroot=> ALTER USER app_user PASSWORD 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';ERROR: Password too long. Maximum length is 32.root=> ALTER USER app_user PASSWORD 'md5e589150ae7d28f93333afae92b36ef48';ERROR: Cannot use tencentdb_pwdcheck extension while using encrypted passwordroot=> ALTER USER app_user PASSWORD 'Aassadasddb11#$';ALTER ROLE

默认策略为:长度8 ~ 32,且至少包含1个大写字母、1个小写字母、1个数字、1个特殊字符。

七、3. 自定义密码策略

各策略参数均可在控制台参数设置中修改。下面以将最小密码长度从默认8调整为12为例进行演示:

3.1 登录 云数据库 PostgreSQL 控制台。

3.2 在实例列表,单击实例 ID 或操作列的管理,进入实例详情页面。

3.3 选择参数设置。

3.4 搜索参数 tencentdb_pwdcheck.min_length,将其参数运行值修改为 12 并保存。

保存后策略立即生效,长度不足12的密码将被拒绝:

root=> ALTER USER app_user PASSWORD 'AAaa11$$';ERROR: Password too short. Minimum length is 12.root=> ALTER USER app_user PASSWORD 'AAaa11$$abcd';ALTER ROLE

八、4. 订阅语句密码脱敏

CREATE SUBSCRIPTION 语句的连接串中包含发布端密码。插件加载后,该语句在数据库日志、错误详情等位置展示时,密码自动脱敏。

执行一条订阅语句(发布端地址不可达,仅用于演示):

postgres=# CREATE SUBSCRIPTION sub_testCONNECTION 'host=127.0.0.1 port=1 dbname=postgres user=replicator password=Secret@123'PUBLICATION pub_test;ERROR: subscription "sub_test" could not connect to the publisher: connection to server at "127.0.0.1", port 1 failed: Connection refused Is the server running on that host and accepting TCP/IP connections?

查看数据库日志(pg_log 目录),记录的语句中密码已脱敏为 ********:

2026-10-14 16:31:12.816 CST [4151291] LOG: statement: CREATE SUBSCRIPTION sub_test CONNECTION 'user=replicator password=******** dbname=postgres host=127.0.0.1 port=1' PUBLICATION pub_test;

ALTER SUBSCRIPTION 语句同样受脱敏保护。

九、5. 认证失败延迟

在控制台参数设置中将 tencentdb_pwdcheck.delay_milliseconds 设置为大于0的值后,密码认证失败的连接将延迟响应,用于增加暴力破解成本。实测(错误密码连接,delay 设为2000ms):延迟生效后单次失败连接耗时约2.010秒,未设置延迟(0ms)时约0.009秒。该参数仅影响认证失败的连接,正常登录无感知。

十、Q1:设置密码没有触发复杂度检查怎么排查?

A:请依次确认:shared_preload_libraries 参数已勾选 tencentdb_pwdcheck 并重启;tencentdb_pwdcheck.enable_tencentdb_pwdcheck 参数为 on;当前操作用户不是超级用户。

十一、Q2:为什么设置 md5 加密密码串会报错?

A:开启检查后插件只接受明文密码,由数据库完成加密存储,无法校验预先加密的密码串。

十二、Q3:密码中可以使用反斜杠吗?

A:不可以。反斜杠不在有效特殊字符范围内,包含反斜杠的密码将被拒绝。

十三、Q4:认证失败延迟会影响正常登录吗?

A:不会。延迟仅在密码认证失败时触发,认证成功的连接不产生任何延迟。

十四、相关参考

PostgreSQL 密码检查插件说明

赞 (0)
上一篇 4天前
下一篇 4天前