第3章:AVC拒绝类型分类与判断规则
3.1 现象识别:拒绝消息的“五官”
AVC拒绝消息出现在 /var/log/audit/audit.log 或 journalctl -t avc 中,典型格式包含 type=AVC 行头和一系列键值字段。可识别的现象包括:
- 用户进程操作文件时报 Permission denied,但文件权限(ugo)正常
- 服务无法绑定端口、连接远程主机
- 进程无法向另一进程发送信号或使用 SysV IPC
- 尝试挂载、ptrace 等系统调用失败
快速识别规则:通过 audit2why 或 sealert -l ... 直接获取分类提示,但排错工程师应能通过 avc: denied { 权限集 } 字段手动判断类型。
3.2 数据采集:提取关键字段
从AVC日志行中提取以下字段用于分类判断:
| 字段 | 示例值 | 用途 |
|---|---|---|
{ 权限集 } | read write execute | 文件权限拒绝类别 |
tclass | tcp_socket / udp_socket | 网络访问拒绝类别 |
{ signal msg } | signal | 信号与IPC拒绝类别 |
{ mount ptrace } | ptrace | 系统调用拒绝类别 |
scontext / tcontext | unconfined_u:unconfined_r:unconfined_t:s0 | 源/目标安全上下文 |
采集命令:
ausearch -m avc -ts recent
# 或
journalctl -t avc --since "5 minutes ago"
3.3 原因定位:四类拒绝的故障树
下图梳理了从AVC拒绝消息到分类原因的决策流程:
3.4 修复动作:按类型执行策略调整
根据判断出的拒绝类型,采取对应的修复策略:
文件权限拒绝(read/write/execute)
- 使用
audit2allow -a -M myapp生成允许模块,或手动编写TE规则 - 设置文件上下文:
semanage fcontext -a -t httpd_sys_content_t '/var/www/html(/.*)?' - 标注文件标签:
restorecon -Rv /var/www/html
网络访问拒绝(tcp_socket/udp_socket)
- 生成网络相关allow规则:
allow httpd_t port_t:tcp_socket name_connect; - 使用
semanage port -a -t http_port_t -p tcp 8080定义端口类型 - 注意:
tcp_socket对应name_connect权限,udp_socket对应sendto权限
信号与IPC拒绝(signal/msg)
- 信号拒绝:允许发送信号的类型,例如
allow system_cronjob_t system_cronjob_t:process signal; - SysV IPC拒绝:检查消息队列、信号量、共享内存的权限,常用
allow A_t B_t:msgq { write read }; - 建议启用
dontaudit规则前先充分验证无害
系统调用拒绝(mount/ptrace)
- 挂载拒绝:需要
allow A_t self:capability sys_admin;以及针对 filesystem 对象的权限 - ptrace拒绝:调试器或容器运行时常见,需添加
allow A_t B_t:process ptrace; - 此类权限常涉及敏感能力,建议使用
semanage permissive -d domain_t临时放通,确认影响后再写规则
3.5 复测:验证修复效果
- 重新执行被拒绝的操作(如文件读写、网络连接、信号发送等)
- 使用
ausearch -m avc -ts recent检查是否仍有相同拒绝 - 如果拒绝消失但出现新类型拒绝,返回步骤3.2继续采集
- 使用
sealert -a /var/log/audit/audit.log自动分析所有拒绝
3.6 预防:使用sealert自动分类工具
sealert 是SELinux提供的自动分析工具,能根据AVC拒绝消息给出分类判断和修复建议。推荐工作流程:
| 步骤 | 命令 | 说明 |
|---|---|---|
| 1 | sealert -l 拒绝消息ID | 针对单条拒绝消息自动分类,输出包括类型、影响、修复命令 |
| 2 | sealert -a /var/log/audit/audit.log | 扫描完整日志,生成汇总报告,包含各类型拒绝统计 |
| 3 | 根据sealert输出对比本文分类判断树 | 验证自动分类的准确性,尤其当多个权限集混杂时 |
| 4 | 执行sealert建议的修复命令前手动审查 | 避免自动生成的策略过于宽松 |
最佳实践:将sealert作为初步分类工具,再结合本章判断规则进行人工复核,特别是涉及 mount、ptrace、capability 等敏感权限时,必须确认拒绝是否真实需要。
完成本章学习后,应能独立从AVC拒绝消息中快速区分四种主要拒绝类型,并使用判断树进行定位,为后续编写精确策略打好基础。