使用 Audit Log 追踪谁删除了镜像
解读
在国内金融、运营商、政务云等合规场景下,镜像删除属于高危操作,必须满足等保 2.0、ISO 27001 的“操作可审计”要求。面试官想验证两点:
- 你是否清楚 Docker 自身日志的盲区;
- 你是否能给出落地、合规、低性能损耗的完整追踪链路,而不是只背命令。
知识点
- Docker Daemon 事件与 Audit Log 的区别:
- docker events 仅记录容器级生命周期,不含谁与宿主机 root 身份转换;
- Linux Audit 子系统(auditd)可补全系统调用层的 uid、gid、exe、key。
- 国内镜像仓库普遍使用 Harbor,其**“审计日志”功能可记录项目管理员删除镜像的用户名、IP、时间、digest**,但默认只保留 3 个月,需接入 ELK 或 OSS 长期存储。
- 若使用 Docker Trusted Registry (DTR) 或阿里云 ACR,审计事件通过JWT Token 中的 sub 字段定位到企业钉钉/AD 账号,需开启**“操作日志投递”**到 SLS。
- 关键内核规则:
-w /var/lib/docker/image/overlay2/imagedb/content/sha256/ -p wa -k docker_image_delete-w /usr/bin/dockerd -p x -k docker_daemon_exec
规则需写入/etc/audit/rules.d/audit.rules并重启 auditd,禁止在线用 auditctl 临时添加,否则重启失效。
- 日志转发:auditd → rsyslog → 公司统一 Kafka → 实时 Flink 清洗 → 告警中心(钉钉群+短信),延迟 <5 秒才能满足金融秒级告警要求。
- 性能调优:使用**“规则排除”**忽略 overlay2 临时层,避免 inode 风暴;单节点事件量控制在 <3000 EPS,否则需升级 auditd 到 3.0 并开启
freq=500。
答案
线上环境以 CentOS 7.9、Docker 20.10、Harbor 2.5 为例,给出可落地的三步方案:
-
宿主机层埋点
a. 安装 auditd:yum install -y audit audit-libs
b. 写入永久规则:echo '-w /var/lib/docker/image/ -p wa -k docker_image' >> /etc/audit/rules.d/docker.rules echo '-w /usr/bin/docker -p x -k docker_cli' >> /etc/audit/rules.d/docker.rulesc. 重启服务:
systemctl restart auditd && systemctl enable auditd
d. 验证:docker rmi myrepo/myapp:v1.0 ausearch -k docker_image -i --start recent输出关键字段:
type=PATH name=/var/lib/docker/image/overlay2/imagedb/content/sha256/xxx uid=1001 gid=1001 exe=/usr/bin/dockerd
通过 uid=1001 反向关联企业 LDAP,即可定位到**“张三”在2024-05-20 14:32:05**删除镜像。 -
Harbor 层二次确认
登录 Harbor UI → 项目 → 审计日志 → 过滤“delete”操作,得到:
username=zhangsan, resource=library/myapp:v1.0, op_time=2024-05-20 14:32:07, IP=10.9.8.44
与宿主机层时间差 2 秒,交叉验证后可排除恶意删库或脚本误操作。 -
长期存储与告警
将 auditd 日志通过 rsyslog 模板转发到阿里云 SLS Logstore,配置 SQL:* | select uid,from_unixtime(time/1000000000) as del_time,exe where key='docker_image' and name like '%imagedb/content%'设置告警:**“同一 uid 10 分钟内删除镜像数 >5”即@值班群,满足金融合规“实时告警+事后溯源”**双重要求。
拓展思考
- 若容器内通过
docker.sock映射删除镜像,宿主机 audit 只能记录到容器内进程的 pid,需结合Falco 系统调用捕获与Kubernetes Audit进一步定位到Pod 名+ServiceAccount,实现**“容器逃逸”场景**的完整链路。 - 在离线机房无法使用公有云 SLS,可改用Graylog+MongoDB本地部署,索引保留 180 天,并通过国密 SM4 加密落盘,满足**“数据不出机房”**的政务云要求。
- 未来升级到Docker BuildKit后,镜像元数据路径可能变为
/var/lib/docker/buildkit/content,需动态更新 audit 规则并加入Ansible 自动化巡检,防止规则漂移导致审计盲区。