如何审计容器进程系统调用?使用auditd区分容器与宿主机进程遇阻
用auditd区分宿主机与容器进程的解决方案
一、修复“排除宿主机进程”方法的问题
你之前的脚本无效,核心原因是容器内的/usr/bin并非宿主机的/usr/bin目录——容器文件系统是独立的overlay挂载,容器里的/usr/bin实际对应宿主机上的容器镜像层路径(比如/var/lib/docker/overlay2/<hash>/merged/usr/bin),所以你用dir=/usr/bin的规则只会排除宿主机自身的/usr/bin下进程,对容器内的进程完全无效。
另外,即使路径匹配正确,auditd规则的生效逻辑也需要注意:exit,never规则需放在exit,always规则之前(你的脚本顺序是对的),但针对宿主机进程的排除应该精确匹配宿主机的可执行文件路径,示例脚本如下:
#!/bin/bash auditctl -D # 排除宿主机/usr/bin下的所有进程调用 auditctl -a exit,never -S all -F path=/usr/bin/ -k key_exclude # 排除宿主机/bin下的所有进程调用 auditctl -a exit,never -S all -F path=/bin/ -k key_exclude # 监控所有exit_group调用 auditctl -a exit,always -S exit_group -k key_match auditctl -l
不过这种方法局限性很大——如果容器挂载了宿主机的/bin//usr/bin,或者容器内其他路径的进程仍会被监控,因此更可靠的方案是基于进程树的匹配。
二、监控containerd-shim及其子进程的实现
所有容器进程都是containerd-shim-runc-v2的后代进程,你可以通过auditd的字段特性实现精准监控:
方法1:动态获取shim进程ID并监控后代
自动获取所有shim进程的PID,为每个shim的后代进程添加审计规则:
#!/bin/bash auditctl -D # 获取所有containerd-shim-runc-v2的PID SHIM_PIDS=$(pgrep containerd-shim-runc-v2) for pid in $SHIM_PIDS; do # 监控该shim的所有后代进程的exit_group调用 auditctl -a exit,always -S exit_group -F ancestor=$pid -k container_process done auditctl -l
方法2:通过进程名匹配shim的子进程
如果shim进程名固定为containerd-shim-runc-v2,可以直接匹配父进程名为该值的进程:
#!/bin/bash auditctl -D # 监控所有父进程是containerd-shim-runc-v2的进程的exit_group调用 auditctl -a exit,always -S exit_group -F ppid=containerd-shim-runc-v2 -k container_process # 可选:监控shim进程自身 auditctl -a exit,always -S exit_group -F comm=containerd-shim-runc-v2 -k container_shim auditctl -l
关键注意事项
- auditd的
ancestor字段需要内核版本≥3.10支持,确保你的系统内核满足要求; - 新启动的容器会生成新的shim进程,需重新运行脚本添加规则,或用systemd定时器定期更新规则;
- 可通过
ausearch -k container_process验证规则是否生效,查看捕获的容器进程审计日志。
内容的提问来源于stack exchange,提问作者jing-rui
相关产品推荐
相关产品推荐

