当前位置:首页 > 文章列表 > 文章 > linux > Linux audit 怎样按路径监控文件变化

Linux audit 怎样按路径监控文件变化

来源:17golang原创 2026-10-20 02:32:01 0浏览 收藏

想监控 Linux 上某个配置文件或目录的变化,最小可用方案是让 auditd 记录文件系统访问,再用 ausearch 按路径或规则 key 查询。单个文件用 path,目录用 dir,通常只记录写入和属性变化,也就是 perm=wa,这样比把整个文件系统的系统调用都记下来更容易控制日志量。

要点速览
  • 优先使用 syscall 形式的 -a always,exit -F arch=b64 -F path/dir=... 规则;旧式 -w watch 只适合兼容旧配置。
  • perm=wa 关注写入和属性变化,key 让后续 ausearch 查询不必记住整条规则。
  • 一个文件操作可能产生同一序列号下的多条审计记录,要把 SYSCALL、PATH 和 PROCTITLE 放在一起看。
  • 目录规则会递归到目录树底部,但遇到挂载点会停止;目录越大,事件数和查询成本越高。

先把监控目标缩到一个绝对路径

路径审计最先要确定的是“要解释哪一次变化”,而不是先写一条很宽的规则。比如只关心应用配置,可以监控 /etc/myapp/app.conf;如果应用会在同一目录下轮换多个配置文件,再把范围扩大到 /etc/myapp/。不要直接从 / 或整个 /etc 开始,否则事件量会掩盖真正的修改来源。

可以先记录三个基线指标:规则数量、指定时间窗口内的事件数量,以及一次查询耗时。它们比“日志很多”更容易比较调整前后的差异。审计记录本身写入 /var/log/audit/,具体文件由系统的 audit 配置决定;本文不假定某个发行版的轮转策略。

Linux auditd 从绝对路径规则到内核审计事件再到 ausearch 查询的静态关系说明图
图1:路径、权限、规则 key 与审计记录之间的关系说明图,不是运行截图或线上证据。

用 path 或 dir 写出最小规则

单个文件和目录的规则写法不同,但核心字段一致:动作、架构、路径范围、文件访问类型和查询 key。下面的命令只关心写入与属性变化;a 表示属性变化,例如权限、所有者或时间属性发生改变。

# 先确保目标目录存在,避免把路径拼写错误当成审计规则问题
sudo install -d -m 0755 /etc/myapp

# 单文件:只记录 app.conf 的写入与属性变化
sudo auditctl -a always,exit -F arch=b64 -F path=/etc/myapp/app.conf -F perm=wa -F key=myapp-config

# 目录:递归关注目录树中的写入与属性变化,目录范围要尽量小
sudo auditctl -a always,exit -F arch=b64 -F dir=/etc/myapp/ -F perm=wa -F key=myapp-config

上面两条规则不要同时照抄到同一台机器:如果目录规则已经覆盖了 app.conf,再加单文件规则可能导致重复记录。path 和 dir 不能使用通配符;目录规则适合一组相关文件,单文件规则适合需要明确归因的关键配置。

arch=b64 让规则明确作用于 64 位系统调用。若机器需要同时审计 32 位程序,应根据实际兼容需求补充对应架构规则,而不是盲目复制;不同架构下系统调用编号不能想当然地共用。

加载规则后先看规则本身

临时规则加载后,先列出内核当前规则。这个动作是低成本的“配置基线”:能确认路径是否为绝对路径、权限是否写成预期的 wa,也能发现测试过程中重复添加的规则。

# 列出内核当前规则,只检查配置是否进入 audit 子系统
sudo auditctl -l

# 用规则 key 快速缩小输出,确认 myapp-config 是否存在
sudo auditctl -l | grep -- 'myapp-config'

如果规则加载失败,先看命令返回的错误并修正路径、字段或权限,再重试同一条规则。不要把“查询不到事件”和“规则没有加载”混为一谈:前者需要制造一次明确变更,后者要回到 auditctl -l 排查。

用一次小变更建立可识别样本

为了确认规则确实能捕获目标动作,测试时只做一项变化,例如追加一行注释,再修改一次文件权限。命令中的注释说明每个动作的目的,实际环境应使用测试配置或维护窗口,避免覆盖真实业务内容。

# 追加一行可回滚的标记,触发一次写入事件
printf '# audit path probe\n' | sudo tee -a /etc/myapp/app.conf >/dev/null

