使用 Audit Log 追踪谁删除了镜像

解读

在国内金融、运营商、政务云等合规场景下,镜像删除属于高危操作,必须满足等保 2.0、ISO 27001 的“操作可审计”要求。面试官想验证两点:

  1. 你是否清楚 Docker 自身日志的盲区;
  2. 你是否能给出落地、合规、低性能损耗的完整追踪链路,而不是只背命令。

知识点

  1. Docker Daemon 事件与 Audit Log 的区别:
    • docker events 仅记录容器级生命周期,不含宿主机 root 身份转换
    • Linux Audit 子系统(auditd)可补全系统调用层的 uid、gid、exe、key。
  2. 国内镜像仓库普遍使用 Harbor,其**“审计日志”功能可记录项目管理员删除镜像用户名、IP、时间、digest**,但默认只保留 3 个月,需接入 ELK 或 OSS 长期存储。
  3. 若使用 Docker Trusted Registry (DTR) 或阿里云 ACR,审计事件通过JWT Token 中的 sub 字段定位到企业钉钉/AD 账号,需开启**“操作日志投递”**到 SLS。
  4. 关键内核规则:
    • -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 临时添加,否则重启失效。
  5. 日志转发:auditd → rsyslog → 公司统一 Kafka → 实时 Flink 清洗 → 告警中心(钉钉群+短信),延迟 <5 秒才能满足金融秒级告警要求。
  6. 性能调优:使用**“规则排除”**忽略 overlay2 临时层,避免 inode 风暴;单节点事件量控制在 <3000 EPS,否则需升级 auditd 到 3.0 并开启 freq=500

答案

线上环境以 CentOS 7.9、Docker 20.10、Harbor 2.5 为例,给出可落地的三步方案

  1. 宿主机层埋点
    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.rules
    

    c. 重启服务: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**删除镜像。

  2. 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 秒,交叉验证后可排除恶意删库或脚本误操作。

  3. 长期存储与告警
    将 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”即@值班群,满足金融合规“实时告警+事后溯源”**双重要求。

拓展思考

  1. 若容器内通过 docker.sock 映射删除镜像,宿主机 audit 只能记录到容器内进程的 pid,需结合Falco 系统调用捕获Kubernetes Audit进一步定位到Pod 名+ServiceAccount,实现**“容器逃逸”场景**的完整链路。
  2. 离线机房无法使用公有云 SLS,可改用Graylog+MongoDB本地部署,索引保留 180 天,并通过国密 SM4 加密落盘,满足**“数据不出机房”**的政务云要求。
  3. 未来升级到Docker BuildKit后,镜像元数据路径可能变为 /var/lib/docker/buildkit/content,需动态更新 audit 规则并加入Ansible 自动化巡检,防止规则漂移导致审计盲区。