1 postgresql设置密码复杂度校验
1.1 默认密码校验策略
在PG中可以使用passwordcheck.so
模块实现密码复杂度校验的功能,不过这个工具的默认要求很低,只可用于简单的密码复杂度校验,默认检查规则如下:
- 密码长度大于8位
- 密码不能与用户名相同
- 密码必须包括字母和数字
1.1.1 passwordcheck密码校验
安装完PostgreSQL之后,默认是没有开启密码复杂度,为了数据库安全以及应对等保测评等要求,有时我们需要设置密码复杂度。
PostgreSQL支持通过动态库的方式扩展PG的功能,pg在使用这些功能时需要预加载相关的共享库。而密码复杂度可以通过预加载passwordcheck.so模块实现。
有几种设置可用于将共享库预加载到服务器中,如下:
- local_preload_libraries (string)
- session_preload_libraries (string)
- shared_preload_libraries (string)
下面介绍shared_preload_libraries (string)方式加载passwordcheck.so
模块,此模块可以检查密码,如果密码太弱,他会拒绝连接;创建用户或修改用户密码时,强制限制密码的复杂度,限制密码不能重复使用例如密码长度,包含数字,字母,大小写,特殊字符等,同时排除暴力破解字典中的字符串。
1.1.2 shared_preload_libraries 方式启用passwordcheck.so模块
在PG库的数据目录下(centos默认路径为:/var/lib/pgsql/11/data
,windows默认路径为:D:\PostgreSQL\11\data
)找到postgresql.conf
文件,修改
修改内容行为:shared_preload_libraries = 'passwordcheck' # (change requires restart)。
修改完成后重启服务服务生效(systemctl restart postgresql-11
)。
1.1.3 验证
1 | # 提示密码太短 |
1.2 增强密码校验策略
通过修改源代码实现。本文记录如何通过修改源码passwordcheck.c
达到增强复杂度检验的目的,修改后验证规则如下:
- 密码长度大于8位
- 密码不能与用户名相同
- 密码必须包括字母
- 密码必须包括数字
- 密码必须包括特殊字符
1.2.1 步骤
1.2.1.1 实验环境
实验环境:CentOS7.6 + PG11.8 source code
源码下载地址: https://www.postgresql.org/ftp/source/v11.8/postgresql-11.8.tar.gz
源码安装文档:https://www.postgresql.org/docs/11/install-short.htm
1.2.1.2 使用方式
- 替换目录 ../postgresql-11.4/contrib/passwordcheck 下的 passwordcheck.c
- 编译安装 make && make install
- postgresql配置文件内修改 (postgresql.conf)
- shared_preload_libraries = ‘passwordcheck’
- passwordcheck.level = ‘true’
1.2.1.3 效果
当密码长度足够,不符合规则的时候,无法新建用户
1.2.1.4 源码修改
将下载后的源码解压缩, 找到postgresql-11.8/contrib/passwordcheck/passwordcheck.c
源文件,修改后保存退出。
1 | /*------------------------------------------------------------------------- |
1.2.1.5 编译
1 | ##编译安装pg server |
1.2.2 验证
首先开启passwordcheck验证, 修改参数文件postgresql.conf
1 | # 修改如下 |
重启实例生效
1 | pg_ctl restart |
测试
1 | # 提示密码太短 |
1.2.3 问题
警告
这里还存在个问题,就是通过\password
命令修改的话,可以输入不满足长度的密码,原因是使用\password
时passwordcheck
检查的是加密后的口令,官方文档提到过,检查md5
加密后的口令是很困难的,所以当passwordcheck
检查加密的口令时,只检查密码是否与用户名相同这一项,实际上是将用户名通过md5
加密后与数据库中的md5
密码做比较,如果相同,则报错口令不能与用户名相同。
1 | postgres=#\password bert |
1.4 参考
https://www.modb.pro/db/171257
https://www.cnblogs.com/Luckyness/p/11996834.html
https://github.com/Luckyness/passwordcheck/blob/master/passwordcheck.c