SELinux 故障排除

SELinux 是最强大的安全功能之一 Fedora 系统。 它就像您的计算机服务的代客钥匙,只允许他们访问批准的数据。 SELinux 已经不再因其早期的困难而闻名。 现在,它为大多数流行的应用程序提供了可调策略,并提供了额外的安全性和信心。 但是,有时确实会发生错误,本文将帮助您处理这些错误。

假设

本文假设两件事:

  1. 您了解 SELinux 的基础知识。 如果您还没有学习 SELinux 的基础知识,现在是学习的好时机。 最好的引物之一 这是 Thomas Cameron 的视频吗. 花点时间观看并理解它。
  2. 您在强制模式下使用 SELinux。 强制模式是正常和预期的运行方式 Fedora. 如果您已禁用 SELinux,则需要启用它。 编辑 /etc/sysconfig/selinux 文件以设置 SELINUX=permissive。 首先使用许可模式可确保任何根本问题仍然可以通过以下命令自动修复。 然后执行以下操作:
    sudo fixfiles -F onboot
    reboot

    启动过程可能需要比平时更长的时间,因为 SELinux 会重新标记在禁用时创建的任何文件。 这在非常大的文件系统上可能需要一段时间,所以请耐心等待。

如果您在禁用模式下运行了一段时间,在重新标记后开始看到错误,请不要感到惊讶。 在禁用模式下运行就像墙纸泄漏。 当您移除墙纸时,您可能会发现水损坏。 同样,如果您一直在没有启用 SELinux 的情况下运行,您可能会产生更多现在需要解决的问题。

机器重新启动后,您可以切换到强制模式:

sudo setenforce 1

真的是SELinux吗?

判断 SELinux 是否因错误而出错的一个好方法是设置许可模式。 这意味着 SELinux 会记录错误,但仍允许活动。 为此,请运行以下命令:

sudo setenforce 0

然后再次尝试该过程,如果需要,在另一个终端中。 如果现在成功,则 SELinux 策略有问题。 要查找过去 10 分钟内的错误,请使用 ausearch 命令:

sudo ausearch -m AVC,USER_AVC,SELINUX_ERR -ts recent

如果进程在许可模式下仍然失败,则问题可能不是 SELinux 策略。 在这种情况下,请确保运行 sudo setenforce 1 返回强制模式。 记住这个设置是 全球的,所以你不想在任何地方放弃策略执行!

确定问题

您通常可以通过 AVC 消息识别 SELinux 错误。 AVC 消息的参数之一是生成消息的命令。 为了 example,您可能会在有关 SELinux 错误的消息中看到 comm=”/usr/sbin/httpd” Apache 网络服务器。

该问题还将告诉您系统的执行部分的源上下文(scontext),以及它尝试执行的对象的目标上下文(tcontext)。 通常,但并非总是如此,源是二进制文件,目标是文件。 要更好地了解错误,您可以使用 SELinux 疑难解答。 您可以从软件工具安装它 Fedora 工作站,或使用 sudo 在终端中使用 dnf:

sudo dnf install setroubleshoot

要启动程序,请使用概述 Fedora 用于定位 SELinux 故障排除程序的工作站,或从终端运行:

sealert

您可以在出现的浏览器中找到最近的警报:

在这个屏幕上,对于 example,您可以列出系统上存在的所有警报,以系统地对其进行故障排除。

解决问题

当您选择疑难解答时,您会看到多个错误选项。

在这种情况下,用户在其主目录中创建了一个 index.html 文件,并使用 mv 命令将其放入 /var/www/html/ 以供 Apache 网络服务器。 将 Web 浏览器指向 https://localhost/index.html 后,发生此错误。

请注意每个选项怎样为您提供一组特定的命令,您可以运行这些命令来解决问题。 在这种情况下,您可以启用一个布尔开关以允许将来的活动,即使 SELinux 正在执行策略。

然而,仅仅因为存在一个布尔值 不代表 你应该在不理解它的情况下启用它。 在这种情况下,如果您打开布尔值,则 Apache Web 服务器将能够读取文件权限允许的任何用户内容。 所以在这种情况下,我们可能会问,“为什么文件有那个上下文?” 在这种情况下,这是因为用户移动了文件。 这意味着文件将其旧上下文带到新位置,而不是接收允许 Web 服务器读取 /var/www/html 中的内容的新默认上下文。

在这种情况下,最好的办法是简单地恢复文件的正确上下文:

sudo restorecon -rv /var/www/html/index.html
Relabeled /var/www/html/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0

关于 SELinux 布尔值的说明

有许多可用的布尔值。 每一个都允许您设置一个广泛的访问权限类别,应用程序可能会期望这些访问权限才能正常运行。 要查看整个列表及其当前设置,请运行以下命令:

semanage boolean -l

如果你先安装了 selinux-policy-devel 包,你还可以在运行上面的命令时看到每个布尔值的简短描述:

SELinux boolean State Default Description

abrt_anon_write (off , off) Allow ABRT to modify public files used for public file transfer services.
abrt_handle_event (off , off) Determine whether ABRT can run in the abrt_handle_event_t domain to handle ABRT event scripts.
abrt_upload_watch_anon_write (on , on) Determine whether abrt-handle-upload can modify public files used for public file transfer services in /var/spool/abrt-upload/.
antivirus_can_scan_system (off , off) Allow antivirus programs to read non security files on a system
...

要临时设置布尔值,请运行此命令,其中 boolname 是布尔值的名称,值为 on 或 1,或 off 或 0。

setsebool boolname=value

要永久设置它,请添加 -P 开关:

setsebool -P boolname=value

结论

您还可以使用 SELinux Troubleshooter 执行其他功能,例如为您自己的系统创建特定的策略模块。 你可能会发现这个 SELinux 指南 有助于理解这些功能。

拍摄者 克里斯蒂娜·戈塔迪不飞溅