第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文件权限拒绝类别
tclasstcp_socket / udp_socket网络访问拒绝类别
{ signal msg }signal信号与IPC拒绝类别
{ mount ptrace }ptrace系统调用拒绝类别
scontext / tcontextunconfined_u:unconfined_r:unconfined_t:s0源/目标安全上下文

采集命令:

ausearch -m avc -ts recent
# 或
journalctl -t avc --since "5 minutes ago"

3.3 原因定位:四类拒绝的故障树

下图梳理了从AVC拒绝消息到分类原因的决策流程:

AVC拒绝类型分类判断树 AVC 拒绝消息 权限集含 read/write/execute? 文件权限拒绝 tclass = file / dir / lnk_file 网络访问拒绝 tclass = tcp_socket / udp_socket 权限集含 signal / msg? 信号与IPC拒绝 tclass = process / sem / msgq / shm 系统调用拒绝 权限集 mount / ptrace / bpf 分类判断核心规则 1. 先看 { 权限集 } 是否属于文件/网络/信号/系统调用四类之一 2. 再看 tclass 确认具体客体类型(file / tcp_socket / process 等) 3. 辅助使用 sealert -l 自动分类,但需人工验证

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 复测:验证修复效果

  1. 重新执行被拒绝的操作(如文件读写、网络连接、信号发送等)
  2. 使用 ausearch -m avc -ts recent 检查是否仍有相同拒绝
  3. 如果拒绝消失但出现新类型拒绝,返回步骤3.2继续采集
  4. 使用 sealert -a /var/log/audit/audit.log 自动分析所有拒绝

3.6 预防:使用sealert自动分类工具

sealert 是SELinux提供的自动分析工具,能根据AVC拒绝消息给出分类判断和修复建议。推荐工作流程:

步骤命令说明
1sealert -l 拒绝消息ID针对单条拒绝消息自动分类,输出包括类型、影响、修复命令
2sealert -a /var/log/audit/audit.log扫描完整日志,生成汇总报告,包含各类型拒绝统计
3根据sealert输出对比本文分类判断树验证自动分类的准确性,尤其当多个权限集混杂时
4执行sealert建议的修复命令前手动审查避免自动生成的策略过于宽松

最佳实践:将sealert作为初步分类工具,再结合本章判断规则进行人工复核,特别是涉及 mount、ptrace、capability 等敏感权限时,必须确认拒绝是否真实需要。

完成本章学习后,应能独立从AVC拒绝消息中快速区分四种主要拒绝类型,并使用判断树进行定位,为后续编写精确策略打好基础。