我有一个守护进程(阿帕奇/桑巴/vsftpd/...)在启用 SELinux 的系统上运行,我需要允许它使用非默认位置中的文件。标准文件权限配置为允许访问。
如果守护进程在宽容模式下运行,则一切正常。当重新执行时,它不再起作用,我得到一个SELinux AVC 拒绝消息。
如何配置系统以允许强制模式访问?
答案1
背景
SELinux 在 Linux 系统上添加了另一层权限检查。在启用 SELinux 的系统上,首先检查常规 DAC 权限,如果允许访问,SELinux政策被咨询。如果 SELinux 策略拒绝访问,则会在审核日志/var/log/audit/audit.log
或 dmesg 中生成日志条目(如果auditd
未在系统上运行)。
SELinux 分配一个标签,称为安全上下文,到系统中的每个对象(文件、进程等):
文件将安全上下文存储在扩展属性中。这些可以通过查看
ls -Z
。SELinux 维护一个将路径模式映射到默认文件上下文的数据库。当您需要手动恢复默认文件上下文或重新标记系统时,将使用此数据库。该数据库可以通过以下方式查询
semanage
工具。流程当可执行文件运行时(
execve
系统调用)被分配安全上下文。可以使用大多数系统监控工具查看进程安全上下文,例如使用ps Z $PID
.其他标记的对象也存在,但与此答案无关。
SELinux政策包含规则指定允许上下文之间的哪些操作。 SELinux 运行于白名单规则,任何政策未明确允许的内容都会被拒绝。这参考政策包含许多应用程序的策略模块,它通常是支持 SELinux 的发行版使用的策略。此答案主要描述如何使用基于参考策略的策略,如果您使用发行版提供的策略,您最有可能使用该策略。
当您以普通用户身份运行应用程序时,您可能不会注意到 SELinux,因为默认配置将用户置于无拘无束语境。进程运行于无拘无束context 几乎没有什么限制。您可能能够在不受限制的上下文中在用户 shell 中运行程序而不会出现问题,但是当使用 init 系统启动时,它可能不再在受限制的上下文中工作。
典型问题
当文件位于非默认位置(默认策略中未描述)时,问题通常与以下原因有关:
文件具有不正确/不兼容的文件上下文:移动的文件
mv
保留其元数据,包括旧位置的文件安全上下文。在新位置创建的文件继承了父目录或创建过程的上下文。让多个守护进程使用相同的文件:默认策略不包括允许相关安全上下文之间交互的规则。
安全上下文不正确的文件
如果这些文件不被另一个守护进程(或其他受限进程)使用,并且唯一的更改是文件存储的位置,则 SELinux 配置所需的更改为:
- 将新规则添加到文件上下文数据库
- 将正确的文件上下文应用于现有文件
默认位置上的文件上下文可以用作新位置的模板。大多数策略模块包括手册页文档(使用生成sepolicy manpages
)解释可能的替代文件上下文及其访问语义。
文件上下文数据库使用正则表达式语法,允许编写重叠的规范。值得注意的是,应用上下文是最后找到的规范[来源]。
要将新条目添加到文件上下文数据库:
semanage fcontext -a -t <type> "/path/here/(/.*)?"
将新的上下文条目添加到数据库后,可以使用以下命令将数据库中的上下文应用于您的文件restorecon <files>
。restorecon
使用标志运行-vn
将显示在不应用任何更改的情况下将更改哪些文件上下文。
测试新文件上下文而不在数据库中添加新条目
可以手动更改上下文chcon
工具。当您想要测试新文件上下文而不向文件上下文数据库添加条目时,这非常有用。
新文件上下文在 的参数中指定chcon
。与选项一起使用时--reference=
,参考文件中的安全上下文将复制到目标文件。
使用特定上下文 ( default_t
):
chcon -t default_t <target files>
或使用参考:
chcon --reference=<path to default location> <target files>
关于不同文件系统和挂载点的注意事项
如果新位置是它自己的挂载点,则可以使用安装选项。使用挂载选项设置的上下文不存储在磁盘上,因此它也可以用于不支持扩展属性的文件系统。
mount <device> <mount point> -o context="<context>"
允许在不同安全上下文中运行的进程使用相同的文件
选项 1:布尔值
参考策略包括可调选项,称为布尔值,启用/禁用某些附加规则。其中许多允许不同系统守护进程的互操作,这些守护进程通常不使用相同的文件。
可以使用 列出所有可能的可调选项及其描述的列表semanage boolean -l
。audit2allow
也许还能够直接判断需要启用哪个布尔值。
要启用/禁用布尔值,请使用semanage
:
semanage boolean --on <boolean name>
semanage boolean --off <boolean name>
布尔值是修改策略的最简单方法。但是,并不能通过切换布尔值来解决所有可能的情况。一些布尔值还允许非常广泛的访问,过于宽松。
选项 2:使用新模块扩展策略
如果不存在允许访问的布尔值,则需要通过添加自定义模块来修改策略。
audit2allow
可以使用以下步骤从日志文件生成添加所需规则以允许访问的简单模块:
设置守护进程的领域(安全上下文)到宽容模式。在宽松模式下,政策不是强制执行,但会在策略通常会拒绝的访问上生成日志。
semanage permissive -a <domain>
在正常操作中测试您的守护进程以生成日志条目。
创建一个新的策略模块并将其插入。
audit2allow -a -M <name> semodule -i <name>.pp'
重新启用强制模式
semanage permissive -d <domain>
当仅涉及少量安全上下文时,此方法效果最佳。在复杂的配置中,您很可能必须编写自己的策略模块。一些入门资源是gentoo 维基和参考政策API文档。
答案2
使用此命令:
# semanage fcontext -l /oldpath/
您可以检查系统文件夹中的默认 SElinux 上下文,因此使用该命令您可以查看该守护程序文件夹的默认上下文。
因此,您可以检查应在要将内容移动到的目录中配置的任何 SELinux 上下文。
假设您看到守护程序文件夹具有以下上下文(它是 apache 上下文):
# semanage fcontext -l
...
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
然后,您将像这样将这些上下文应用到新路径(使用 apache 守护程序默认安全上下文的示例)
# semanage fcontext -a -t httpd_sys_content_t '/newpath(/.*)?'
完成此操作后,考虑到您的内容已经位于新路径中,您应该强制该路径下的所有内容以获取该上下文:
# restorecon -RFvv /newpath
您可以使用以下命令检查它是否有效:
# ls -Zd /newpath/
请记住,当您 mv 一个目录或文件时,它会维护安全上下文。当您 cp 一个文件夹或目录时,它会将上下文设置为父目录的上下文。
如果您需要检查特定软件的手册页,可以使用以下命令安装手册页:
# yum install -y selinux-policy-devel
不要忘记执行此命令来重新索引 man 数据库:
# mandb
然后你可以运行这个,并检查所有 selinux 手册页。
# man -k selinux
建议,在安装该软件包之前和之后运行此命令,以查看差异:
# man -k selinux | wc -l
答案3
对于对 SELinux 读/写权限不耐烦的人的快速解答(已添加到 lins 的评论)。
Getenforce # see current mode.
getsebool -a # find al boolean values
Sudo setenforce 0 # shut it down, but its back at reboot -NOT RECOMMENDED other than debug.
永久解决方案如下。
下面的第 2 行可以工作,但无法在重命名和恢复操作中幸存(第 3 行将在此类情况下幸存)。
ls -dZ /var/www/html # See SELinux context of
sudo chcon -R -t httpd_sys_content_t /var/www/html/website-document-root
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
我过去也做过以下操作来授予 apache 写入权限。
Selinux 允许 httpd 读取和写入 /var/www/html/my-project。
sudo chcon -R -t httpd_sys_script_rw_t /var/www/html/my-project/
sudo chcon -R -t httpd_sys_script_rw_t /var/www/my-Symfony-project/var/log/
SELinux 参考资料:
不会重复有关内容或上下文的讨论 - 请参阅上面的答案或上面的链接(毕竟这是为了不耐烦的人):