Linux审计工具auditd使用详解
auditd(Linux审核守护程序)简介
auditd是Linux审计系统的用户空间组件。它负责把审计记录写到磁盘上。查看日志是通过ausearch或aureport工具完成的。配置审计系统或加载规则是通过auditctl工具完成的。在启动过程中,/etc/audit/audit.rules中的规则由auditctl读取并加载到内核。另外,还有一个augenrules程序,它读取位于/etc/audit/rules.d/中的规则,并将其编译成audit.rules文件。审计守护程序本身有一些配置选项,管理员可能希望对其进行自定义。它们可以在 auditd.conf 文件中找到。
auditd安装
Red Hat/CentOS/Fedora: 通常已经默认安装(包:audit和audit-libs)
yum install -y auditd*
Debian/Ubuntu:
apt-get install -y auditd aud -plugins
auditd相关工具与配置文件
相关命令
- auditctl : 即时控制审计守护进程的行为的工具,比如如添加规则等等
- aureport : 查看和生成审计报告的工具
- ausearch : 查找审计事件的工具
- auditspd : 转发事件通知给其他应用程序,而不是写入到审计日志文件中
- autrace : 一个用于跟踪进程的命令
- aulast: 与last类似,但使用审计框架安装
- aulastlog: 与lastlog类似,也使用审计框架
- ausyscall: 映射syscall ID和名称
- auvirt: 显示关于虚拟机的审计信息
相关配置文件
- /etc/audit/auditd.conf : auditd工具的配置文件
- /etc/audit/rules.d/audit.rules:包含审核规则的文件
- /etc/audit/audit.rules : 记录审计规则的文件
auditctl使用
审计系统根据一组规则运行,这组规则定义了日志文件中所获取的内容。有三种类型的审核规则可以详细说明:
- 控制规则 — 允许审计系统的行为和它的一些被修改的配置。
- 文件系统规则 — 也被称为文件监视,允许审计进入特定文件或者目录。
- 系统调用规则 — 允许记录任何指定程序所做的系统调用。
审核规则可以在命令行上使用 auditctl ,auditctl 命令控制审计系统的基本功能并且限定规则来决定哪些审计项目要记录。注意:
- 所有与审计服务交互的命令以及审核日志文件都需要 root 权限。
- 通过命令生成的规则,重启后会失效。保持永久生效需写入文件。
auditctl常用参数
[root@VM-0-15-centos ~]# auditctl -v auditctl version 2.8.5 [root@VM-0-15-centos ~]# auditctl -l No rules [root@VM-0-15-centos ~]# auditctl -w /tmp -p rwxa -k test [root@VM-0-15-centos ~]# auditctl -l -w /tmp -p rwxa -k test [root@VM-0-15-centos ~]# auditctl -D No rules
默认情况下审计规则是空的,这里添加了一条文件系统规则 监控 /tmp 目录的变动。
- -w path :指定要监控的路径
- -p :指定触发审计的文件/目录的访问权限rwxa
指定的触发条件,r 读取权限,w 写入权限,x 执行权限,a 属性(attr) - -k:在审核规则上设置过滤名称,方便后面使用ausearch查找
- -D:删除所有规则和监控
- -W: 删除指定path的规则和-w对应,参数都要一样才能删除
- -b:在 Kernel 中设定最大数量的已存在的审核缓冲区
[root@VM-0-15-centos ~]# auditctl -b 1024
- -s:报告审核系统状态
[root@VM-0-15-centos ~]# auditctl -s enabled 1 failure 1 pid 532 rate_limit 0 backlog_limit 8192
- -r:设定每秒生成信息的速率
[root@VM-0-15-centos ~]# auditctl -r 0
以上配置在生成信息方面不设定限制速率。
在 /etc/audit/audit.rules 文件中定义持久的审核规则和控制
为了定义在重新启动时可以一直有效的审核规则,必须把它们包含在 /etc/audit/audit.rules 文件中。这个文件使用相同的 auditctl 命令行语法来详细说明规则。任何在 # 之后的空行或者文本(#)可以忽略。
- -R:读取来自指定文件的规则
[root@VM-0-15-centos ~]# cat /etc/audit/rules.d/audit.rules -w /etc/passwd -p wa -k passwd_changes -w /etc/selinux/ -p wa -k selinux_changes -w /sbin/insmod -p x -k module_insertion [root@VM-0-15-centos ~]# auditctl -R /etc/audit/rules.d/audit.rules No rules enabled 1 ... [root@VM-0-15-centos ~]# auditctl -l -w /etc/passwd -p wa -k passwd_changes -w /etc/selinux -p wa -k selinux_changes -w /sbin/insmod -p x -k module_insertion
ausearch使用
使用ausearch命令可以搜索审计记录,必须以root用户身份执行ausearch命令。
ausearch 常用参数
- -f,–file <文件名> 根据文件名搜索
- -c,–comm 根据命令行名称搜索
- -ui,–uid <用户id> 根据用户id搜索
- -p,–pid <进程id> 根据进程id搜索
- -k,–key 根据key字段搜索
- -te,–end [结束日期] [结束时间] 搜索的结束日期和时间
- -ts,–start [开始日期] [开始时间] 开始数据和搜索时间
ausearch 审计结果type详解
默认情况下,审计日志储存在 /var/log/audit/audit.log 文件中。这里以监控文件/etc/hostname
的变动情况为例,监测有哪些进程读取过该文件。
[root@VM-0-15-centos ~]# auditctl -w /etc/hostname -p r -k host [root@VM-0-15-centos ~]# auditctl -l -w /etc/hostname -p r -k host [root@VM-0-15-centos ~]# cat /etc/hostname VM-0-15-centos [root@VM-0-15-centos ~]# ausearch -i -k host -ts recent ---- type=CONFIG_CHANGE msg=audit(02/11/2022 17:05:57.190:8258477) : auid=root ses=51293 op=add_rule key=host list=exit res=yes ---- type=PROCTITLE msg=audit(02/11/2022 17:06:12.184:8258478) : proctitle=cat /etc/hostname type=PATH msg=audit(02/11/2022 17:06:12.184:8258478) : item=0 name=/etc/hostname inode=262653 dev=fd:01 mode=file,644 ouid=root ogid=root rdev=00:00 objtype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 type=CWD msg=audit(02/11/2022 17:06:12.184:8258478) : cwd=/root type=SYSCALL msg=audit(02/11/2022 17:06:12.184:8258478) : arch=x86_64 syscall=open success=yes exit=3 a0=0x7ffdafdae631 a1=O_RDONLY a2=0x1fffffffffff0000 a3=0x7ffdafdabf20 items=1 ppid=19502 pid=22601 auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts0 ses=51293 comm=cat exe=/usr/bin/cat key=host
以上事件由四个记录组成(每个以 type=
作为开始),msg=audit(02/11/2022 17:06:12.184:8258478) ,msg记录的时间戳和唯一 ID,格式为 audit(time_stamp:ID)
。如果多个记录是作为同一审计事件的一部分而产生的,则它们共享相同的时间戳和 ID。
每个记录包含好几对 name=value
,由空格或者逗号分开。
type=PROCTITLE
type
字段包含记录的类型。在本例中,PROCTITLE
值指定此记录提供触发此审计事件的完整命令行,该事件是由对内核的系统调用触发的。
type=PATH
每个审核事件包含一个 PATH
对于每条路径种类的记录作为一个参数,传输给系统调用。在审核事件中,只有一条路径被用来作为参数。
为了更清晰展示所有的键值对,把一行的内容拆分成了一列。
item=0 | item 输入栏表明在所有项目中,哪个项目在 SYSCALL 类型记录中,参考了当前记录。这个是数字是以零为基准;值 0 意味着它是第一项。 |
name=/etc/hostname | name 输入栏记录了文件或者目录的所有路径,作为参数被传输给系统调用。在这里它是 /etc/hostname 文件。 |
inode=262653 | inode 输入栏包含索引结点数字,与记录在事件中的文件和目录有关。以下命令体现了与 262653 索引结点数字相关的文件和目录。例如:[root@VM-0-15-centos ~]# find / -inum 262653 -print /etc/hostname |
dev=fd:01 | dev 输入栏明确说明了设备的次要和主要 ID,它包含记录在事件中的文件和目录。在这种情况下,值代表 /dev/fd/ 1 设备。 |
mode=file,644 | mode 输入栏记录了文件和目录权限。在这种情况下,644 可以被解释为 -rw-r--r-- ,意味着对于 /etc/hostname 文件,只有 root 用户拥有读和写,其他用户只有读权限。 |
ouid=root | ouid 输入栏记录了对象所有者的用户 。 |
ogid=root | ogid 输入栏记录对象拥有者的群组 。 |
rdev=00:00 | rdev 输入栏包含记录的设备识别器只用于特殊文件。在这种情况下,正常文件是不用来作为记录文件的。 |
objtype=NORMAL | 记录了每个路径记录在给定系统调用的上下文中的操作意图。 |
cap_fp=none | cap_fp 字段记录了与设置文件或目录对象的基于文件系统的允许能力有关的数据。 |
cap_fi=none | cap_fi 字段记录了与文件或目录对象的基于继承文件系统的能力设置有关的数据。 |
cap_fe=0 | cap_fe 字段记录了文件或目录对象基于文件系统能力的有效位的设置。 |
cap_fver=0 | cap_fver 字段记录了文件或目录对象基于文件系统能力的版本。 |
type=SYSCALL
type
字段包含记录的类型。在本例中,SYSCALL
值指定此记录是由对内核的系统调用触发的。
arch=x86_64 | arch 字段包含系统的 CPU 架构信息。 |
syscall=open | syscall 字段记录了发送到内核的系统调用的类型。 |
success=yes | success 字段记录了该特定事件中记录的系统调用是成功还是失败。 |
exit=3 | exit 字段包含一个值,指定系统调用返回的退出码。此值因不同的系统调用而不同。 |
a0=0x7ffdafdae631 a1=O_RDONLY a2=0x1fffffffffff0000 a3=0x7ffdafdabf20 | a0 至a3 字段记录了该事件中系统调用的前四个参数,用十六进制符号编码。这些参数取决于使用的系统调用。 |
items=1 | items 字段包含系统调用记录后面的 PATH 辅助记录的数量。 |
ppid=19502 | ppid 字段记录了父进程ID(PPID)。 |
pid=22601 | pid 字段记录了进程 ID(PID)。 |
auid=root | auid 字段记录了审计用户 ID,即loginuid。此 ID 在登录时分配给用户,并被每个进程继承,即使用户的身份改变了,例如使用 su - zgao 命令切换用户帐户。 |
uid=root | uid 字段记录了启动分析过程的用户的用户 ID。 |
gid=root | gid 字段记录了启动分析过程的用户的组 ID。 |
euid=root | euid 字段记录了启动分析过程的用户的有效用户 ID。 |
suid=root | suid 字段记录了启动分析过程的用户的设置用户 ID。例如一些设置了s位的程序。 |
fsuid=root | fsuid 字段记录了启动分析进程的用户的文件系统用户 ID。 |
egid=root | egid 字段记录了启动分析过程的用户的有效组 ID。 |
sgid=root | sgid 字段记录了启动分析过程的用户的组 ID。 |
fsgid=root | fsgid 字段记录了启动分析进程的用户的文件系统组 ID。 |
tty=pts0 | tty 字段记录了分析过程被调用的终端。 |
ses=51293 | ses 字段记录了分析过程被调用的会话的会话 ID。 |
comm=cat | comm 字段记录了用于调用分析过程的命令行名称。在本例中,cat 命令用于触发此审计事件 。 |
exe=/usr/bin/cat | exe 字段记录了用于调用分析过程的可执行文件的路径。 |
key=host | key 记录了与在审计日志中生成该事件的规则相关联的管理员定义的字符串。该值为执行auditctl时定义的。 |
type=CWD
type
字段值为 CWD
– 当前工作目录。此类型用于记录从中调用第一条记录中指定的系统调用的进程的工作目录。
这里 cwd=/root 表示当前进程的执行路径为 /root 目录。
aureport使用
使用aureport命令可以生成审计信息的报表,必须以root用户执行。如果执行aureport命令时没有使用任何选项,那么会显示汇总报表。
[root@VM-0-15-centos ~]# aureport Summary Report ====================== Range of time in logs: 01/01/1970 08:00:00.000 - 02/14/2022 15:25:16.804 Selected time for report: 01/01/1970 08:00:00 - 02/14/2022 15:25:16.804 Number of changes in configuration: 0 Number of changes to accounts, groups, or roles: 0 Number of logins: 1 Number of failed logins: 8927 Number of authentications: 3 Number of failed authentications: 24090 Number of users: 2 Number of terminals: 6 .....
aureport常用参数
- -t,–log 日志时间范围报告
- -x,–executable 可执行文件名报告
- -r,–response 响应异常报告
- -te,–end [结束日期] [结束时间] 报告的结束日期和时间
- -l,–login 登录报告
[root@VM-0-15-centos ~]# aureport -t Log Time Range Report ===================== /var/log/audit/audit.log.2: 02/14/2022 02:47:30.301 - 02/14/2022 09:09:13.506 /var/log/audit/audit.log.1: 02/14/2022 09:09:13.506 - 02/14/2022 13:00:10.180 /var/log/audit/audit.log: 02/14/2022 13:00:10.180 - 02/14/2022 15:35:57.426 [root@VM-0-15-centos ~]# aureport -l | head -n 10 Login Report ============================================ # date time auid host term exe success event ============================================ 1. 02/13/2022 15:21:55 root 112.85.42.124 ssh /usr/sbin/sshd no 8478563 2. 02/13/2022 15:22:01 root 112.85.42.124 ssh /usr/sbin/sshd no 8478580 3. 02/13/2022 15:22:35 root 87.107.87.82 ssh /usr/sbin/sshd no 8478593
autrace使用
除了使用设置的规则监视系统以外,还可以使用 autrace
命令对各个进程执行专门的审计。autrace
的工作方式类似于 strace
,但它收集的信息略有不同。autrace
的输出将写入到 /var/log/audit/audit.log
,看上去与标准审计日志项没有任何不同。
对进程执行 autrace
时,需从队列中清除所有审计规则,以免这些规则与 autrace
本身添加的规则相冲突。使用 auditctl
-D
命令删除审计规则。这会停止所有一般审计。
这里我们以执行whoami为例。
[root@VM-0-15-centos ~]# auditctl -D No rules [root@VM-0-15-centos ~]# autrace /usr/bin/whoami Waiting to execute: /usr/bin/whoami root Cleaning up... Trace complete. You can locate the records with 'ausearch -i -p 5280'
使用 autrace
需跟踪的可执行文件的完整路径。完成跟踪后,autrace
会提供跟踪的事件 ID,因此可以使用 ausearch
分析整个数据追踪。要将审计系统恢复为重新使用审计规则集,请使用 systemctl restart auditd
重启动审计守护程序。
使用ausearch查询审计结果。
[root@VM-0-15-centos ~]# ausearch -i -p 5280 -ts recent | head -n 3 --- type=PROCTITLE msg=audit(02/14/2022 15:47:25.880:8603375) : proctitle=autrace /usr/bin/whoami type=SYSCALL msg=audit(02/14/2022 15:47:25.880:8603375) : arch=x86_64 syscall=mmap success=yes exit=(null)(Unknown error 2027839488) a0=0x0 a1=0x1000 a2=PROT_READ|PROT_WRITE a3=MAP_PRIVATE|MAP_ANONYMOUS items=0 ppid=5278 pid=5280 auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts0 ses=51951 comm=autrace exe=/usr/sbin/autrace key=(null)
如果想更直观的展示进程的调用链可以结合aureport使用。
[root@VM-0-15-centos ~]# ausearch -ts recent -p 5280 --raw | aureport --file --summary File Summary Report =========================== total file =========================== 4 /var/run/nscd/socket 3 /etc/sysconfig/strcasecmp-nonascii 2 /etc/ld.so.preload 2 /etc/ld.so.cache 1 /usr/bin/whoami 1 /lib64/ld-linux-x86-64.so.2 1 /lib64/libc.so.6 1 /usr/lib/locale/locale-archive 1 /etc/nsswitch.conf 1 /lib64/libnss_files.so.2 1 /etc/passwd
这就展示了我们执行whoami命令过程中所有设计到文件和路径信息。
auditspd使用
审计系统还允许外部应用程序实时访问和使用 auditd
守护程序。此功能由审计调度程序提供。例如,入侵检测系统可以通过此程序使用 auditd
来接收增强的检测信息。
audispd
是用于控制审计调度程序的守护程序。它通常由 auditd
启动。audispd
会提取审计事件并将其分发到想要对其进行实时分析的程序。auditd
的配置储存在 /etc/audisp/audispd.conf
中。
[root@VM-0-15-centos ~]# cat /etc/audisp/audispd.conf q_depth = 250 overflow_action = SYSLOG priority_boost = 4 max_restarts = 10 name_format = HOSTNAME #name = mydomain plugin_dir = /etc/audisp/plugins.d/
案例分析:审记linux系统指定用户的文件访问
在我的部分机器中,为了直接给其他用户root权限。例如useradd 新增一个普通用户,采用修改/etc/passwd 文件的方式将其uid改为了0。此时一个普通用户就变成了root用户,但是该用户的gid=1000并没有改变。
案例背景
查询系统中uid为0的用户。
[root@VM-0-15-centos ~]# awk -F: '$3==0{print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash zgao:x:0:1000::/home/zgao:/bin/bash
这种特殊情况下怎么监控该用户访问过哪些文件呢?
因为uid改变了,直接监控uid=0还会监控到root的文件访问,这里gid未改变可使用gid作为过滤项查找。
auditctl -a exit,always -F arch=x86_64 -S open -F gid=1000
- -F arch=x86_64 定义使用什么体系结构(uname -m)来监视正确的系统调用(一些系统调用在主结构之间是不明确的)。
- -S open 选择“open”系统调用
- -F gid=80 相关用户组GID
[root@VM-0-15-centos ~]# auditctl -a exit,always -F arch=x86_64 -S open -F gid=1000 -k user1000 [root@VM-0-15-centos ~]# auditctl -l -a always,exit -F arch=b64 -S open -F gid=1000 -F key=user1000 [root@VM-0-15-centos ~]# su - zgao Last login: Mon Feb 14 16:38:32 HKT 2022 from 203.205.141.113 on pts/1 [root@VM-0-15-centos ~]# ausearch -k user1000 --raw | aureport --summary --file File Summary Report =========================== total file //由于记录的文件访问过多,只展示部分 =========================== 30 /dev/ 30 /dev/null 25 /etc/ld.so.cache 23 /etc/ld.so.preload ... 8 /etc/passwd ... 2 /etc/login.defs 2 /dev/tty 2 /home/zgao/.cache/abrt/ 2 /home/zgao/.cache/abrt/lastnotification.0QVUzqxw ... 1 /etc/profile.d/vim.sh 1 /home/zgao/.bash_profile 1 /home/zgao/.bashrc 1 /etc/bashrc 1 /etc/inputrc
这里就监控了 su - zgao
用户的情况下,监控用户文件的访问情况。对于某些特殊情况的下系统审计能起到很好的效果。
微信赞赏支付宝赞赏
发表评论