linux审计日志主文件是/var/log/audit/audit.log,由auditd生成,结构化键值对格式;需用ausearch/aureport解析字段,避免简单awk切分,关键字段包括type=、auid=、exe=、key=等。

Linux 审计日志本身并不直接存于 /var/log/auth.log 或 secure —— 那些是 syslog 服务记录的认证事件,属于应用层日志。而真正意义上的 审计日志(audit log) 来自内核的 auditd 服务,主文件是 /var/log/audit/audit.log,格式完全不同:它是结构化、机器可读的键值对序列,不是纯文本时间+消息的线性记录。
要处理它的复杂字段,关键不在“读懂每一行”,而在“理解字段语义 + 用对工具提取”。
audit.log 的核心字段结构
每条审计记录以 type= 开头,后面跟着多个 key=value 对,用空格分隔。常见类型有:
-
SYSCALL:系统调用事件(如 open、execve、chmod) -
CWD:当前工作目录 -
PATH:操作的文件路径(可能多个) -
EXECVE:执行的命令及其参数 -
PROCTITLE:进程标题(有时含敏感参数) -
USER_AUTH/USER_LOGIN:用户认证上下文
例如一条典型 execve 记录:
type=SYSCALL msg=audit(1712345678.123:45678): arch=c000003e syscall=59 success=yes exit=0 a0=1234567890 a1=1234567891 a2=1234567892 a3=0 items=2 ppid=1234 pid=5678 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/bin/bash" key="privileged_cmd"
其中真正对人有用的是:
-
comm=:进程名(bash) -
exe=:实际执行的二进制路径(/bin/bash) -
key=:审计规则触发的标签(如 "privileged_cmd" 表示匹配了某条高危命令规则) -
auid=:原始登录用户的审计 ID(即使 sudo 切换,auid 不变,用于溯源) -
uid=/euid=:真实用户 ID 和有效用户 ID(判断是否提权) -
tty=/ses=:终端与会话,辅助确认操作来源
用 aureport 和 ausearch 处理复杂字段
auditd 自带专用工具,比 grep + awk 更可靠:
ausearch -m SYSCALL -i-m指定事件类型,-i启用解释模式(把数字 syscall 转成execve,把 UID 转成用户名等)ausearch -ui 1001 -i | aureport -f -i
查指定auid=1001的所有文件操作,并生成汇总报表(-f),-i解析字段ausearch -m EXECVE -i --start today | grep -E "(rm|shred|dd)"
找今天所有执行过rm/shred/dd的记录(注意:EXECVE是子类型,需配合-m)aureport -ts yesterday -te now -m login -i
报告昨日至今的所有登录事件(-m login匹配USER_LOGIN类型),含用户名、终端、结果
这些命令能自动关联 SYSCALL、PATH、CWD 等多行记录,还原完整上下文 —— 这是手动 awk 做不到的。
当必须用文本工具时,如何安全提取字段
audit.log 字段含空格和特殊字符,不能简单按空格切分。正确方式:
-
提取
key=后的内容(带引号):awk -F'key="' '{gsub(/".*$/, "", $2); print $2}' /var/log/audit/audit.log | sort | uniq -c -
提取
auid=并映射为用户名(需结合/etc/passwd):awk -F'auid=' '{if($2) print $2+0}' /var/log/audit/audit.log | sort | uniq -c | while read c id; do getent passwd "$id" | cut -d: -f1; done | paste -
匹配带空格的
exe="/usr/bin/curl"(用sed更稳):sed -n 's/.*exe="\/\([^"]*\)".*/\1/p' /var/log/audit/audit.log | sort | uniq -c
关键是:避免用 $n 取字段,优先用 awk -F'key="' 或正则 sed 提取带标识符的值。
审计日志字段易混淆点
-
uid是进程运行时的实际用户 ID;auid是登录会话初始用户 ID(不可伪造,审计溯源唯一依据) -
comm=是argv[0],可能被篡改;exe=是磁盘上真实二进制路径,更可信 -
key=是你配置的审计规则标签(如sudo、password_change),不是系统自动生成的 - 时间戳
audit(1712345678.123:45678)中,小数点前是 Unix 秒,后是毫秒,冒号后是内核序列号
字段复杂不是为了难为人,而是为了在攻击者篡改 /etc/passwd 或 ps 输出时,仍能保留不可抵赖的操作证据。











