CentOS 下 SELinux 日志分析实操指南
一 日志来源与关键位置
- 当 auditd 运行时,SELinux 的 AVC(Access Vector Cache)拒绝日志默认写入:/var/log/audit/audit.log,日志中带有关键字 type=AVC 与 avc: denied。若 auditd 未运行,相关拒绝信息可能出现在 /var/log/messages。系统还可通过 journalctl 检索内核与审计日志,便于快速筛查 AVC 事件。以上位置与检索方式是定位 SELinux 拒绝的第一步。
二 快速定位与统计
- 统计是否有 AVC 拒绝:使用 aureport 汇总审计事件,快速判断是否存在 SELinux 拒绝记录。示例:
aureport | grep AVC。
- 按类型检索 AVC:使用 ausearch 精准拉取事件。示例:
ausearch -m avc(也可用 ausearch -m AVC,USER_AVC,SELINUX_ERR 覆盖常见 SELinux 相关类型)。
- 按时间、进程、文件过滤:
- 最近 1 小时且指定进程:
ausearch -m avc -ts recent -1h -p <PID>
- 指定文件:
ausearch -m avc -f <文件路径>
- 指定时间范围:
ausearch -m avc -ts <开始时间> -te <结束时间>(时间格式如:YYYY-MM-DD HH:MM:SS)
- 直接检索日志文件:对 /var/log/audit/audit.log 使用 grep 过滤 AVC 拒绝行,例如:
grep 'avc: denied' /var/log/audit/audit.log | less。以上命令组合可高效定位问题时段、进程与资源路径。
三 读懂 AVC 拒绝记录
- 典型 AVC 拒绝片段如下(字段含义见右侧注释):
type=AVC msg=audit(1580397837.344:274): avc: denied { getattr } for pid=1067 comm="httpd" path="/var/myserver/services" dev="dm-0" ino=655836 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file permissive=0
- 关键字段解读:
- comm=“httpd” / pid=1067:触发拒绝的进程名与 PID
- path=“/var/myserver/services”:被访问的目标路径
- scontext:主体安全上下文(进程),如 httpd_t
- tcontext:目标安全上下文(文件/目录等),如 var_t
- tclass=file:目标对象类别(如 file、dir、lnk_file 等)
- permissive=0:为 0 表示处于 enforcing 模式(拒绝生效);为 1 表示 permissive(仅告警放行)
- 常见根因:文件/目录的 安全上下文标签错误、进程以 错误的 SELinux 类型运行、策略中缺少对应 allow 规则 等。上述字段是判断“标签不匹配”还是“策略缺失”的直接依据。
四 诊断与修复工作流
- 生成可读诊断报告:安装 setroubleshoot-server 后,使用 sealert 分析日志并给出原因与处置建议。示例:
sealert -a /var/log/audit/audit.log,输出会包含问题描述、可能原因与修复建议(如调整上下文或生成本地策略模块)。
- 理解拒绝原因与生成策略建议:
- 使用 audit2why 解释为何被拒绝,并给出是否应新增策略的建议:
audit2why < /var/log/audit/audit.log
- 使用 audit2allow 自动生成建议规则模块:
audit2allow -a /var/log/audit/audit.log(示例输出:allow httpd_t var_t:file getattr;)——请务必在充分评估影响后再决定是否加载。
- 修复动作(按根因选择):
- 文件/目录标签错误:用 semanage fcontext 定义期望上下文并 restorecon 刷新。示例:
semanage fcontext -a -t httpd_sys_content_t '/var/www(/.*)?'; restorecon -RvvF /var/www
- 端口类型不匹配:用 semanage port 管理端口类型。示例:
semanage port -a -t http_port_t -p tcp 8080
- 功能开关限制:用 getsebool/setsebool 调整布尔值(长期生效加 -P)。示例:
setsebool -P httpd_can_network_connect on
- 验证:修复后复现操作,确认不再出现相同 AVC denied,并用
ausearch -m avc -ts recent 复核。以上流程可在不盲目放行的前提下,快速闭环大多数 SELinux 拒绝问题。
五 运维与合规建议
- 保持 auditd 持续运行并配置合理的 logrotate,避免 /var/log/audit/audit.log 无限增长(该日志默认不自带轮替,需要显式配置)。
- 在变更前后保留 AVC 日志快照,便于回滚与审计;对生产环境建议先在 permissive 模式验证影响,再切回 enforcing。
- 谨慎使用 audit2allow 生成的策略模块,优先通过“纠正上下文/端口/布尔值”等最小改动方式修复;确需策略模块时,应加上注释、限定范围并纳入变更管理。