最佳实践 Linux Auditd 规则集,包含 14,956 条映射到 MITRE ATT&CK 的规则、Ansible 部署角色,以及用于安全监控和合规审计的 lint/测试工具。
本仓库提供 Linux 审计守护进程 (Auditd) 配置与部署的全面最佳实践,包括一套广泛的安全导向审计规则、用于自动化部署的 Ansible 角色,以及在真实内核上测试这些规则的工具。
规则集、角色和测试的变更记录在 CHANGELOG.md 中。
Auditd 是一个强大的 Linux 审计系统,提供全面的系统监控和日志记录能力。它旨在跟踪与安全相关的事件,对于以下方面至关重要:
我们全面的审计规则(/ndaal/audit_best_practices.rules 或 /dataset/audit_best_practices.rules)旨在满足各种安全标准和最佳实践,包括:
| 文件 | 内容 |
|---|---|
dataset/audit_best_practices.rules | 主规则集:14,956 条活动规则,包含 903 个键,以 arch=b32/arch=b64 成对形式编写。这是 Ansible 角色下载的文件。 |
dataset/audit_best_practices_high_volume.rules | 配套文件,包含未经过滤的集合:非系统用户的每次 execve、kill/tkill/tgkill 以及出站 connect。其中的每条规则都被注释掉,因此该文件默认关闭。其文件头说明了如何一次启用一个块。 |
ndaal/ | 两个文件的字节级相同副本。 |
*.rules.sha-256 | 采用 sha256sum 格式的 SHA-256 附属文件。Ansible 角色会根据它们校验每次下载。编辑规则文件后,运行 tools/update_rules_checksums.sh 重新生成它们。 |
tools/key-decisions.tsv | 每个键冲突对对应一项决策,由 tools/resolve_key_collisions.py 应用。 |
经测量证明有误的规则会被注释掉,并附上带日期的说明给出原因。不会删除任何内容,因此文件保留了每项决策的历史。
以技术 ID 开头的键遵循 MITRE ATT&CK Enterprise 19.2。ATT&CK v19 撤销了该文件曾使用的六个 ID。在 2026-09-27,它们的键被重命名为 MITRE 为其指定的后继名称。请更改所有使用旧键的 SIEM 查询和告警:
| 旧键 | 新键 |
|---|---|
T1562.001_Impair_Defenses_Disable_or_Modify_Tools | T1685_Disable_or_Modify_Tools |
T1562.004_Impair_Defenses_Disable_or_Modify_System_Firewall | T1686_Disable_or_Modify_System_Firewall |
T1070.002_Indicator_Removal_Clear_Linux_or_Mac_System_Logs | T1685.006_Disable_or_Modify_Tools_Clear_Linux_or_Mac_System_Logs |
T1107_File_Deletion | T1070.004_Indicator_Removal_File_Deletion |
T1169_Sudo | T1548.003_Abuse_Elevation_Control_Mechanism_Sudo_and_Sudo_Caching |
T1079_Multilayer_Encryption | T1573_Encrypted_Channel |
对 /var/log/audit/ 的监视使用 T1685.004_Disable_or_Modify_Tools_Disable_or_Modify_Linux_Audit_System_Log,即 v19 中针对审计日志本身的子技术,而不是 T1685.006。在重命名之前编写的带日期说明,以及它们所解释的被注释掉的规则,保留旧名称。
同样在 2026-09-27,命名了错误技术的键得到了更正。请同时更改这些规则的 SIEM 查询和告警:
| 规则 | 旧键 | 新键 |
|---|---|---|
对 /etc/passwd 的写入和属性更改(新增的一对;读取保留 T1087) | T1087_Account_Discovery | T1098_Account_Manipulation |
对 /etc/shadow 的写入和属性更改 | T1087_Account_Discovery | T1098_Account_Manipulation |
某人读取 /etc/shadow | T1087_Account_Discovery | T1003.008_OS_Credential_Dumping_etc_passwd_and_etc_shadow |
/etc/ssh/sshd_config | T1021_Remote_Services | T1021.004_Remote_Services_SSH |
/root/.ssh/authorized_keys | T1021_Remote_Services | T1098.004_Account_Manipulation_SSH_Authorized_Keys |
/etc/systemd/system/ | T1053.006_Scheduled_Task_Systemd_Timers | T1543.002_Create_or_Modify_System_Process_Systemd_Service |
date | T1083_File_and_Directory_Discovery | T1124_System_Time_Discovery |
| Python 解释器(pip、pipx、conda 和 npm 保留 T1072) | T1072_Software_Deployment_Tools | T1059.006_Command_and_Scripting_Interpreter_Python |
| 由某人运行的 mysql 和 psql | T1213_002_database_access | T1213.006_Data_from_Information_Repositories_Databases |
对 /etc/group 的写入和属性更改 | T1087_Account_Discovery | T1098_Account_Manipulation |
对 /etc/gshadow 的写入和属性更改(新增的一对;读取保留 T1087) | T1087_Account_Discovery | T1098_Account_Manipulation |
/usr/lib/systemd/system/(/run/systemd/transient/ 保留 T1053.006) | T1053.006_Scheduled_Task_Systemd_Timers | T1543.002_Create_or_Modify_System_Process_Systemd_Service |
/home/vagrant/.ssh/authorized_keys | T1021_Remote_Services | T1098.004_Account_Manipulation_SSH_Authorized_Keys |
写入 /var/log/tomcat10/,64 位(一处拼写错误) | tomcattomcat | tomcat |
写入 /etc/mandiant/,32 位(一处拼写错误) | mmandiant_config | mandiant_config |
unix_chkpwd 是 sudo 和屏幕锁的密码检查程序,它以该人员的审计 ID 读取 /etc/shadow,因此每次密码检查现在都以 T1003.008 出现。在用于凭据转储的 SIEM 规则中过滤 exe=/usr/sbin/unix_chkpwd。另外 34 条键采用 T1234_567 拼写形式的规则从未标记任何记录,因为更早的规则匹配了相同的事件。它们被注释掉,并附有说明指出那条规则。
kexec_load、capset、perf_event_open 和 semtimedop_time64 的 32 位调用现在携带 KEXEC、capability_change_ebpf、perf_event_ebpf 和 T1559_Inter-Process_Communication,而不是 32bit_abi。对整个数据目录的 elasticsearch-data 监视在两种 ABI 上均关闭:其警告使其成为选择性启用。在 64 位主机上,elasticsearch-nodes 和 elasticsearch-data-deletion 键(它在此之前一直占用)再次出现。
内核会附加匹配某事件的最早加载规则的键。这同样适用于系统调用规则和路径监视(kernel/auditfilter.c、kernel/auditsc.c)。因此,放置在靠前位置的宽泛规则会从其后每条具体规则那里夺走键。直到 2026-09-20,未经过滤的 procmon execve 规则位于第 1,575 行,有 368 个键从未出现在任何记录上。
现在,兜底规则位于文件末尾,顺序如下:
user_exec:登录会话(auid>=500、auid!=-1)中未被任何监视规则和提权规则认领的每次 execveprocmon:所有剩余的 execve(守护进程、cron、启动)setres*/setfs*、stime 和 32 位 umount 规则network_changes(每次 socket 和 setsockopt)和 elasticsearch-bind-success(每次成功的 bind)32bit_abi:针对 arch=b32 的 -S all,始终是文件中最后一条 -a 规则在此块之上添加每条新规则。tools/auditd-rules-lint.sh 会使兜底规则上移的文件检查失败:它会报告键遮蔽以及不是最后一条的 -S all 规则。
同一条规则决定了谁为安装操作打标签。安装以 root 身份运行,特权命令部分的 euid=0 和 auid!=uid execve 规则会认领每次 root 执行(T1548.001)。因此,包管理器(rpm、dnf、YaST/Zypper、dpkg 和 APT、Pacman、APK)位于该部分之上,与 Ceph 块一样:安装操作携带 T1072_Software_Deployment_Tools,而记录仍显示 euid=0 和该人员的审计 ID。直到 2026-09-27,它们位于其下方,从未标记任何安装操作。pip、conda 和 npm 保留在下方:Python 部分也监视解释器,而在上方,解释器监视会标记 root 运行的每个 Python 脚本。
系统调用参数很容易被误读。在 bind() 中,a0 是文件描述符,而不是端口。此前 42 条 bind -F a0=<port> 规则匹配的是描述符号,因此它们被禁用。
Copy Fail (AF_ALG): 两种架构上各三条规则,置于所有其他套接字规则之上,键为 T1068_Exploitation_for_Privilege_Escalation_AF_ALG:
socket 且 a0=38(AF_ALG)bind 且 a2=88(sockaddr_alg 的大小)setsockopt 且 a1=279(SOL_ALG)Dirty Pipe (CVE-2022-0847): 两条规则:
-S splice -F a0=0x3 -F a2=0x5 -F a3=0x0,键为 dirtypipe_CVE-2022-0847-S splice -F a1!=0,键为 T1068_Exploitation_for_Privilege_Escalation_splice_file_to_pipe。它捕获以显式偏移量复制到管道中的文件,无论描述符号是什么。登录会话执行: user_exec(见上文)。它将登录会话与守护进程区分开来。记录数量保持不变。
文件系统和卷工具: XFS(xfsprogs、xfsdump)、Btrfs、NILFS2 和 LVM2/device-mapper:4 个位置中的 60 个工具。
SBOM 工具链: ndaal sbom_tools Ansible 角色的基于路径的规则(syft、cdxgen、cargo-sbom、tern、grype、trivy、osv-scanner、bomber、bitvex、bomdrift、shieldbom、inspektr_cli、provenant、ORT,以及 jaq 和 sha3sum),采用该角色的默认布局:
/opt/ndaal/sbom-tools/bin、/usr/local/bin 或 /usr/bin 执行每个工具(T1518.001_Security_Software_Discovery)T1554_Compromise_Host_Software_Binary)及其配置的写入(T1685_Disable_or_Modify_Tools)T1565.001…)T1070.004…),以及某人读取 SBOM 和报告(T1005…)该角色中按工具账户过滤的规则(-F uid=sbom_analyze_grype)保留在角色中:auditctl 会拒绝主机上不存在的用户名。
Ceph 存储集群: 软件包安装和 cephadm 共享 /etc/ceph/、/var/lib/ceph/ 和 /var/log/ceph/。该块的每个键都以 _Ceph 结尾,因此一次搜索即可找到该集群,且键遵循 MITRE ATT&CK Enterprise 19.2:
ceph.conf、/etc/sysconfig/ceph 和 /etc/default/ceph 的写入(T1556_Modify_Authentication_Process_Ceph_Config):ceph.conf 决定 cephx 身份验证是否开启/etc/ceph/ 中的密钥环以及任何人创建、更改或删除的 bootstrap-* 密钥,以及 ceph-authtool 和 radosgw-admin 的运行(T1098_Account_Manipulation_Ceph)T1552.001_Unsecured_Credentials_Credentials_In_Files_Ceph)ceph-objectstore-tool、ceph-bluestore-tool、monmaptool 和 crushtool(T1565.001_Stored_Data_Manipulation_Ceph)cephadm 和 ceph-volume(T1072_Software_Deployment_Tools_Ceph)T1685.006_Disable_or_Modify_Tools_Clear_Linux_or_Mac_System_Logs_Ceph)ceph、rados、rbd、ceph-conf、ceph-fuse、rbd-nbd 和 mount.ceph(ceph_cli)