AppArmor 拒绝日志的价值
AppArmor 以路径为核心为程序加载策略文件,策略之外的访问会被拒绝,拒绝事件通常写入内核日志。日志中的 DENIED 行给出进程名、被拒绝的路径与请求的权限,能直接反映某个程序尝试访问了它本不该碰的文件,这类痕迹在常规文件系统日志里看不到。策略有两种模式:enforce 会真正阻断并记录,complain 只记录不阻断。取证时必须先确认各策略处于哪种模式,否则会把「仅记录」误读成「已被阻止」。
基本信息
| 检索方式 | dmesg | grep -i apparmor、journalctl -k |
|---|---|
| 状态查看 | aa-status、/sys/kernel/security/apparmor |
| 策略目录 | /etc/apparmor.d/ |
| 模式区别 | enforce 阻断并记录,complain 仅记录 |
典型使用场景
- 确认某个服务是否尝试访问策略外的文件
- 解释程序报权限错误但文件权限本身正常的原因
- 排查容器内进程被宿主策略拦截的情况
- 统计被拒绝最多的路径,判断程序行为异常
- 评估把策略从 complain 切到 enforce 后的影响面
查看拒绝记录
查看拒绝记录
aa-status 2>/dev/null | head # 列出已加载策略与各自模式
journalctl -k --since '2026-01-01' 2>/dev/null | grep -i 'apparmor.*DENIED' | tail -20
dmesg -T | grep -i apparmor | tail -10 # 带时间的内核环缓冲视图
grep -R 'complain' /etc/apparmor.d/ 2>/dev/null | head # 找出仍处于仅记录模式的策略
cat /sys/module/apparmor/parameters/enabled 2>/dev/null # 模块是否启用DENIED 行读法
| 字段 | 含义 | 判读要点 |
|---|---|---|
| profile | 触发拒绝的策略名 | 对应到哪个程序的策略 |
| operation | 被拒绝的操作,如 open、exec | 区分读取与执行尝试 |
| name | 被访问的目标路径 | 异常路径是定位重点 |
| requested_mask | 请求的权限位 | 如 r、w、x,反映访问意图 |
内核日志会轮转,早期拒绝事件可能已经不在环缓冲里;需要长期留证时应在策略层面调整审计与日志转发,而不是依赖现场回看。
complain 模式只记录不阻断,事件出现并不代表访问被成功阻止;判断实际效果必须结合 aa-status 显示的模式与程序后续行为。
容器内进程同时受容器自身与宿主策略约束,单看一层日志容易得出错误结论,排查时先确认策略加载在哪个命名空间。