# 单独触发属性变化,便于观察 perm=wa 中的 a
sudo chmod 0640 /etc/myapp/app.conf

测试动作完成后,记下大致时间和操作者账号。审计事件中的时间、auid、uid、进程名和路径,应该能与这次动作对应;如果只看到服务启动时产生的旧记录,查询时要缩小时间范围。

用 ausearch 按 key 和路径查询

key 是最方便的第一层过滤器。它能把由同一安全需求产生的记录归到一起;需要进一步确认具体文件时,再追加 -f。-i 会把 UID、系统调用等字段尽量解释成人类可读形式。

# 先按 key 查询最近事件,并把数字字段解释为可读值
sudo ausearch -k myapp-config -i

# 再按绝对路径缩小范围,适合目录规则覆盖多个文件的情况
sudo ausearch -k myapp-config -f /etc/myapp/app.conf -i

# 只看今天的目标事件,减少历史轮转日志带来的噪声
sudo ausearch -k myapp-config -ts today -i

一个文件操作不一定只对应一行输出。审计系统通常会把同一事件拆成 SYSCALL、PATH、PROCTITLE 等记录,并用同一个事件序列号关联它们。判断“谁改了什么”时,先看 PATH 的文件名,再结合 SYSCALL 的 comm、exe、auid 和 success;不要只凭一行 PROCTITLE 下结论。

Linux audit 事件由 SYSCALL、PATH 和 PROCTITLE 记录组成并通过序列号与 ausearch key 关联的静态结构图
图2:同一审计事件的记录关联和查询字段说明图,不是终端输出截图。

把规则持久化,并按指标控制开销

命令行加载的规则通常只适合验证。正式使用时,把规则写进发行版启用的 /etc/audit/rules.d/ 文件,再按系统方式重新加载。文件名可以表达用途,例如 50-myapp-config.rules;规则内容仍然保持最小范围。

# 写入持久化规则文件;这里用单目录规则覆盖同一类配置文件
sudo tee /etc/audit/rules.d/50-myapp-config.rules >/dev/null 

旧式 auditctl -w /path -p wa 仍常见于旧资料,但 -w watch 形式已被标记为兼容用途,性能较差;新的配置优先使用上面的 syscall 形式。目录规则会递归到目录树底部,但遇到挂载点会停止,因此跨挂载点的目录不能简单理解成“所有后代目录”。

调整范围时可以连续记录一段固定窗口内的事件数、audit backlog 是否增长,以及 ausearch 查询耗时。若事件数随着业务流量线性上升,先缩小目录或把 perm 从 rwa 收紧到实际需要的 wa;若 backlog 持续增长,还要结合审计队列和磁盘写入能力处理,不能只靠增加查询过滤器补救。

现象优先检查常见原因
完全没有目标事件auditctl -l、绝对路径、测试时间规则未加载、路径写错,或测试动作不是规则覆盖的权限类型
事件数量快速膨胀目录范围、perm、重复规则目录过大、把读访问也纳入,或同一目标被多条规则覆盖
查询结果有多条记录事件序列号、SYSCALL 与 PATH一个逻辑操作由多种审计记录共同描述
重启后规则消失/etc/audit/rules.d/ 和加载工具只用 auditctl 临时加载,没有持久化规则文件

常见问题

只想监控一个文件,应该用 path 还是 dir?

只关心一个固定文件时用 path;同一目录下的配置文件会轮换或新增时用 dir。范围越小,事件归因和日志量越容易控制。

perm=wa 中的 a 是什么?

a 表示属性变化,常见于权限、所有者或时间属性修改;它不是普通 Linux 文件权限字符串中的“追加”含义。

为什么同一次修改会看到多行审计日志?

审计事件会拆成不同类型的记录。用事件序列号把它们合并理解,再从 PATH、SYSCALL 和 PROCTITLE 交叉判断,不能把每一行当成一次独立修改。

目录规则会自动跨文件系统递归吗?

目录规则会递归目录树,但遇到挂载点会停止。需要跨挂载点时,应为实际挂载后的目标路径分别设计规则,并重新评估事件数量。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Linux systemd 怎样用 RestartSec 控制重启节奏Linux systemd 怎样用 RestartSec 控制重启节奏
上一篇
Linux systemd 怎样用 RestartSec 控制重启节奏
Linux proc cgroup namespace 怎样隐藏宿主路径
下一篇
Linux proc cgroup namespace 怎样隐藏宿主路径
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    553次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    604次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    631次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    586次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    410次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码