Docker 容器被入侵?3 步排查后门
Docker容器被入侵怎么办?3步排查隐藏后门
服务器上的Docker容器突然被黑,CPU飙升、异常流量、文件被删……遇到这种情况别慌。
本文从零开始,带你用3步排查容器内部是否藏了后门。
你不需要精通Linux,只要会执行命令就能跟着做。
第一步:先看进程和网络,找到可疑账号
后门最常见的表现是异常进程或外连IP。
登录到宿主机后,先看容器列表:
docker ps -a
记下所有运行中容器的NAME或CONTAINER ID。
然后逐个进入容器检查:
docker exec -it <容器名> /bin/bash
在容器内执行:
# 查看所有进程
ps aux
# 查看监听端口和外连连接
netstat -antp || ss -antp
重点检查:
- 进程列表里有没有奇怪的进程名(如
minerd、kdevtmpfs、kinsing)? - 有没有大量对外IP连接(特别是已知的矿池IP)?
- 有没有高CPU占用但进程名隐藏?可以用
top -b -n1快速看一眼。
如果容器没有bash或sh,改用docker exec -it <容器名> sh。
如果连ps、netstat都没有,跳到第二步。
第二步:翻查文件系统,揪出隐藏脚本
后门常藏在这些地方:
- 定时任务:
/etc/crontab、/var/spool/cron/crontabs/、/etc/cron.d/ - 开机自启:
/etc/init.d/、/etc/systemd/system/、/etc/rc.local - SSH密钥:查看
/root/.ssh/、/home/*/.ssh/下有没有莫名公钥 - 系统目录:
/tmp/、/var/tmp/、/dev/shm/(这些地方常写木马)
在容器内执行:
# 检查定时任务
cat /etc/crontab 2>/dev/null
ls -la /etc/cron* 2>/dev/null
# 检查SSH authorized_keys
cat /root/.ssh/authorized_keys 2>/dev/null
# 检查临时目录
ls -la /tmp/ /var/tmp/ /dev/shm/
发现可疑文件不要急着删,先复制到宿主机备份取证:
# 在宿主机执行
docker cp <容器名>:/tmp/suspicious_file /backup/suspicious_file
避坑提醒:很多后门会改名自保(比如下划线文件.bash开头),用ls -a看隐藏文件。
如果容器文件被只读挂载,后门可能写在外挂卷里,跳到第三步。
第三步:审计镜像与挂载卷,找到持久化后门
后门可能不在当前容器里,而藏在宿主机共享的挂载卷或镜像中。
操作步骤:
- 在宿主机查看容器的Mounts:
docker inspect <容器名> | grep -A 10 "Mounts"
看到Source和Destination。
如果容器挂载了宿主机的目录(如/var/www),后门可能写入了这些目录。cd到宿主机对应路径,用ls -la和find扫一遍:
sudo find /var/www -name "*.sh" -o -name "*.php" -o -name "*.py" | head -20
- 检查镜像历史:如果后门是在创建镜像时写入的,每次起容器都会中招。导出镜像历史:
docker history <镜像名>:<标签> --no-trunc
看有没有可疑的RUN或ADD命令(比如下载curl执行脚本)。
也可以用docker save导出镜像,然后用tar解包查看layer.tar里的文件。
高频问题:
- Q:容器里没ps/netstat怎么办? 用
cat /proc/1/cmdline看入口进程,再用ls /proc/*/fd/找网络连接。 - Q:无法进入容器? 检查容器是否以
--read-only启动,或者尝试docker run --entrypoint /bin/sh -it <镜像名>启动新实例。 - Q:发现后门后直接删除容器行吗? 不要!先导出容器快照(
docker commit),然后保留挂载卷文件。删除后门可能消失但下次启动还会回来。
效果验证:确认后门是否清理干净
完成三步排查后,重启容器或宿主机,重复第一步的检查:
- 运行
ps aux,异常进程不应再出现。 - 运行
netstat -antp,对外连接应明显减少或消失。 - 查看定时任务和自启动文件,可疑条目已移除。
最后,建议修改所有密码(容器内密码、SSH key、数据库密码),并升级镜像至最新版本。
如果怀疑宿主机也被入侵,立即断开外网,用安全工具(如ClamAV)全盘扫描。
Docker容器入侵不可怕,可怕的是找不到后门。
按这三步一步步来,多数常见后门都能揪出来。
遇到特殊情况,多查日志(docker logs <容器名>)和挂载卷文件,剩下的就是耐心了。