温馨提示×

SELinux日志如何分析故障

小樊
33
2025-12-26 01:15:45
栏目: 智能运维

SELinux日志分析故障的实用流程

一、定位与收集日志

  • 确认审计服务状态:运行 systemctl status auditd,确保 auditd 正在运行;若未运行,SELinux 拒绝可能被记录到 /var/log/messages
  • 快速筛查 AVC 拒绝:
    • grep -i "denied" /var/log/audit/audit.log
    • ausearch -m avc
    • aureport -m avc
    • 使用 systemd 的系统可查 journalctl | grep AVC
  • 若怀疑有拒绝被策略的 dontaudit 屏蔽,可临时关闭 dontaudit 再复现问题:semodule -DB(排查完成后用 semodule -B 恢复)。

二、读懂关键字段与典型场景

  • 典型 AVC 拒绝片段:
    • type=AVC msg=audit(...): avc: denied { getattr } for pid=... comm="httpd" path="/var/www/html/file1" scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file permissive=0
    • 关键字段含义:
      • scontext:主体(进程)上下文,如 httpd_t
      • tcontext:客体(文件/目录/端口等)上下文,如 var_t
      • tclass:客体类别,如 filetcp_socket
      • permissive=0/1:0 表示 Enforcing(拒绝并记录),1 表示 Permissive(允许并记录)
  • 常见根因与对应线索:
    • 文件/目录标签错误:进程域与客体类型不匹配(如 httpd_t 访问 var_t
    • 端口类型不匹配:服务绑定非默认端口,未更新策略(如 mysqld_port_t vs unreserved_port_t
    • 进程在错误域运行:服务以非预期域启动,导致策略不匹配
    • 策略缺失:确实需要的新访问未被允许
  • 辅助工具:
    • sealert -a /var/log/audit/audit.log 生成可读报告并给出修复建议(如 restorecon、策略模块)
    • audit2why 解释拒绝原因并提示是否可用 audit2allow 生成策略模块
    • audit2allow -a /var/log/audit/audit.log 汇总并生成建议规则

三、按图索骥的排查与修复

  • 标签问题(最常见)
    1. ls -Z 查看客体标签;2) 用 sealertrestorecon -v <path> 按建议恢复默认标签;3) 若是自定义目录,先用 semanage fcontext 注册正确类型,再 restorecon -R -v <path> 应用。
      示例:
    • semanage fcontext -a -t httpd_sys_content_t "/abc/www/html(/.*)?"
    • restorecon -R -v /abc/www/html
  • 端口问题
    • 确认服务端口类型:如 mysqld_port_t 定义 MySQL 可用端口;若改用 3307,需让策略允许或调整端口类型。
  • 临时绕过以定位
    • 全局:setenforce 0(Permissive),验证问题是否消失;修复后再 setenforce 1(Enforcing)。
    • 仅对单个服务域:semanage permissive -a mysqld_t(排查完 semanage permissive -d mysqld_t 恢复)。
  • 生成最小策略模块(仅在确认安全且必要时)
    • ausearch -c 'httpd' --raw | audit2allow -M my-httpd
    • semodule -i my-httpd.pp(必要时使用较高优先级:semodule -X 300 -i my-httpd.pp

四、验证与恢复

  • 复现问题并确认 AVC 消失:再次执行触发操作,使用 ausearch -m avcaureport -m avc 验证。
  • 服务回归:重启相关服务(如 systemctl restart httpd),确认业务恢复正常。
  • 清理与固化:删除临时策略模块(如不再需要),保留通过 semanage fcontextrestorecon 固化下来的标签修复。

五、无法登录或系统无法正常启动的紧急处置

  • 使用 EC2 串行控制台 登录实例,或在 救援实例 上挂载受损根卷后修改 /etc/selinux/config,将 SELINUX=permissive(或临时 disabled)以恢复访问并排查;修复完成后改回 enforcing 并重启。
  • 风险提示:将 SELinux 设为 disabled 会显著削弱系统安全,仅应在紧急恢复时短时使用,完成修复后务必恢复 enforcing

0