TencentOS Server 提供了完整的完整性保护与安全审计机制,主要包括 AIDE 文件完整性检查、IMA 内核完整性度量架构,以及 auditd 安全审计系统。本文介绍这三个组件的原理、配置与使用方法。
AIDE
AIDE 介绍
AIDE(Advanced Intrusion Detection Environment)是一个开源的文件完整性检查工具,通过为系统关键文件建立数据库快照,定期比对文件属性和内容哈希值,检测文件是否被篡改。AIDE 可以监控文件的权限、属主、属组、大小、修改时间、内容哈希等多种属性,是主机入侵检测的重要手段。
安装 AIDE
在 TencentOS Server 上使用以下命令安装 AIDE:
dnf install aide
初始化数据库
安装完成后,首先需要建立 AIDE 的初始数据库,该数据库将作为后续完整性检查的对照基准:
aide --init
初始化完成后,生成的数据库文件位于
/var/lib/aide/aide.db.new.gz。若想保存数据库将其作为对照基准,需要删除初始文件名中的 .new 字符:mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
进行完整性检查
建立初始数据库后,手动检测被保护文件变化:
sudo aide --check
若无变化,则提示:
AIDE found NO differences between database and filesystem. Looks okay!!
若有变化,则提示
AIDE found differences between database and filesystem,输出示例如下:Start timestamp: 2023-05-06 10:35:53 +0800 (AIDE 0.16)AIDE found differences between database and filesystem!!Summary:Total number of entries: 116821Added entries: 0Removed entries: 0Changed entries: 4---------------------------------------------------Changed entries:---------------------------------------------------d = ... mc.. ... : /rootf ... i . . : /root/.viminfof = ... mc...... : /usr/lib/sysimage/rpm/rpmdb.sqlite-shmf = ... .c...... : /usr/lib/sysimage/rpm/rpmdb.sqlite-wal---------------------------------------------------Detailed information about changes:---------------------------------------------------Directory: /rootMtime : 2023-05-05 17:35:34 +0800 | 2023-05-06 10:22:45 +0800Ctime : 2023-05-05 17:35:34 +0800 | 2023-05-06 10:22:45 +0800...(omit partial output)...
定期检查
通常 AIDE 需要定期执行检查,因此也可通过 cron 进行周期性检查。例如可在
/etc/crontab 文件添加以下配置,使得每天 6:30 执行 AIDE 检查:30 6 * * * root /usr/sbin/aide --check
更新 AIDE 数据库
在您的系统发生主动变更后需要更新数据库,您可以通过如下操作刷新 AIDE 数据库信息:
aide --update
更新后数据库文件为
/var/lib/aide/aide.db.new.gz,同样需要删除初始文件名中的 .new 字符,方可将更新的数据库用于完整性检查:mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
IMA
IMA 介绍
IMA 全称 Integrity Measurement Architecture(完整性度量架构),它是 Linux 内核完整性子系统的一部分,通过在
execve()、mmap()、open() 等系统调用中加入钩子,IMA 对被访问的文件进行完整性度量,度量结果可进一步用于远程证明,或者和文件扩展属性中的参考值比较以控制对文件的访问。IMA 的功能主要分为以下三类:
度量(measure):度量文件并将度量结果记录在运行时度量列表中。
评估(appraise):度量文件并与一个存储在扩展属性中的参考值作比较,根据完整性校验结果进行访问控制。
审计(audit):将度量结果记入系统审计日志。
需要注意的是,IMA 并不能防止文件被篡改,无论是攻击者还是系统管理员,只要有足够的权限,就可能通过合法的方式修改文件内容。只是在修改后,下次访问该文件时,IMA 可通过校验文件内容的完整性,发现文件被篡改,如果开启了评估功能,还可进一步阻止文件被继续访问。
此外,建议在使用 IMA 之前开启 Secure Boot 保护机制,保护内核和内核启动参数不被篡改。
IMA 初始化
在安装完 TencentOS Server 后,IMA 已默认处于使能状态,只需要加载 IMA 策略,即可开始使用 IMA 完整性度量。加载策略的方式有以下两种,请您根据需要任选其一:
通过启动参数
ima_policy 指定预置策略。通过
/sys/kernel/security/ima/policy 接口导入手写策略。方式一:通过启动参数指定预置策略
在内核启动参数中增加
ima_policy 策略参数,添加方式如下:grubby --args="ima_policy=tcb" --update-kernel=/boot/vmlinuz-`uname -r`
除指定 IMA 策略外,内核启动参数还提供了更细粒度控制 IMA 行为的能力,常见的 IMA 启动参数包括:
启动参数 | 取值 | 含义 |
ima_hash | sha1/sha256/sm3/md5/... | 设置 IMA 使用的度量算法,默认情况下为 SHA256 |
ima_template | ima/ima-ng/ima-sig | 设置 IMA 使用的度量模板 |
ima_appraise | off | 关闭 IMA 评估功能 |
| fix | 设置 IMA 评估 fix 模式,该模式可标记文件 security.ima 扩展属性,初始化环境时使用 |
| log | 设置 IMA 评估日志模式,该模式只校验文件完整性,但不做访问控制,只记录审计日志 |
| enforce | 设置 IMA 评估强制模式,该模式校验文件完整性,并根据校验结果进行访问控制 |
ima_policy | tcb | 使用 IMA 预置度量策略,详见下一节 |
| appraise_tcb | 使用 IMA 预置评估策略,评估所有 root 属主的文件 |
| secure_boot | 使用 IMA 预置评估策略,评估内核、内核模块、固件、IMA 策略等的完整性 |
integrity_audit | 0 | 提供基本审计信息(默认) |
| 1 | 提供详细审计信息 |
添加启动参数后需要重启方可生效。
方式二:通过 policy 接口导入手写策略
运行时您可通过 SecurityFS 接口(位于
/sys/kernel/security/ima 路径下)与 IMA 进行交互:SecurityFS 接口 | 权限 | 作用 |
ascii_runtime_measurement | 440 | 提供 ASCII 字符形式的运行时度量列表 |
binary_runtime_measurement | 440 | 提供二进制形式的运行时度量列表 |
runtime_measurement_count | 440 | 提供系统 IMA 度量日志总数 |
violations | 440 | 提供系统 IMA 度量冲突数 |
policy | 600 | 自定义 IMA 策略读写接口 |
以上 5 个接口都具有读权限,可通过
cat 命令查看,其中第 5 个接口还有写权限,可用于更新自定义策略至内核中:echo /etc/ima/ima-policy > /sys/kernel/security/ima/policy
说明:此处
/etc/ima/ima-policy 可替换为任意其他绝对路径。配置 IMA 度量策略
IMA 度量策略定义了 IMA 的具体行为,度量策略文件中包含了多条策略规则,每条策略规则又由一个或多个 token 组成,token 主要分为两类:
行为 token:用于指定 IMA 的行为模式(度量/评估/审计),每条规则必须有且仅有一条行为 token,常用取值见下方表格。
条件匹配 token:用于检查是否与待度量的请求相匹配,条件匹配 token 可以有多条,但是在一条规则内同类型的条件匹配 token 只能指定一次,常用取值见下方表格。
IMA 支持的常用的行为 token 如下:
行为 token | 含义 |
measure | 表示对文件客体进行度量,在度量过程中,会对文件内容计算摘要值,并将摘要值以及相关信息写到度量日志项中,最后将度量日志项加入 IMA 运行时度量列表。如果系统安装了 TPM 芯片,度量值还会扩展到 TPM 的 PCR 10 中。IMA 不会重复度量已被度量过的客体,这意味着运行时度量列表中不会出现重复的文件项(除非该文件内容被修改),而且已被度量过的客体的摘要值也不会被扩展到 TPM 的 PCR 中。 |
dont_measure | 表示不对文件客体进行度量。 |
appraise | 表示对文件客体进行评估,即使用文件扩展属性 security.ima 来验证文件内容的完整性,如果完整性遭到破坏,且当前的 IMA appraise 模式是 enforce,则返回错误表示评估失败。 |
dont_appraise | 表示不对文件客体进行评估。 |
audit | 表示对文件客体进行审计,在审计日志中会记录被度量文件的绝对路径以及摘要算法和摘要值。 |
IMA 支持的常用的条件匹配 token 如下:
条件匹配 token | 取值 | 含义 |
func | FILE_CHECK | 表示在打开常规文件前(包括打开一个已有的常规文件或创建一个全新的常规文件)使用该规则对目标文件的内容进行度量,如果指定了行为 token 但是没有指定任何条件匹配 token,则 func 的默认取值是 FILE_CHECK。 |
| BPRM_CHECK | 表示在运行一个可执行文件、共享库或通过 shebang 解释器调用的脚本前,对目标文件内容进行度量。 |
| MMAP_CHECK | 表示在以可执行权限对一个常规文件进行内存映射前(包括映射一个已有的常规文件或映射一个全新的常规文件),使用该规则对目标文件的内容进行度量。 |
| MODULE_CHECK | 表示在加载内核模块文件前对目标模块文件的内容进行度量。 |
| FIRMWARE_CHECK | 表示在加载固件前对目标固件文件的内容进行度量。 |
mask | MAY_EXEC | 访问点应当正在加载可执行文件/内核模块/固件,或以只 EXEC 的模式对一个常规文件进行内存映射。 |
| MAY_WRITE | 访问点应当以只写的访问模式打开常规文件。 |
| MAY_READ | 访问点应当以只读的访问模式打开常规文件。 |
| MAY_APPEND | 访问点应当以只 append 的访问模式打开常规文件。 |
| ^MAY_EXEC | 访问点应当正在执行可执行文件,或以 READ|WRITE|EXEC 的模式对一个常规文件进行内存映射。 |
| ^MAY_WRITE | 访问点应当以写入的访问模式打开常规文件。 |
| ^MAY_READ | 访问点应当以读取的访问模式打开常规文件。 |
| ^MAY_APPEND | 访问点应当以 append 的访问模式打开常规文件。 |
fsmagic | 16 进制串 | 文件系统 fsmagic 值。 |
fsuuid | 16 进制串 | 块设备文件系统 uuid。 |
uid | 10 进制数字 | 进程 UID。 |
euid | 10 进制数字 | 进程 EUID。 |
fowner | 10 进制数字 | 文件 UID。 |
obj_user | LSM 主体用户 | LSM 主体用户。 |
obj_role | LSM 主体角色 | LSM 主体角色。 |
obj_type | LSM 主体类型 | LSM 主体类型。 |
subj_user | LSM 客体用户 | LSM 客体用户。 |
subj_role | LSM 客体角色 | LSM 客体角色。 |
subj_type | LSM 客体类型 | LSM 客体类型。 |
下面以内核启动参数
ima_policy=tcb 对应的默认度量策略为例,解释在该策略下 IMA 如何度量系统文件:dont_measure fsmagic=0x9fa0dont_measure fsmagic=0x62656572dont_measure fsmagic=0x64626720dont_measure fsmagic=0x1021994dont_measure fsmagic=0x1cd1dont_measure fsmagic=0x42494e4ddont_measure fsmagic=0x73636673dont_measure fsmagic=0xf97cff8cdont_measure fsmagic=0x27e0ebdont_measure fsmagic=0x6e736673measure func=MMAP_CHECK mask=MAY_EXECmeasure func=BPRM_CHECK mask=MAY_EXECmeasure func=FILE_CHECK euid=0measure func=FILE_CHECK uid=0measure func=MODULE_CHECKmeasure func=FIRMWARE_CHECKmeasure func=POLICY_CHECK
dont_measure fsmagic=xxx 表示不对特定文件系统类型(通过文件系统超级块标识符区分)中的文件进行度量,这些文件系统分别是:magic 值 | 文件系统名称 |
0x9fa0 | procfs 伪文件系统 |
0x62656572 | sysfs 伪文件系统 |
0x64626720 | debugfs 伪文件系统 |
0x1021994 | tmpfs 伪文件系统 |
0x1cd1 | devpts 伪文件系统 |
0x42494e4d | binfmt_misc 伪文件系统 |
0x73636673 | securityfs 伪文件系统 |
0x27e0eb | cgroup 伪文件系统 |
0x6e736673 | namespace 伪文件系统 |
这类无需度量的文件系统均为内存驻留的伪文件系统,数据不写入磁盘,对其进行度量无实际意义。
measure func=MMAP_CHECK mask=MAY_EXEC 表示对带有 PROT_EXEC flag 的 mmap() 文件映射的内容进行度量。由于共享库通常采用该机制加载至进程地址空间,因此该规则可近似理解为对共享库的完整性度量。measure func=BPRM_CHECK mask=MAY_EXEC 表示对通过 execve() 系统调用执行的可执行文件(包括脚本)进行度量。measure func=FILE_CHECK euid=0 表示对以 EUID 为 0 的身份(root 用户和 sudo 为 root 的用户)打开的文件的内容进行度量。measure func=FILE_CHECK uid=0 表示对以 UID 为 0 的身份(root 用户)打开的文件的内容进行度量。measure func=MODULE_CHECK 表示对加载的内核模块进行度量。measure func=FIRMWARE_CHECK 表示对加载的固件文件进行度量。measure func=POLICY_CHECK 表示对额外写入到 /sys/kernel/security/ima/policy 的 IMA 策略的内容进行度量。auditd
audit 介绍
Linux 审计(Linux Audit)提供了一种跟踪系统与安全相关信息的方式,通过预配置的规则,Audit 会生成日志条目,记录系统所发生事件的相关信息。Audit 本身不提供额外的安全性 —— 它不能防范系统漏洞或系统被恶意利用。Audit 只用于跟踪相关安全事件,并帮助用户采取额外的安全措施(例如 SELinux)来防止这些问题。
Audit 包括多个组件,每个组件都为总体框架提供关键功能。Audit 内核模块会截获系统调用并记录相关事件。auditd 守护程序会将审计报告写入磁盘。各种命令行实用程序会处理审计追踪的显示、查询和存档。
Audit 主要由以下程序组成:
auditd:Audit 守护进程负责将通过 audit 内核接口生成的审计信息写入
audit.log 文件,并保存至磁盘。auditd 启动由 systemd 控制,auditd 功能由 /etc/audit/auditd.conf 控制。auditctl:控制内核审计接口的日志生成参数和内核设置,以及跟踪事件的审计规则集。
audit.rules:
/etc/audit/audit.rules 包含一系列 auditctl 命令,由 auditd 加载这些命令集。aureport:可以基于审计事件日志创建自定义报告。
ausearch:用于在审计日志文件
audit.log 中搜索特定事件。audispd:将审计事件通知中继到其他程序,而不是写入磁盘的审计日志中。
autrace:以类似 strace 的方式跟踪单个进程,并将输出记录到审计日志。
audit 基础配置
配置 auditd
在进行 Linux 系统审计之前,需要对 Audit 进行配置。Audit 的配置文件位于
/etc/audit/auditd.conf,使用任意文本编辑器打开即可。常用配置项如下:log_file:定义审计日志文件的位置和名称。通常默认位置为 /var/log/audit/audit.log。log_format:定义审计日志的格式。支持 raw/user/json/enriched/verbose 五个参数。max_log_file_action:定义审计日志文件达到最大上限时的操作。一般设置为 keep_logs,以防止审计日志文件被覆盖。space_left:定义审计日志文件系统中必须保留的可用空间。space_left_action:定义审计日志文件系统中可用空间不足时的操作。建议将参数设置为 email 或配置了适当通知方法的 exec。admin_space_left:定义管理员空间中必须保留的可用空间。admin_space_left_action:定义管理员空间中可用空间不足时的操作。一般应该设置为 single 来使系统进入单用户模式。audit 守护进程
首先内核需要打开
CONFIG_AUDIT、CONFIG_AUDITSYSCALL 配置,TencentOS Server 内核默认开启了 Audit 相关配置。确认内核支持审计功能后,启动 auditd 服务,以收集相关审计信息,并保存在日志文件中。以 root 用户身份运行以下命令来启动 auditd:
service auditd start
并将 auditd 配置为开机启动。TencentOS Server 4 默认未启用 auditd 开机自启,请您执行以下命令启用:
systemctl enable auditd
如果需要临时禁用 auditd,可以运行
auditctl -e 0,重新运行则可以使用 auditctl -e 1。可以通过
service auditd <command> 控制 auditd 执行其他操作,command 可以是以下指令:命令 | 作用 |
stop | 停止 auditd |
restart | 重新启动 auditd |
reload/force-reload | 重新加载 /etc/audit/auditd.conf 文件中的 auditd 配置 |
rotate | 备份旧 log 文件,日志写入新的空白 log 文件 |
resume | 在 auditd 被暂停后,重新恢复 |
condrestart/try-restart | 只有 auditd 运行时才重新启动它 |
status | 显示 auditd 的运行状态 |
注意:
service 命令是唯一与 auditd 进程正确交互方式,systemctl 命令只能用于两个操作:enable 和 status,其他指令均只能使用 service。audit 日志介绍
使用 Audit 必须了解审计守护程序所生成的日志的构造方式,以及审计针对事件具体会记录哪些内容。只有在获知这些信息后,才能确定哪些报告类型最适合需求。
Audit 默认将日志条目记录在
/var/log/audit/audit.log 文件中。我们通过一个例子来描述 Audit 日志的各项记录参数。添加以下审计规则,来记录对 /boot/grub2/grub.cfg 文件的读写操作。auditctl -Dauditctl -w /boot/grub2/grub.cfg -p warx -k grub.cfg
audit.log 对这个事件的记录如下:type=SYSCALL msg=audit(1677250085.590:313): arch=c000003e syscall=257success=yes exit=3 a0=ffffff9c a1=7fff8b0d2d09 a2=0 a3=0 items=1ppid=1098 pid=1649 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0sgid=0 fsgid=0 tty=ttyS0 ses=1 comm="cat" exe="/usr/bin/cat"subj=root:sysadm_r:sysadm_t:s0-s15:c0.c1023 key="grub.cfg" ARCH=x86_64AUID="root" UID="root" GID="root" EUID="root" SUID="root"FSUID="root" EGID="root" SGID="root" FSGID="root"type=CWD msg=audit(1677250085.590:313): cwd="/var/log/audit"type=PATH msg=audit(1677250085.590:313): item=0name="/boot/grub2/grub.cfg" inode=524302 dev=fc:01 mode=0100600 ouid=0ogid=0 rdev=00:00 obj=system_u:object_r:boot_t:s0 nametype=NORMALcap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0 OUID="root"OGID="root"type=PROCTITLE msg=audit(1677250085.590:313):proctitle=636174002F626F6F742F67727562322F677275622E636667
以上事件由四个记录组成,它们共享相同的时间戳和序列号。记录始终以
type= 关键字开头。每个记录由多个 name=value 对组成,它们之间由空格或逗号分开。对上述事件的详细分析如下:第一条记录:
字段 | 含义 |
type=SYSCALL | type 字段包含记录的类型。在本例中,SYSCALL 值指定此记录是由对内核的系统调用触发的。 |
msg=audit(1677250085.590:313) | msg 字段记录记录的时间戳和唯一 ID,格式为 audit(time_stamp:ID)。如果多个记录是作为同一审计事件的一部分而产生的,则它们共享相同的时间戳和 ID。时间戳使用 Unix 时间格式 - 自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。 |
arch=c000003e | arch 字段包含系统的 CPU 架构信息。该值 c000003e 以十六进制表示法编码。当使用 ausearch 命令搜索审计记录时,请使用 -i 或 --interpret 选项来自动将十六进制值转换成人类可读的等效值。c000003e 值被解释为 x86_64。 |
syscall=257 | syscall 字段记录了发送到内核的系统调用的类型。值 257 可以与 /usr/include/asm/unistd_64.h 文件中人类可读的等效值匹配。在本例中,257 是 openat 系统调用。ausyscall 工具可以将系统调用号转换为人类可读的等效值。使用 ausyscall --dump 命令显示所有系统调用及其编号的列表。 |
success=yes | success 字段记录了该特定事件中记录的系统调用是成功还是失败。在这种情况下,调用成功。 |
exit=3 | exit 字段包含一个值,指定系统调用返回的退出码。此值因不同的系统调用而不同。 |
a0=ffffff9c, a1=7fff8b0d2d09, a2=0, a3=0 | a0 至 a3 字段记录了该事件中系统调用的前四个参数,用十六进制符号编码。这些参数取决于使用的系统调用,可以通过 ausearch 工具来解释它们。 |
items=1 | items 字段包含系统调用记录后面的 PATH 辅助记录的数量。 |
ppid=1098 | ppid 字段记录了父进程 ID(PPID)。在这种情况下,1098 是父进程(如 bash)的 PPID。 |
pid=1649 | pid 字段记录了进程 ID(PID)。在本例中,1649 是 cat 进程的 PID。 |
auid=0 | auid 字段记录了审计用户 ID,即 loginuid。此 ID 在登录时分配给用户,并被每个进程继承,即使用户的身份改变了,例如使用 su - user 命令切换用户账户。 |
uid=0 | uid 字段记录了启动分析过程的用户的用户 ID。使用以下命令可以将用户 ID 解释成用户名: ausearch -i --uid UID。 |
gid=0 | gid 字段记录了启动分析过程的用户的组 ID。 |
euid=0 | euid 字段记录了启动分析过程的用户的有效用户 ID。 |
suid=0 | suid 字段记录了启动分析过程的用户的设置用户 ID。 |
fsuid=0 | fsuid 字段记录了启动分析进程的用户的文件系统用户 ID。 |
egid=0 | egid 字段记录了启动分析过程的用户的有效组 ID。 |
sgid=0 | sgid 字段记录了启动分析过程的用户的组 ID。 |
fsgid=0 | fsgid 字段记录了启动分析进程的用户的文件系统组 ID。 |
tty=ttyS0 | tty 字段记录了分析过程被调用的终端。 |
ses=1 | ses 字段记录了分析过程被调用的会话的会话 ID。 |
comm="cat" | comm 字段记录了用于调用分析过程的命令行名称。在本例中,cat 命令用于触发此审计事件。 |
exe="/usr/bin/cat" | exe 字段记录了用于调用分析过程的可执行文件的路径。 |
subj=root:sysadm_r:sysadm_t:s0-s15:c0.c1023 | subj 字段记录了被分析的进程在执行时被标记的 SELinux 上下文。 |
key="grub.cfg" | key 记录了与在审计日志中生成该事件的规则相关联的管理员定义的字符串。后续跟着一连串重复的 key,则将前述 key=value 进行了人类可读的翻译性解释。 |
第二条记录:
字段 | 含义 |
type=CWD | 在第二条记录中,type 字段值为 CWD - 当前工作目录。此类型用于记录从中调用第一条记录中指定的系统调用的进程的工作目录。此记录的目的是记录当前进程的位置,以防在相关 PATH 记录中捕获到相对路径。这样,就可以重建绝对路径。 |
msg=audit(1677250085.590:313) | msg 字段持有与第一条记录中的值相同的时间戳和 ID 值。时间戳使用 Unix 时间格式。 |
cwd="/var/log/audit" | cwd 字段包含系统调用所在目录的路径。 |
第三条记录:
字段 | 含义 |
type=PATH | 在第三条记录中,type 字段值为 PATH。审计事件包含作为参数传递给系统调用的每个路径的 PATH 类型记录。在这个审计事件中,只有一个路径( /boot/grub2/grub.cfg)被用作参数。 |
msg=audit(1677250085.590:313) | msg 字段拥有与第一和第二条记录中的值相同的时间戳和 ID 值。 |
item=0 | item 字段表示在 SYSCALL 类型记录所引用的项目总数中,当前记录是哪个项目。这个数是以零为基础的,值为 0 表示它是第一项。 |
name="/boot/grub2/grub.cfg" | name 字段记录了作为参数传递给系统调用的文件或目录的路径。在本例中,它是 /boot/grub2/grub.cfg 文件。 |
inode=524302 | inode 字段包含与该事件中记录的文件或目录相关联的 inode 号。 |
dev=fc:01 | dev 字段指定了包含该事件中记录的文件或目录的设备的次要和主要 ID。在本例中,值表示 /dev/fc/1 设备。 |
mode=0100600 | mode 字段记录文件或目录权限,由数字标记。它是 stat 命令返回的 st_mode 字段中的值。如需更多信息,请参阅 stat(2) 手册页。在这种情况下,0100600 可以解释为 -rw-------,这意味着只有 root 用户对 /boot/grub2/grub.cfg 文件具有读和写的权限。 |
ouid=0 | ouid 字段记录了对象所有者的用户 ID。 |
ogid=0 | ogid 字段记录了对象所有者的组 ID。 |
rdev=00:00 | rdev 字段包含一个记录的设备标识符,仅用于特殊文件。在这种情况下,不会使用它,因为记录的文件是一个常规文件。 |
obj=system_u:object_r:boot_t:s0 | obj 字段记录了 SELinux 上下文,在执行时,记录的文件或目录被贴上了标签。 |
nametype=NORMAL | nametype 字段记录了每个路径记录在给定系统调用的上下文中的操作意图。 |
cap_fp=none | cap_fp 字段记录了与设置文件或目录对象的基于文件系统的允许能力有关的数据。 |
cap_fi=none | cap_fi 字段记录了与文件或目录对象的基于继承文件系统的能力设置有关的数据。 |
cap_fe=0 | cap_fe 字段记录了文件或目录对象基于文件系统能力的有效位的设置。 |
cap_fver=0 | cap_fver 字段记录了文件或目录对象基于文件系统能力的版本。与第一条记录类似,后续跟着两个重复的 key,则将前述 key=value 进行了人类可读的翻译性解释。 |
第四条记录:
字段 | 含义 |
type=PROCTITLE | type 字段包含记录的类型。在本例中,PROCTITLE 值指定此记录提供触发此审计事件的完整命令行,该事件是由对内核的系统调用触发的。 |
proctitle=636174002F626F6F742F67727562322F677275622E636667 | proctitle 字段记录了用于调用分析过程的命令的完整命令行。该字段采用十六进制表示法编码,不允许用户影响审计日志解析器。 636174002F626F6F742F67727562322F677275622E636667 值解释为 cat /boot/grub2/grub.cfg。当使用 ausearch 命令搜索审计记录时,请使用 -i 或 --interpret 选项来自动将十六进制值转换成人类可读的等效值。 |
定义审计规则
审计系统根据一组规则进行操作,这些规则定义日志文件中所捕获的内容。使用
auditctl 工具,可以在命令行或 /etc/audit/rules.d/ 目录中设置审计规则。通过
auditctl 命令控制审计系统的基本功能,并定义决定记录哪些审计事件的规则。这里给出一些示例可供参考:定义一条规则,记录对
/etc/passwd 文件的所有写访问和属性修改:auditctl -w /etc/passwd -p wa -k passwd_changes
定义一条规则,记录对
/etc/selinux/ 目录中所有文件的写访问和属性修改:auditctl -w /etc/selinux/ -p wa -k selinux_changes
定义一条规则,当程序每次使用
adjtimex 或 settimeofday 系统调用时就创建一条日志,系统使用 64 位架构:auditctl -a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change
定义一条规则,在 ID 为 1000 或以上的系统用户每次删除或重命名文件时创建一条日志:
auditctl -a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete
-F auid!=4294967295 用于排除未设置登录 UID 的用户。定义一条规则,记录所有
/bin/id 程序的执行,执行以下命令:auditctl -a always,exit -F exe=/bin/id -F arch=b64 -S execve -k execution_bin_id
持久化审计规则
为确保审计规则重启后持久生效,必须直接将其包含在
/etc/audit/rules.d/audit.rules 文件中,或者使用 augenrules 程序读取位于 /etc/audit/rules.d/ 目录中的规则。请注意,每次 auditd 服务启动时都会生成 /etc/audit/audit.rules 文件。/etc/audit/rules.d/ 中的文件使用相同的 auditctl 命令行语法来指定规则即可。以上示例在 audit.rules 文件中可记录为:-w /etc/passwd -p wa -k passwd_changes-w /etc/selinux/ -p wa -k selinux_changes-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change-a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete-a always,exit -F exe=/bin/id -F arch=b64 -S execve -k execution_bin_id
修改规则文件后,使用
augenrules 命令加载规则:augenrules --load
使用 key 标识审计事件
在上述审计规则示例中,每条规则都通过
-k 参数指定了一个 key(如 passwd_changes、selinux_changes、time_change 等)。key 是管理员自定义的字符串标识符,用于标记由该规则产生的审计日志条目。利用 key 可高效过滤海量审计日志,快速定位特定规则事件,从而提升审计分析与事件追踪效率。使用 ausearch 查询审计日志
ausearch 命令用于在审计日志文件中搜索特定事件,支持按 key、用户、时间、系统调用等多种条件进行查询。常用选项如下:选项 | 说明 |
-k, --key <key> | 按 key 字符串搜索审计事件 |
-i, --interpret | 将十六进制值解释为人类可读的形式 |
-a, --event <event> | 按事件 ID 搜索 |
-ua, --uid <uid> | 按用户 ID 搜索(包括 uid 和 auid) |
-ts, --start <start> | 指定搜索的开始时间 |
-te, --end <end> | 指定搜索的结束时间 |
-f, --file <file> | 按文件名搜索 |
-sc, --syscall <syscall> | 按系统调用名称或编号搜索 |
-x, --executable <executable> | 按可执行文件路径搜索 |
-m, --message <message> | 按消息类型搜索 |
以下是一些常见的 ausearch 使用示例:
按 key 搜索审计事件,并以可读形式显示:
ausearch -k grub.cfg -i
按时间范围搜索审计事件:
ausearch -ts today -te now -i
按文件名搜索审计事件:
ausearch -f /etc/passwd -i
按系统调用搜索审计事件:
ausearch -sc openat -i
按用户搜索审计事件:
ausearch -ua 0 -i
使用 aureport 生成审计报告
aureport 命令用于基于审计事件日志生成自定义汇总报告,帮助管理员快速了解系统安全状况。常用选项如下:选项 | 说明 |
-l, --login | 生成登录相关报告 |
-f, --file | 生成文件访问相关报告 |
-s, --syscall | 生成系统调用相关报告 |
-u, --user | 生成用户相关报告 |
-e, --event | 生成事件相关报告 |
-p, --pid | 生成进程相关报告 |
-x, --executable | 生成可执行文件相关报告 |
-c, --config | 生成配置变化相关报告 |
-ts, --start <start> | 指定报告的开始时间 |
-te, --end <end> | 指定报告的结束时间 |
-i, --interpret | 将十六进制值解释为人类可读的形式 |
--failed | 仅包含失败的事件 |
--success | 仅包含成功的事件 |
以下是一些常见的 aureport 使用示例:
生成登录相关报告:
aureport -l -i
生成文件访问相关报告:
aureport -f -i
生成用户相关报告:
aureport -u -i
生成系统调用相关报告:
aureport -s -i
生成指定时间范围内的报告:
aureport -ts today -te now -i
生成仅包含失败事件的报告:
aureport --failed -i