PostgreSQL 安全管理 密码泄露

1 背景知识

postgersql 数据库在日常使用时,会将密码记录到某些文件和位置。
1、.psql_history 。
2、csvlog。
3、pg_stat_activity 。
4、pg_stat_staemnts 插件。
5、外部表
5、堡垒机。

2 密码泄露演示

2.1 .psql_history 文件密码泄露。

1、修改user01 用户密码。

ALTER USER user01 PASSWORD 'postgres123';

2、查看密码

\! grep "ALTER USER" ~/.psql_history 

2.2 csvlog 文件密码泄露

1、配置日志记录级别。

ALTER SYSTEM SET log_statement='all';
SELECT pg_reload_conf();

2、修改user01 用户密码。

ALTER USER user01 PASSWORD 'postgres123';

3、查看密码。

\! grep "ALTER USER" $PGDATA/pg_log/*.csv 

2.3 pg_stat_activity 会话视图密码泄露

1、修改user01 用户密码。

ALTER USER user01 PASSWORD 'postgres123';

2、开启另外一个窗口

SELECT datname,pid,usename,client_addr,client_hostname,query FROM pg_stat_activity;
//屏幕输出:
 postgres | 2998 | postgres |             |                 | ALTER USER user01 PASSWORD 'postgres123';

3 防止密码泄露的方法

3.1 设置密码时,使用加密串。

1、SRAM-SHA-256

ALTER USER user01 password  'CRAM-SHA-256$4096:OAVVmPpDYIPNLuIOnRCsuw==$CuZksmuuVl6AjqSHAJEWDtYPnHIr7dWgv7Bu27dBEOE=:BznEMSd7BlogZt43el3ez0cQLWqYcQXCNA+WQUF+4KE=';
ALTER ROLE

2、MD5

ALTER USER user01 password  'md5e8a48653851e28c69d0506508fb27fc5';
Warning

这里也讨论过MD5 的加密并不安全,也存在泄露的风险,更多信息请参见: PostgreSQL 安全管理 scram-sha-256

3.2 使用 \password 命令

Warning

注意如果使用 \password 将会跳过密码复杂度检查,请见PostgreSQL passworkcheck 绕过安全检查

3.3 使用 createuser 程序

createuser -Upostgres  -P -W user01

-W 选型提示要输入密码。

3.4 回收外部表的查询权限

普通用户默认能够查询 pg_user_mappings 视图。外部表的密码有可能会泄露。

 \c - user01;
You are now connected to database "postgres" as user "user01".
SELECT * FROM pg_user_mappings;
 umid | srvid | srvname | umuser | usename | umoptions
------+-------+---------+--------+---------+-----------
(0 rows)
postgres=>

解决方法也很简单,只需要将查询权限从 public 角色回收即可。

REVOKE ALL ON pg_user_mappings FROM public;
REVOKE
\c - user01
You are now connected to database "postgres" as user "user01".

SELECT * FROM pg_user_mappings;
ERROR:  permission denied for view pg_user_mappings