PostgreSQL 17.1(Docker部署)频繁出现postgres用户认证失败,如何排查发起方?
排查PostgreSQL认证失败请求来源的方法
1. 增强日志输出,获取客户端详情
PostgreSQL默认日志不会记录发起请求的客户端IP和端口,得先改配置把这些关键信息打出来:
- 进入你的PostgreSQL容器:
docker exec -it <PG容器名/ID> bash - 编辑
/var/lib/postgresql/data/postgresql.conf,修改以下参数:log_connections = on # 开启连接日志 log_hostname = on # 记录客户端主机名(也可以只记IP) log_line_prefix = '%t [%p]: user=%u,db=%d,client=%h:%p ' # 自定义日志格式,包含关键信息 - 保存后重启容器生效:
docker restart <PG容器名/ID>
2. 从更新后的日志定位请求来源
重启后再出现认证失败日志时,会看到类似这样的内容:
2025-03-05 07:33:40.707 UTC [57]: user=postgres,db=postgres,client=192.168.1.100:54320 FATAL: password authentication failed for user "postgres"
2025-03-05 07:33:40.707 UTC [57]: user=postgres,db=postgres,client=192.168.1.100:54320 DETAIL: Connection matched file "/var/lib/postgresql/data/pg_hba.conf" line 128: "host all all all scram-sha-256"
其中client=192.168.1.100:54320就是发起请求的客户端IP和端口。
3. 根据IP排查请求发起方
- 如果是宿主机IP:检查宿主机上的定时任务、监控脚本、或者其他应用,看是不是还在用旧密码连PG;也可能是其他Docker容器通过宿主机端口发起的请求,用
docker ps看运行中的容器,再用docker inspect <容器ID>查容器IP对比。 - 如果是外部服务器/设备IP:找对应设备的管理员,检查上面的服务是不是配置了旧密码;或者看防火墙日志,确认这个IP的请求频率和来源。
- 如果是容器内部IP:进入容器后用
ss -tunlp看进程,有没有其他程序在尝试连库;也可能是你的应用容器配置了旧密码,得检查应用的数据库连接配置文件。
4. 额外检查项
- 看看有没有定时任务(cron)在执行数据库操作,说不定任务里的密码没更新。
- 确认重新部署容器时,是不是正确指定了
POSTGRES_PASSWORD环境变量,虽然你用psql正常操作,但如果容器启动时初始化的密码和你手动重置的不一致,也可能导致其他服务连不上。
内容的提问来源于stack exchange,提问作者barak.o
相关产品推荐
相关产品推荐

