速查! pgpool可能会泄露PostgreSQL/PolarDB密码
小心pgpool泄露PostgreSQL/PolarDB密码
pgpool-II是非常流行的PostgreSQL中间件, 很多用户拿它和PG的流复制结合实现读写分离的配置. 但是配置不当的话, 可能会泄露你的数据库密码!
关键是认证配置, pgpool-II有两种模式可选:
代理模式 (适用广、配置简单、安全性较低) 双重认证模式 (配置复杂、更安全)
1、代理模式. pgpool 不存储数据看密码, 也不需要配置pool_hba.conf, 收到客户端发过来的明文密码后, 发送给给PostgreSQL/PolarDB进行认证. 这个方式好处是配置简单, 添加了数据用户后, 不需要修改pgpool的任何配置; 弊端是pgpool要知道客户端发过来的密码明文, 有泄露数据库密码的安全风险.
相关配置项
enable_pool_hba = off
allow_clear_text_frontend_auth = true
pool_passwd = ''
使用抓发送到pgpool 监听端口(默认为9999)的包:
sudo tcpdump -i lo dst port 9999 -w /tmp/9999.log
连接pgpool执行sql:
psql -h 127.0.0.1 -p 9999 -U digoal -d postgres -c "select client_addr from pg_stat_activity where pid=pg_backend_pid();" -W
Password: 输入密码 pwd123
client_addr
-------------
172.17.0.5
(1 row)
退出tcpdump抓包, 查看抓包文件, 可以看到明文密码:
$ strings /tmp/9999.log
<kf@
4kg@
<kh@
4ki@
user
digoal
database
postgres
application_name
psql
client_encoding
UTF8
4kk@
@kl@
pwd123 // 看到了明文密码
dgp7
4km@
4kn@
4ko@
4kp@
4kq@
4kr@
4ks@
4kt@
4ku@
4kv@
4kw@
4kx@
4ky@
4kz@
~k{@
Iselect client_addr from pg_stat_activity where pid=pg_backend_pid();
dg'T
4k|@
GHJW
dg\T
9k}@
GHJW
dgcT
4k~@
GHJ\
GHJ]
如果一定要使用pgpool代理模式, 为了提高安全性, 请确保数据库和客户端所在网络的安全. 或者建议客户端和pgpool之间的连接采用SSL连接, 那么传输的数据包将被加密, 攻击者无法得到数据包中的密码的明文.
pgpool-II 详细的配置方法可参考文档: https://github.com/digoal/blog/blob/master/202412/20241220_01.md