Docker环境下PostgreSQL出现未知高CPU进程及频繁认证失败,是否遭暴力破解?
从你描述的现象来看,很大概率你的PostgreSQL容器正遭受暴力破解攻击,咱们结合你给出的信息一步步拆解分析:
核心现象对应攻击特征
1. 每秒3次的认证失败日志
你提到PostgreSQL日志里持续出现:
Connection matched file "/var/lib/postgresql/data/pg_hba.conf" line 170: "host all all all scram-sha-256"
2023-12-10 00:56:21.090 UTC [20986] FATAL: password authentication failed for user "postgres"
这完全是暴力破解的典型表现:攻击者通过自动化工具遍历密码字典,持续尝试用默认用户名postgres(攻击者最爱瞄准的默认账号)登录数据库,而你的pg_hba.conf配置允许所有IP地址连接,正好给了攻击者可乘之机。
2. 关于那个奇怪的memfd: (deleted)进程
你在宿主机查到的这个进程确实反常,但结合Docker+LXD的混合环境,更可能是攻击触发的衍生连接进程,或者是容器进程在宿主机proc文件系统下的特殊映射表现(比如容器进程的根目录、工作目录被映射到宿主机的特殊路径)。当然不能完全排除恶意程序的可能,但当前优先解决核心的暴力破解问题,再回头排查进程异常会更高效。
紧急修复与排查步骤
1. 立刻收紧PostgreSQL的访问权限
马上修改容器内的pg_hba.conf,把允许所有IP连接的规则替换为仅可信IP/网段访问:
# 替换为你的可信IP段(比如内部办公网络、服务调用的容器网段) host all all 192.168.0.0/24 scram-sha-256 # 如果仅容器内部服务访问,用Docker默认网桥网段 host all all 172.17.0.0/16 scram-sha-256
修改后,要么重启PostgreSQL容器,要么在容器内执行pg_ctl reload加载新配置,阻断攻击者的连接入口。
2. 彻底替换默认账号与强密码
攻击者的目标是默认用户名postgres,如果你的数据库还在使用这个账号:
- 新建一个拥有管理员权限的非默认用户名,迁移业务连接
- 给所有数据库账号设置16位以上的强密码(包含大小写、数字、特殊字符),避免字典攻击轻易命中
3. 准确排查容器内的进程
宿主机的/proc文件系统在Docker+LXD环境下的进程映射容易混淆,直接用Docker命令查看容器内的真实进程:
# 先获取PostgreSQL容器的ID或名称 docker ps # 进入容器查看所有进程 docker exec -it <容器ID/名称> top # 过滤PostgreSQL相关进程 docker exec -it <容器ID/名称> ps aux | grep postgres
这样能明确那个可疑进程是否属于容器内的合法PostgreSQL连接进程,还是异常衍生程序。
4. 开启详细日志追踪攻击源
修改容器内的postgresql.conf,开启连接日志获取攻击者IP:
log_connections = on log_hostname = on log_statement = 'all'
重启容器后查看日志,就能定位攻击者的具体IP,后续可以在宿主机防火墙(ufw/iptables)或云安全组中直接封禁这些恶意IP。
5. 扫描容器与宿主机的恶意程序
针对那个memfd: (deleted)的可疑进程,用开源杀毒工具扫描排查:
# 宿主机安装ClamAV并扫描 sudo apt update && sudo apt install clamav clamav-daemon sudo freshclam sudo clamscan -r / # 扫描容器:可以导出容器文件系统,或在容器内安装ClamAV扫描
总结
当前的核心证据完全指向暴力破解攻击,先优先收紧访问控制、替换默认账号强密码,阻断攻击者的入口,再逐步排查可疑进程的问题,避免数据库被攻陷。
备注:内容来源于stack exchange,提问作者Iujyrino

