调查和解决 SELinux 问题 📅 发布时间:2026/8/30 15:26:35 👁 浏览次数: 对 SELinux 问题进行故障排除当应用因 SELinux 访问遭拒而意外失败时可以使用一些方法和工具来解决这些问题。在启用 SELinux 时最好先了解一些基本概念和行为。SELinux 由明确定义允许操作的目标策略组成。策略条目定义要交互的已标记进程和已标记资源。通过使用标签策略声明进程类型以及文件或端口上下文。策略条目定义一种进程类型、一个资源标签以及要允许的显式操作。操作可以是系统调用、内核函数或其他特定的编程例程。如果没有为特定的进程‑资源操作关系创建条目则操作将被拒绝。当某个操作被拒绝时该次尝试将与实用的上下文信息一起记录下来。红帽企业 Linux 为发行版中的几乎所有服务提供稳定的目标 SELinux 策略。因此正确配置了常见 RHEL 服务后很少会出现与之相关的 SELinux 访问问题。如果服务实施不正确或新应用具有不完整的策略就会出现 SELinux 访问问题。在进行广泛的 SELinux 配置更改之前请先考虑这些故障排除概念。大多数访问拒绝表明 SELinux 通过阻止不当操作来正常工作。评估遭拒的操作需要对正常的预期服务操作有所了解。最常见的 SELinux 问题是新的、复制的或移动文件具有不正确的上下文。当现有策略引用其位置时可以修复文件上下文。_selinuxman page 中记录了可选的布尔策略功能。实施布尔值功能通常需要设置额外的非 SELinux 配置。SELinux 策略不会取代或规避文件权限或访问控制列表限制。如果有常见的应用或服务出现故障并且已知该服务具有有效的 SELinux 策略首先查看该服务的_selinuxman page以验证正确的上下文类型标签。查看受影响的进程和文件属性以验证是否设置了正确的标签。监控 SELinux 违规setroubleshoot‑server软件包中的 SELinux 故障排除服务提供了诊断 SELinux 问题的工具。 当 SELinux 拒绝某一操作时会在/var/log/audit/audit.log安全日志文件中记录一条 Access Vector Cache (AVC) 消息。SELinux 故障排除服务会监控 AVC 事件并将事件摘要发送到/var/log/messages文件。AVC 摘要包括事件唯一标识符 (UUID)。使用sealert -l UUID命令来查看特定事件的综合报告详细信息。使用sealert -a /var/log/audit/audit.log命令来查看所有现有的事件。考虑在标准 Apache Web 服务器上执行以下示例命令序列的情况您将创建/root/mypage并将它移到默认的 Apache 内容目录 (/var/www/html)。然后在启动 Apache 服务后您将尝试检索文件内容。[roothost ~]# touch /root/mypage [roothost ~]# mv /root/mypage /var/www/html [roothost ~]# systemctl start httpd [roothost ~]# curl http://localhost/mypage !DOCTYPE HTML PUBLIC -//IETF//DTD HTML 2.0//EN htmlhead title403 Forbidden/title /headbody h1Forbidden/h1 pYou dont have permission to access this resource./p /body/htmlWeb 服务器不显示内容并且返回permission denied错误。AVC 事件记录到/var/log/audit/audit.log和/var/log/messages文件中。注意/var/log/messages事件消息中建议的sealert命令和 UUID。[roothost ~]# tail /var/log/audit/audit.log ...output omitted... typeAVC msgaudit(1649249057.067:212): avc: denied { getattr } for pid2332 commhttpd path/var/www/html/mypage devvda4 ino9322502 scontextsystem_u:system_r:httpd_t:s0 tcontextunconfined_u:object_r:admin_home_t:s0 tclassfile permissive0 ...output omitted... [roothost ~]# tail /var/log/messages ...output omitted... Apr 6 08:44:19 host setroubleshoot[2547]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/mypage. For complete SELinux messages run: sealert -l 95f41f98‑6b56‑45bc‑95da‑ce67ec9a9ab7 ...output omitted...sealert输出描述了事件并包括受影响的进程、访问的文件以及已尝试并被拒绝的操作。输出中包含更正文件标签的建议如果适用。其他建议描述了如何生成新的策略来允许被拒绝的操作。所给的建议仅可在适合您的情景时使用。在本例中所访问的文件位于正确的位置但没有正确的 SELinux 文件上下文。Raw Audit Messages 部分显示来自/var/log/audit/audit.log事件条目的信息。使用restorecon /var/www/html/mypage命令来设置正确的上下文标签。要以递归方式更正多个文件请对父目录使用restorecon -R命令。# 递归修复整个目录上下文 restorecon -R /var/www/html使用ausearch命令搜索/var/log/audit/audit.log日志文件中的 AVC 事件。使用-m选项指定 AVC 消息类型并使用-ts选项提供时间提示例如recent。# 查看最近的AVC拒绝日志 ausearch -m avc -ts recent使用 Web 控制台进行 SELinux 问题故障排除HEL Web 控制台包含用于对 SELinux 问题进行故障排除的工具。从左侧菜单中选择SELinux。SELinux 策略窗口会显示当前的执行状态。SELinux access control errors部分列出了当前的 SELinux 问题。单击字符以显示事件详细信息。单击solution details以显示所有事件详细信息和建议。您可以单击Apply the solution。更正问题后SELinux access control errors 部分应从视图中删除该事件。如果显示No SELinux alerts消息则表示您已更正了当前的所有 SELinux 问题。