调查和解决 SELinux 问题

对 SELinux 问题进行故障排除

当应用因 SELinux 访问遭拒而意外失败时,可以使用一些方法和工具来解决这些问题。在启用 SELinux 时,最好先了解一些基本概念和行为。

  • SELinux 由明确定义允许操作的目标策略组成。
  • 策略条目定义要交互的已标记进程和已标记资源。
  • 通过使用标签,策略声明进程类型以及文件或端口上下文。
  • 策略条目定义一种进程类型、一个资源标签,以及要允许的显式操作。
  • 操作可以是系统调用、内核函数或其他特定的编程例程。
  • 如果没有为特定的进程‑资源操作关系创建条目,则操作将被拒绝。
  • 当某个操作被拒绝时,该次尝试将与实用的上下文信息一起记录下来。

红帽企业 Linux 为发行版中的几乎所有服务提供稳定的目标 SELinux 策略。因此,正确配置了常见 RHEL 服务后,很少会出现与之相关的 SELinux 访问问题。如果服务实施不正确或新应用具有不完整的策略,就会出现 SELinux 访问问题。在进行广泛的 SELinux 配置更改之前,请先考虑这些故障排除概念。

  • 大多数访问拒绝表明 SELinux 通过阻止不当操作来正常工作。
  • 评估遭拒的操作需要对正常的预期服务操作有所了解。
  • 最常见的 SELinux 问题是新的、复制的或移动文件具有不正确的上下文。
  • 当现有策略引用其位置时,可以修复文件上下文。
  • _selinux man 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 问题。

相关推荐
en.en..2 小时前
Linux 七大文件类型 详解
网络
NamoAmitabha1286 小时前
libpng12-0 1.2.54-1ubuntu1.1 (amd64 binary) in ubuntu xenial
linux·ubuntu20.4
IPdodo_6 小时前
跨境 API 调用不稳定怎么办:出口、超时重试与链路监控的实践
网络·python·网络协议
Madison-No76 小时前
搭建项目测试环境
linux·运维·服务器·python
吴声子夜歌7 小时前
Shell编程实例——编写安全的shell脚本(二)
linux·运维·shell
悠悠121388 小时前
微服务通信别只看性能:REST 与 gRPC 的 6 个选型判断和一次 502 故障复盘
运维·服务器
xiaoye-duck9 小时前
《Linux 网络编程》深入理解 IP 协议(二):网段划分、私有 IP 与 NAT 地址转换
linux·网络·ip
云老大-阿里云国际站代理商9 小时前
华为云国际站服务代理商:NAT网关怎么配?多台ECS共用公网IP要注意什么
服务器·华为云·云计算
zx_7414848110 小时前
【Linux入门】Shell 函数、正则表达式与文本处理:cut 与 awk
linux·运维·正则表达式