对 SELinux 问题进行故障排除
当应用因 SELinux 访问遭拒而意外失败时,可以使用一些方法和工具来解决这些问题。在启用 SELinux 时,最好先了解一些基本概念和行为。
- SELinux 由明确定义允许操作的目标策略组成。
- 策略条目定义要交互的已标记进程和已标记资源。
- 通过使用标签,策略声明进程类型以及文件或端口上下文。
- 策略条目定义一种进程类型、一个资源标签,以及要允许的显式操作。
- 操作可以是系统调用、内核函数或其他特定的编程例程。
- 如果没有为特定的进程‑资源操作关系创建条目,则操作将被拒绝。
- 当某个操作被拒绝时,该次尝试将与实用的上下文信息一起记录下来。
红帽企业 Linux 为发行版中的几乎所有服务提供稳定的目标 SELinux 策略。因此,正确配置了常见 RHEL 服务后,很少会出现与之相关的 SELinux 访问问题。如果服务实施不正确或新应用具有不完整的策略,就会出现 SELinux 访问问题。在进行广泛的 SELinux 配置更改之前,请先考虑这些故障排除概念。
- 大多数访问拒绝表明 SELinux 通过阻止不当操作来正常工作。
- 评估遭拒的操作需要对正常的预期服务操作有所了解。
- 最常见的 SELinux 问题是新的、复制的或移动文件具有不正确的上下文。
- 当现有策略引用其位置时,可以修复文件上下文。
_selinuxman page 中记录了可选的布尔策略功能。- 实施布尔值功能通常需要设置额外的非 SELinux 配置。
- SELinux 策略不会取代或规避文件权限或访问控制列表限制。
如果有常见的应用或服务出现故障,并且已知该服务具有有效的 SELinux 策略,首先查看该服务的 _selinux man 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 服务后,您将尝试检索文件内容。
bash
[root@host ~]# touch /root/mypage
[root@host ~]# mv /root/mypage /var/www/html
[root@host ~]# systemctl start httpd
[root@host ~]# curl http://localhost/mypage
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
</body></html>
Web 服务器不显示内容,并且返回 permission denied 错误。AVC 事件记录到 /var/log/audit/audit.log 和 /var/log/messages 文件中。注意 /var/log/messages 事件消息中建议的 sealert 命令和 UUID。
bash
[root@host ~]# tail /var/log/audit/audit.log
...output omitted...
type=AVC msg=audit(1649249057.067:212): avc: denied { getattr }
for pid=2332 comm="httpd" path="/var/www/html/mypage"
dev="vda4" ino=9322502 scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file permissive=0
...output omitted...
[root@host ~]# 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 事件条目的信息。使用
bash
restorecon /var/www/html/mypage
命令来设置正确的上下文标签。要以递归方式更正多个文件,请对父目录使用 restorecon -R 命令。
bash
# 递归修复整个目录上下文
restorecon -R /var/www/html
使用 ausearch 命令,搜索 /var/log/audit/audit.log 日志文件中的 AVC 事件。使用 -m 选项指定 AVC 消息类型,并使用 -ts 选项提供时间提示,例如 recent。
bash
# 查看最近的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 问题。