Portal:SELinux/Troubleshooting

跳转到:导航搜索

这是 SELinux 问题吗?

如果某些功能未按预期工作,例如由于权限被拒绝,SELinux 可能是罪魁祸首。有一些方法可以确定问题是否与 SELinux 有关。

检查审计日志

首先,您可以检查审计日志中是否有 AVC 拒绝条目。如果在日志中看到 AVC 拒绝,这强烈表明问题是由 SELinux 引起的

列出自启动以来的 SELinux 相关审计事件

   # ausearch -ts boot -m avc

除了“boot”之外,其他有用的选项是“today”或“recent”。

审计日志中 AVC 拒绝的示例

   # ausearch -ts recent -m avc -c sshd
   ----
   time->Tue May 18 14:47:47 2021
   type=AVC msg=audit(1621342067.432:82): avc:  denied  { read } for  pid=839 comm="sshd" name="example.com.3" dev="vda2" ino=199155 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:var_yp_t:s0 tclass=file permissive=1
   ----
   time->Tue May 18 14:47:47 2021
   type=AVC msg=audit(1621342067.432:83): avc:  denied  { open } for  pid=839 comm="sshd" path="/var/yp/binding/example.com.3" dev="vda2" ino=199155 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:var_yp_t:s0 tclass=file permissive=1
   [...]

如果在审计日志中看到 AVC 拒绝,请转到 Portal:SELinux/Troubleshooting#Investigating_Denials 部分,以获取有关调查问题的指导。

如果没有 AVC 拒绝,是否仍然可能是 SELinux?

如果没有任何显示,但您想完全排除 SELinux 作为问题,请尝试将 SELinux 临时设置为 permissive 并检查问题是否仍然存在

   setenforce 0

如果 SELinux 设置为 permissive 时问题消失,那么 SELinux 就是罪魁祸首。

要将 SELinux 重新设置为 enforcing,请运行

   setenforce 1

如果出现没有 AVC 拒绝并且禁用 SELinux 可以解决问题的情况,请打开一个 bug。为了方便我们,请将 SELinux 重新设置为 enforcing 并重建策略,而不使用所谓的“dontaudit”规则

   semodule -DB

然后,重新运行您失败的程序。这应该会在审计日志中提供一些 AVC,请将它们包含在您的 bugreport 中。然后,您可以将策略重建回正常状态:

   semodule -B


调查拒绝

一旦您确定存在 SELinux 问题,您可以使用本节中的指示进行调查。如果您无法弄清楚,或者问题不是特定于您的系统,请打开一个 bug

排除由于标签不一致导致的问题

移动文件

SELinux 类型在创建文件时应用。您可以使用 `ls -lZ` 查看这些类型。当文件被移动时,其类型保持不变。一个常见的例子是,如果您使用 scp 将文件复制到服务器上的主目录,它将被标记为 user_home_t。如果您想将该文件移动到 `/var/www/html` 以供 Web 服务器提供服务,该文件将*不会*自动将其类型更改为 httpd_file_t

这是一个特性,旨在防止意外泄露不应泄露的信息。

为了避免这种情况,您可以使用“mv -Z src dst”在移动时更新文件的类型标签为目标位置的默认标签。或者,在移动后,您可以使用 `restorecon -v dst` 将类型重置为目标位置的默认值。

重新标记系统

如果您在系统上看到很多 SELinux 拒绝,标签可能会处于不一致的状态。为了尝试修复它,您可以重新标记系统。这可以手动使用

   touch /.autorelabel
   reboot

或者,您可以触发重新标记(这将重新启动您的系统):

   systemctl start selinux-autorelabel

使用 audit2why 深入挖掘

SELinux 可能会拒绝访问的原因有很多,这些原因并非由于系统的不一致性。在确保问题不是由不一致性引起的之后,最容易获得提示的方法是使用 audit2why 工具

来自 policycoreutils-python-utils 包的 audit2why 可以将 ausearch 提供的格式的审计日志输出进行管道传输,从而可能给出一些解释。例如,该工具可能会建议启用一个布尔值

   ausearch -ts recent -m avc | audit2why
   Was caused by:
   The boolean nis_enabled was set incorrectly. 
   Description:
   Allow nis to enabled
   
   Allow access by executing:
   # setsebool -P nis_enabled 1

如果您理解建议和潜在的风险,您可以启用该布尔值。

设置 SELinux 布尔值

SELinux 布尔值是作为管理员调整 SELinux 行为的预期方式(请参阅“man 8 booleans”)。要获取布尔值的描述,您可以运行 semanage(来自 policycoreutils-python-utils 包),要查看布尔值所做的更改,您可以运行 sesearch(来自 setools-console)

semanage boolean -l | grep nis_enabled
sesearch -A -b nis_enabled

要设置布尔值,您可以使用

setsebool -P nis_enabled 1

设置布尔值后,上面的示例问题应该得到解决。

audit2allow

危险区域! 我们不建议初学者使用!这可能会添加过于宽泛的规则,从而破坏 SELinux 提供的安全性或导致更多 SELinux 问题。只有在您知道自己在做什么时才这样做!如果您有疑问,请打开一个 bug

audit2why 给出的另一个建议可能如下所示

  Was caused by:
               Missing type enforcement (TE) allow rule.
               You can use audit2allow to generate a loadable module to allow this access.

这建议使用 audit2allow(来自 policycoreutils-python-utils 包)生成新规则。

audit2allow 工具使用审计消息生成可以加载到 SELinux 中的规则,在转换为正确的格式之后。

例如,在文件 `my_avc` 中有这个 AVC

   type=AVC msg=audit(1621342040.556:15): avc:  denied  { watch } for  pid=1 comm="systemd" path="/var/cache/cups" dev="vda2" ino=22stem_r:init_t:s0 tcontext=system_u:object_r:cupsd_rw_etc_t:s0 tclass=dir permissive=1

audit2allow 会建议这个规则

   cat my_avc | audit2allow
   #============= init_t ==============
   allow init_t cupsd_rw_etc_t:dir watch;

临时问题

记录会随着时间推移而消失并可能需要临时/一次性修复的问题。

将 libselinux 更新到版本 3.8

用户空间工具更新到版本 3.8 的一部分是文件上下文的二进制文件格式的更改,这可能导致 libselinux 出现以下错误消息

  /etc/selinux/targeted/contexts/files/file_contexts.bin:  Old compiled fcontext format, skipping
  /etc/selinux/targeted/contexts/files/file_contexts.homedirs.bin:  Old compiled fcontext format, skipping

可以通过运行以下命令修复临时错误:

  semodule -B

下次更新 selinux-policy 时,问题将自动修复。