配置 SELinux 以允许守护进程使用非默认位置的文件

seb*_*sth 8 linux permissions selinux

我有一个守护进程(apache/samba/vsftpd/...)在启用 SELinux 的系统上运行,我需要允许它在非默认位置使用文件。标准文件权限配置为允许访问。

如果守护程序以许可模式运行,则一切正常。当设置回强制执行时,它不再起作用,并且我收到一条SELinux AVC 拒绝消息

如何配置系统以允许在强制模式下访问?

seb*_*sth 17

背景

SELinux 在 Linux 系统上添加了另一层权限检查。在启用 SELinux 的系统上,首先检查常规 DAC 权限,如果它们允许访问,则咨询SELinux策略。如果 SELinux 策略拒绝访问,则会在审核登录/var/log/audit/audit.log或 dmesg(如果auditd未在系统上运行)中生成日志条目。

SELinux 为系统中的每个对象(文件、进程等)分配一个名为security context的标签:

  • 文件具有存储在扩展属性中的安全上下文。这些可以查看ls -Z

    SELinux 维护一个数据库映射路径模式到默认文件上下文。当您需要手动恢复默认文件上下文或重新标记系统时,将使用此数据库。这个数据库可以用semanage工具查询。

  • 当可执行文件运行时,进程会被分配一个安全上下文(execve系统调用)。可以使用大多数系统监控工具查看进程安全上下文,例如使用ps Z $PID.

  • 其他标记对象也存在,但与此答案无关。

SELinux策略包含指定允许在上下文之间进行哪些操作的规则。SELinux 根据白名单规则运行,拒绝策略未明确允许的任何内容。在参考政策包含策略模块,对于许多应用,它通常是启用分布SELinux所使用的策略。此答案主要描述了如何使用基于参考策略的策略,如果您使用分发提供的策略,您最有可能使用该策略。

当您以普通用户身份运行应用程序时,您可能不会注意到 SELinux,因为默认配置将用户置于不受限制的上下文中。在无限制上下文中运行的进程几乎没有限制。您可能能够在不受限制的上下文中在用户 shell 中运行您的程序而不会出现问题,但是当使用 init 系统启动时,它可能不再在受限制的上下文中工作。

典型问题

当文件位于非默认位置(默认策略中未描述)时,问题通常与以下原因有关:

  • 文件具有不正确/不兼容的文件上下文:移动的文件mv保留其元数据,包括旧位置的文件安全上下文。在新位置创建的文件继承了父目录或创建过程的上下文。

  • 让多个守护进程使用相同的文件:默认策略不包括允许相关安全上下文之间交互的规则。

安全上下文不正确的文件

如果文件未被另一个守护进程(或其他受限进程)使用,并且唯一的变化是文件存储的位置,则对 SELinux 配置所需的更改是:

  • 向文件上下文数据库添加新规则
  • 将正确的文件上下文应用于现有文件

默认位置上的文件上下文可用作新位置的模板。大多数策略模块都包含手册页文档(使用 生成sepolicy manpages),解释可能的替代文件上下文及其访问语义。

文件上下文数据库使用正则表达式语法,允许编写重叠规范。值得注意的是,应用上下文是最后找到的规范[src]

向文件上下文数据库添加新条目:

semanage fcontext -a -t <type> "/path/here/(/.*)?"
Run Code Online (Sandbox Code Playgroud)

将新的上下文条目添加到数据库后,可以使用restorecon <files>. restorecon使用-vn标志运行将显示在不应用任何更改的情况下将更改哪些文件上下文。

测试新的文件上下文而不在数据库中添加新条目

可以使用chcon工具手动更改上下文。当您想测试新的文件上下文而不向文件上下文数据库添加条目时,这很有用。

新文件上下文在 的参数中指定chcon。与--reference=option 一起使用时,参考文件中的安全上下文将复制到目标文件中。

使用特定上下文 ( default_t):

chcon -t default_t <target files>
Run Code Online (Sandbox Code Playgroud)

或使用参考:

chcon --reference=<path to default location> <target files>
Run Code Online (Sandbox Code Playgroud)

关于不同文件系统和挂载点的注意事项

如果新位置是它自己的挂载点,则可以使用挂载选项设置上下文。使用 mount 选项设置的上下文不存储在磁盘上,因此它也可以用于不支持扩展属性的文件系统。

mount <device> <mount point> -o context="<context>"
Run Code Online (Sandbox Code Playgroud)

允许在不同安全上下文中运行的进程使用相同的文件

选项 1:布尔值

参考策略包括可调选项,称为布尔值,可启用/禁用某些附加规则。它们中的许多允许不同系统守护进程的互操作,这些守护进程通常不使用相同的文件。

可以使用 列出所有可能的可调选项及其描述的列表semanage boolean -laudit2allow也许还可以直接告诉需要启用哪个布尔值。

使用semanage以下方法启用/禁用布尔值:

semanage boolean --on <boolean name>
semanage boolean --off <boolean name>
Run Code Online (Sandbox Code Playgroud)

布尔值是修改策略的最简单方法。但是,无法通过切换布尔值来解决所有可能的情况。一些布尔值还允许非常广泛的访问,过于宽松。

选项 2:使用新模块扩展策略

如果不存在允许访问的布尔值,则需要通过添加自定义模块来修改策略。

可以使用audit2allow以下步骤从日志文件生成添加所需规则以允许访问的简单模块:

  1. 将守护进程的(安全上下文)设置为permissive mode。在许可模式下,不强制执行该策略,但会在该策略通常拒绝的访问上生成日志。

    semanage permissive -a <domain>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在正常操作中测试您的守护程序以生成日志条目。

  3. 创建一个新的策略模块并插入它。

    audit2allow -a -M <name>
    semodule -i <name>.pp'
    
    Run Code Online (Sandbox Code Playgroud)
  4. 重新启用强制模式

    semanage permissive -d <domain>
    
    Run Code Online (Sandbox Code Playgroud)

当只涉及几个安全上下文时,此方法最有效。在复杂的配置中,您很可能必须编写自己的策略模块。一些入门资源是gentoo wiki参考策略 API文档。