PostgreSQL码农集散地

速查! 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