我有一个正在企业环境中安装的解决方案。该解决方案及其部署指南旨在安装在启用了 SELinux 的 RHEL7/CentOS7 服务器上,并且组件将根据文件系统层次结构标准安装到相应位置。
然而,一位客户让我们感到惊讶,他表示所有第三方解决方案都必须安装到目录中,/apps
因为根据政策,他们会对其进行备份。
为了避免这个特定客户端的偏差,因为这需要对解决方案进行重大修改,我们决定最好的方法是在目录中创建一个新目录,/apps
并/opt
从真实目录中预先创建符号链接/opt
,并将相同的 SELinux 内容应用于它(usr_t
)例如:
ls -laZ /appl/opt
drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0 .
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 ..
drwxr-xr-x. product product unconfined_u:object_r:usr_t:s0 product
la -laZ /opt
drwxr-xr-x. root root system_u:object_r:usr_t:s0 .
dr-xr-xr-x. root root system_u:object_r:root_t:s0 ..
lrwxrwxrwx. root root unconfined_u:object_r:usr_t:s0 product -> /apps/opt/product/
产品的某些组件通过 Apache HTTPD 访问,并且需要将httpd_sys_content_t
上下文应用于它们。
这些文件位于/opt/product/wwwstatic/
(实际上是/apps/opt/product/wwwstatic/
)。
部署指南指定要运行以下命令:
semanage fcontext -a -t httpd_sys_content_t "/opt/product/wwwstatic/*"
restorecon -Rv /opt/product/wwwstatic
它会在标准安装中恢复上下文,但在这个环境中,由于符号链接的原因,它会失败。
如果您修改命令以包含/apps
目录,它可以工作但会偏离通用方法。
的内容/etc/selinux/targeted/contexts/files/file_contexts.local
为:
# This file is auto-generated by libsemanage
# Do not edit directly.
/appl/opt/.* system_u:object_r:usr_t:s0
/appl/srv/.* system_u:object_r:var_t:s0
/opt/product/wwwstatic/* system_u:object_r:httpd_sys_content_t:s0
是否有办法修改semanage
或restorecon
命令的参数,以使其适用于符号链接(以及正常情况下)或者我对 SELinux 如何应用文件上下文存在根本性的误解?
我认为这个问题不同于如何使用 semanage 为符号链接分配 SELinux 标签,以便它在重新标记后仍然有效?因为它是将上下文应用于符号链接目录的子目录中的文件,而不是将上下文应用于符号链接文件本身。
答案1
您可以使用realpath
部署指南中的命令来确保说明是通用的,但将上下文应用于实际文件系统位置,无论其实际位置在哪里。
`realpath "/opt/product/wwwstatic"`
答案2
SELinux 文件上下文根据实际文件系统路径进行匹配。没有“跟随符号链接”。因此您的自定义上下文需要引用磁盘上的实际位置。
第三方应用程序的标准位置是 /opt
,所以你说得对。如果你的客户想做一些非标准的事情,那么你应该向他们明确说明他们这样做是错误的,以及这样做会造成哪些额外的成本(时间和金钱)。
答案3
将 -h 标志与 chcon 一起使用:
chcon -h -v system_u:object_r:httpd_sys_content_t:s0 *