1、密码复杂度策略
passwordcheck.so模块可以实现密码复杂度要求,创建用户或修改用户密码时,需满足复杂度要求,配置完成后,后续修改用户密码或新建用户时,密码需满足以下三点:
1.密码长度至少为8位
2.密码中必须同时包含字母和非字母(非字母可以是数字或特殊字符)
3.密码中不能包含用户名
操作方法:
STEP01:备份postgresql.conf文件,文件位于PG的data目录下
STEP02:检查配置文件中是否已配置shared_preload_libraries参数
cat postgresql.conf|grep shared_preload_libraries|grep -v '^#'
STEP03:打开postgresql.conf文件,找到shared_preload_libraries参数,在原有参数后加入passwordcheck模块(示例中的原有参数值为pg_stat_statements,不管原有参数值写了几个,都不要删!!以逗号分隔即可)。若文件中没有shared_preload_libraries参数或是注释掉了的,直接在最后一行新增即可
shared_preload_libraries = ' pg_stat_statements,passwordcheck'
STEP03:重启pg数据库
STEP04:验证,登录dbeaver执行命令【show shared_preload_libraries】确认是否配置passworkcheck模块,或者新建一个临时账户验证是否满足要求
2、数据库连接SSL加密
STEP01:验证当前pg是否开启ssl,部分版本自动开启ssl
Dbeaver登录,执行【show ssl】命令,若返回on,则说明已经配置,无需其他修改;若返回off,代表没有配置,可参照以下方案配置
检查当前版本pg数据库是否支持开启ssl
cd到pg的bin目录
./pg_config |grep CONFIGURE
若结果中有下图红框中的--with-openssl,说明当前数据库支持开启ssl,按照后续步骤开启即可;
若没有--with-openssl,则无法配置ssl
STEP02:cd进入到PG的data目录下,在该目录下创建私钥文件server.key
[root@HikvisionOS data]# openssl genrsa -des3 -out server.key 1024
【创建私钥文件,需要输入两次密码,密码自定义】
[root@HikvisionOS data]# openssl rsa -in server.key -out server.key
【删除以上设置的密码,需要再次输入密码】
私钥文件创建成功后,data目录下会出现server.key文件

STEP03:创建基于server.key文件的服务器证书,创建成功后,会在data目录下生成server.crt文件
[root@HikvisionOS data]# openssl req -new -key server.key -days 3650 -out server.crt -x509
STEP04:更改私钥文件server.key及证书文件server.crt的权限及所属者
[root@hikvisionos data]# chown postgres.postgres server.*
[root@hikvisionos data]# chmod 400 server.key
STEP05: 配置postgresql.conf文件。在data目录下找到postgresql.conf文件,请先备份。然后使用vim命令打开文件,配置以下参数(若参数前有#注释,需要删除#,否则配置不生效)
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'server.crt'
STEP06: 配置pg_hba.conf文件。在data目录下找到pg_hba.conf文件,请先备份。然后使用vim命令打开文件,新增ssl连接规则
hostssl all all 127.0.0.1/32 md5
hostssl all all 0.0.0.0/0 md5
STEP07:重启pg服务,使配置生效
STEP08:验证,使用工具登录或服务器本地psql登录,验证是否开启ssl
3、日志审计
Postgresql数据库审计包括用户登录、退出、增删改查sql语法信息的审计,审计信息默认记录在pg_log目录中。开启方式请参照以下步骤
STEP01:备份postgresql.conf文件,文件位于PG的data目录下
STEP02:打开postgresql.conf文件,逐个按照如下参数值修改(#代表注释,文本中每个参数前默认的#要去掉)(此配置生成的日志是长期保存的,清理需手动清理)
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d.log'#一般要求保留180天日志,此配置为长期保存,若需删除,需要自动配置计划任务去删
log_truncate_on_rotation = off
log_rotation_age = 1d
log_rotation_size = 0
log_connections = on #用户session登陆时是否写入日志,默认off
log_disconnections = on #用户session退出时是否写入日志,默认off
log_statement = 'ddl' #none,即不记录;ddl(记录create,drop和alter);
#mod(记录ddl+insert,delete,update和truncate);
#all(记录mod+select)
注意:log_statement 参数值中,mod和all配置值可能会造成日志文件较大,若不满足于ddl的记录内容,可修改为mod,不建议使用all
STEP03:重启pg数据库生效
STEP04:验证是否配置成功
4、密码验证失败延迟(适用pg9.6及以上版本)
auth_delay.so模块会导致服务器在报告身份验证失败之前短暂停留,这个主要用于防止暴力破解. 验证失败后, 延迟一个时间窗口才能继续验证。请注意, 它不会阻止拒绝服务攻击, 甚至可能会加剧这些攻击, 因为在报告身份验证失败之前等待的进程仍将使用连接插槽。
需要配置以下参数,实现密码验证延迟失败延迟
STEP01:备份postgresql.conf文件,文件位于PG的data目录下
STEP02:打开postgresql.conf文件,找到shared_preload_libraries参数,将该参数的参数值中加入auth_delay模块,同时找到auth_delay.milliseconds参数,设置延迟时间,单位为毫秒,示例5000代表5秒,若文件中没有该参数,添加即可
shared_preload_libraries = 'auth_delay'
auth_delay.milliseconds='5000'
注意:若shared_preload_libraries参数已经配置其他值,如passwordcheck,添加auth_delay时不要删除原先值,只需在后面以逗号分隔添加即可,如shared_preload_libraries = 'auth_delay, passwordcheck'
STEP03:重启pg数据库使之生效
STEP04:登录验证
5、断开空闲会话
postgresql.conf文件中,修改以下参数:
#用于断开超时的idle in transaction
idle_in_transaction_session_timeout = 20000(单位:毫秒)(pg9.6后开始支持该参数)
#用于断开超时的idle
idle_session_timeout=20000(单位:毫秒)(pg14才支持这个参数)




