Docker中PostgreSQL容器数据库自动删除问题排查求助
PostgreSQL容器数据丢失原因分析与解决方案
问题原因
从日志可以明确判断,你的PostgreSQL容器遭遇了未授权恶意访问与攻击,具体攻击痕迹如下:
- 攻击者执行带shell命令的
COPY语句尝试收集系统信息:
同时尝试读取敏感文件COPY "public"."temp_rmywwamavt" FROM PROGRAM E'if [ "$(stat -c/tmp/.sh_history) -gt 10485760 ]; then echo > /tmp/.sh_history && echo llkkmm; fi 2>&1 || exit 0' WITH DELIMITER '~';/tmp/.sh_history,属于典型的信息收集行为。 - 攻击者试图移除超级用户权限,阻止管理员后续操作:
ALTER USER "postgres" WITH NOSUPERUSER;ALTER USER "pgg_superadmins" WITH NOSUPERUSER - 最后尝试删除核心数据库:
这条命令因数据库处于打开状态失败,但攻击者大概率已执行删除表数据的操作,这正是数据丢失的直接原因。DROP DATABASE postgres;
攻击成功的潜在诱因:
- PostgreSQL容器直接暴露在公网,且
pg_hba.conf配置为host all all all scram-sha-256,允许任意IP访问。 postgres用户密码过于简单或已泄露,导致攻击者通过密码认证登录。
解决方案
紧急处理
- 立即停止受攻击容器,防止进一步破坏:
docker stop <容器名称/ID> - 备份当前容器数据卷(若使用挂载卷),避免数据损坏:
docker run --rm -v <你的数据卷名称>:/data -v $(pwd):/backup ubuntu tar czf /backup/postgres-backup.tar.gz /data
数据恢复
- 若有定期备份,直接用
pg_restore或备份文件将数据恢复到新的安全容器中。 - 若无备份,启动临时PostgreSQL容器挂载现有数据卷,检查剩余数据是否可导出。
安全漏洞修复
- 严格访问控制:
修改pg_hba.conf,仅允许可信IP段访问,例如仅开放内部服务网段:
禁止使用host all all 192.168.0.0/24 scram-sha-256all all all的宽松配置。 - 设置强密码:
为postgres用户配置复杂密码,避免弱密码或默认密码。 - 避免公网直接暴露:
不要将PostgreSQL容器端口直接映射到公网,使用反向代理或防火墙策略,仅允许可信来源访问。 - 定期自动备份:
配置每日备份任务,例如:pg_dump -U postgres <目标数据库名> > /backup/$(date +%Y%m%d)-backup.sql
后续排查
- 检查容器连接日志,定位攻击来源IP,必要时在防火墙中封禁该IP。
- 排查应用程序是否存在数据库密码泄露情况,如代码硬编码、配置文件权限不当等。
内容的提问来源于stack exchange,提问作者ubiroliv
相关产品推荐
相关产品推荐

