用户安全
用户密码
密码复杂度
PostgreSQL支持通过动态库的方式扩展PG的功能(即插件),而密码复杂度可以通过预加载passwordcheck.so模块实现。该模块可以检查密码复杂度(密码长度,包含数字,字母,大小写,特殊字符等,同时排除暴力破解字典中的字符串)
配置方式
通过$PGDATA/postgresql.conf
的
- local_preload_libraries (string)
- session_preload_libraries (string)
- shared_preload_libraries (string)
创建测试用户
--创建用户
CREATE USER u1 WITH PASSWORD '123';
create role test password 'Test#2021' login;
--修改用户密码
ALTER USER u1 WITH PASSWORD '111';
alter role test password 'test#2021';
密码加密存储
加密方式
show password_encryption;
查看用户密码
select usename, passwd, valuntil from pg_shadow where usename='test';
SELECT rolname,rolpassword FROM pg_authid;
用户密码到期
设置用户密码过期时间
alter user test with valid until '2021-01-01 08:00:00';
查看用户密码过期时间
-- 查看用户信息
select usename, valuntil from pg_user
where usename = 'postgres';
valuntil 列表示密码的有效期
密码失败验证延迟
auth_delay.so 模块会导致服务器在报告身份验证失败之前短暂停留,这个主要用于防止暴力破解. 验证失败后, 延迟一个时间窗口才能继续验证。
配置
ls -l $PGHOME/lib/auth_delay.so
# 配置参数文件
grep 'shared_preload_libraries' $PGDATA/postgresql.conf
auth_delay.milliseconds (int) --指定延迟时间
防止密码被记录到数据库日志中
密码的配置命令可能会被记录到history文件及csvlog日志文件中(如果开启了DDL或更高级别审计log_statement),这些文件明文记录了密码,可能造成密码泄露风险。
密码可能被记录的2个地方
-
HISTFILE
-
可以通过 PSQL_HISTORY 变量配置历史文件存储路径
-
默认存储路径
- Linux/Unix:
~/.psql_history
- Windows:
%APPDATA%postgresqlpsql_history
- Linux/Unix:
-
可以在~/.psqlrc 文件中为每个数据库指定独立的 history 文件
# 添加如下配置 vi ~/.psqlrc set HISTFILE ~/.psql_history- :DBNAME
-
-
数据库中log_filename配置文件中
-
当 log_statement 配置 ddl 或更高级别审计时,将密码明文记录到日志文件中
grep 'log_statement' $PGDATA/postgresql.conf
-
防止记录密码的方式创建或修改用户密码
- 使用createuser命令行工具带上
-W
选项,提示输入密码 - 使用pg_md5工具生成密码,然后使用该md5的值设置用户密码