Bootstrap

服务器记录所有用户docker操作,监控删除容器/镜像的人

使用场景

多人使用的服务器,使用的docker 容器或镜像被其他人删除,需要找到删除的人

查找方法:安装使用auditd工具,并配置规则记录所有用户的docker操作

auditd 是 Linux 审计守护进程(Audit Daemon),用于记录系统活动和安全事件。它是 Linux 内核审计子系统的一部分,帮助系统管理员跟踪关键系统事件、访问控制、用户活动等,从而增强系统安全性和合规性。

主要功能

  • 事件记录:记录系统调用(如文件访问、网络操作)以及用户、进程和权限相关的活动。
  • 安全审计规则:系统管理员可以定义规则,指定要审计的事件,比如监控特定文件或目录的访问。
  • 详细的审计日志:审计事件被存储在 /var/log/audit/audit.log 文件中,提供详细的信息,如时间戳、用户、进程ID、操作类型、结果(成功/失败)等。
  • 实时监控:可以使用工具(如 ausearch 或 auditctl)实时监控和查询审计日志。
  • 用户管理审计:监控用户登录、登出、权限更改等敏感操作。
  • 文件完整性监控:结合 auditd 和 audit rules,可以监控重要文件的访问、修改或删除操作。

相关工具

  • auditctl:管理和配置审计规则。
  • ausearch:搜索审计日志中的特定事件。
  • aureport:生成审计报告的工具。
  • aulast:显示用户登录和登出信息。
  • autrace:用于跟踪特定命令的审计事件。

常见用途

  • 合规性审计
  • 确保系统符合安全标准,如 PCI DSS、HIPAA 等。
  • 入侵检测
  • 监控可疑活动,如未经授权的访问或权限提升。
  • 系统故障排除
  • 调查安全事故或操作系统问题

配置文件

  • 主配置文件:/etc/audit/auditd.conf
  • 规则配置:/etc/audit/rules.d/

安装auditd

sudo apt-get install auditd
sudo systemctl enable auditd
sudo systemctl start auditd

添加docker审计规则

Docker 的常用二进制文件路径包括:

  • Docker CLI:/usr/bin/docker
  • Docker 服务:/usr/bin/dockerd

编辑规则文件

sudo vi /etc/audit/rules.d/audit.rules

文件最后添加以下内容:

# 监控 Docker 命令执行
-a always,exit -F path=/usr/bin/docker -F perm=x -F key=docker_actions

# 监控 Docker 配置文件
-w /etc/docker/ -p wa -k docker_config

监控 Docker 命令执行解释

  • -a always,exit:在系统调用退出时触发规则。
  • -F path=/usr/bin/docker:指定要监控的路径。
  • -F perm=x:监控执行权限(执行 Docker 命令)。
  • -F key=docker_actions:为此规则设置一个键值(方便日志查询)。

监控 Docker 配置文件解释

  • -w:监控指定文件或目录。
  • -p wa:监控写入和属性更改。
  • -k docker_config:设置键值。

重新加载审计规则

sudo augenrules --load

设置监控日志大小与定期清除

避免日志记录大量操作,文件大小过大。可以设置日志轮替(Log Rotation)
编辑配置文件

sudo vi /etc/audit/auditd.conf

文件最后添加以下内容:

max_log_file = 100          # 每个日志文件最大100MB
num_logs = 5                # 保留5个旧日志文件
max_log_file_action = ROTATE  # 超过大小时轮替

效果

  • 当日志文件达到 100MB 时,auditd 会创建一个新的日志文件。
  • 系统最多保留 5 个旧日志文件(audit.log.1, audit.log.2, …),超过的将被删除。

重新加载配置

sudo service auditd reload
# 或者
sudo systemctl restart auditd

查询 Docker 操作日志

查看所有用户,所有操作日志

sudo ausearch -k docker_actions

输出结果中的单个样例如下

----
time->Wed Nov 01 18:59:24 2024  # 命令执行时间
type=PROCTITLE msg=audit(1732695555.363:1213): proctitle=646F636B6572007073002D61
type=PATH msg=audit(1732695555.363:1213): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=217841670 dev=08:12 mode=0100755 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(1732695555.363:1213): item=0 name="/usr/bin/docker" inode=79708287 dev=08:12 mode=0100755 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=CWD msg=audit(1732695555.363:1213): cwd="/home/haha/test"   # 在哪个目录执行的命令
type=EXECVE msg=audit(1732695555.363:1213): argc=3 a0="docker" a1="ps" a2="-a"   # 执行的具体命令
# 执行命令的用户
type=SYSCALL msg=audit(1732695555.363:1213): arch=c000003e syscall=59 success=yes exit=0 a0=56353bdf70c0 a1=56353bec7ba0 a2=56353be1f680 a3=8 items=2 ppid=78046 pid=78448 auid=1014 uid=1014 gid=1014 euid=1014 suid=1014 fsuid=1014 egid=1014 sgid=1014 fsgid=1014 tty=pts24 ses=15298 comm="docker" exe="/usr/bin/docker" key="docker_actions"
----

在 audit.log 文件中,每条审计记录都会包含用户相关信息,比如:

  • uid:用户ID
  • auid:审计用户ID(通常是登录用户的ID,即使提权后也保持不变)
  • euid:有效用户ID(通常是执行操作时的用户)
  • ses:会话ID

比如在上面的输出中uid=1014,即为用于ID。为了知道该用户ID对应的用户名,使用如下命令即可

cat /etc/group | grep 1014

查看特定用户的 Docker 操作

sudo ausearch -k docker_actions -ui <用户ID>

查看所有用户删除容器/镜像日志

sudo ausearch -k docker_actions | grep -E 'a1="rm"|a1="rmi"'  -A 1

命令解释:

  • -E ‘docker.*(rm|rmi)’:正则表达式,匹配包含 docker 和 rm 或 rmi 的行。
  • -A 1:(可选参数)表示包括匹配行和紧接的下一行。由于检索到的日志包含大量内容,操作用户id出现在匹配行的下一行。因此只需要显示一行
;