PG-用户账号安全

用户安全

用户密码

密码复杂度

PostgreSQL支持通过动态库的方式扩展PG的功能(即插件),而密码复杂度可以通过预加载passwordcheck.so模块实现。该模块可以检查密码复杂度(密码长度,包含数字,字母,大小写,特殊字符等,同时排除暴力破解字典中的字符串)

配置方式

通过$PGDATA/postgresql.conf

  • local_preload_libraries (string)
  • session_preload_libraries (string)
  • shared_preload_libraries (string)

image-20210617110041380

创建测试用户

--创建用户
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%\postgresql\psql_history
    • 可以在~/.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的值设置用户密码
posted @ 2021-06-19 20:19  KuBee  阅读(272)  评论(0编辑  收藏  举报