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