服务器记录所有用户docker操作,监控删除容器/镜像的人
文章目录
- 使用场景
- 安装auditd
- 添加docker审计规则
- 设置监控日志大小与定期清除
- 查询 Docker 操作日志
- 查看所有用户,所有操作日志
- 查看特定用户的 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出现在匹配行的下一行。因此只需要显示一行