Docker部署Rails应用PostgreSQL数据库遭恶意删除求助
问题分析与修复方案
一、紧急止损
- 立刻修改PostgreSQL的
postgres用户密码,用16位以上的高强度随机密码(混大小写、数字、特殊字符),绝对不能用弱密码或默认值。 - 检查Docker-Compose里的PostgreSQL端口映射:如果是
5432:5432直接暴露公网,马上改成127.0.0.1:5432:5432(仅VPS本地可访问);如果必须外部连接,用ufw防火墙只放行指定IP访问5432端口。 - 重启PostgreSQL容器,恢复被删的数据库(有备份直接用备份,没有就重新初始化后同步数据)。
二、堵SQL注入漏洞
- 全面检查Rails应用的数据库查询:所有SQL必须用Rails参数化查询(比如
User.where("id = ?", params[:id])),禁止直接拼接用户输入到SQL语句里。 - 排查代码里的
exec/execute这类直接执行SQL的方法,这些是注入重灾区,对传入参数必须做严格的格式校验和过滤。 - 翻Rails日志找注入请求的接口路径,给这些接口加强校验:比如限制输入长度、格式,用Rails的强参数机制过滤非法参数。
- 升级Rails到最新稳定版,修复已知的安全漏洞;确保
config/application.rb里开启了ActiveRecord的SQL防护配置。
三、防密码爆破
- 禁止
postgres用户远程连接:修改PostgreSQL的pg_hba.conf,把host all postgres 0.0.0.0/0 md5改成host all postgres 127.0.0.1/32 md5,只允许本地访问;Docker环境下用容器名称访问DB就行,完全不需要暴露公网。 - 限制PostgreSQL连接数:在
postgresql.conf里调小max_connections到合理值,同时在pg_hba.conf里加connection limit=10(根据业务调整),限制单IP的并发连接数。 - 开启详细日志:在
postgresql.conf设置log_connections = on、log_disconnections = on、log_hostname = on,方便追踪爆破来源。 - 用fail2ban监控PostgreSQL日志,自动封禁多次爆破的IP。
四、Docker环境加固
- 检查Docker-Compose配置:PostgreSQL容器不要挂载不必要的宿主机目录,必须挂载的用只读模式。
- 不要用root用户运行PostgreSQL容器:在Dockerfile里指定非root用户启动,降低权限泄露风险。
- 拉取最新的官方镜像:更新PostgreSQL和Ruby镜像到最新稳定版,修复镜像里的已知漏洞。
- 用Docker自定义网络:不要用默认bridge网络,创建专属网络让Rails容器和DB容器互通,限制其他容器的访问权限。
五、溯源与后续防护
- 从PostgreSQL日志里提取恶意IP,在VPS防火墙里永久封禁。
- 分析注入的SQL语句,检查是否有数据泄露、恶意用户创建等其他操作,针对性排查数据安全。
- 用
bundle audit检查Rails依赖的Gem是否有安全漏洞,及时更新修复。
内容的提问来源于stack exchange,提问作者Marat Karimov
相关产品推荐
相关产品推荐

