SELinux - 在文件创建时自动应用上下文的规范方法

Adr*_*rth 7 selinux

我目前的理解是,restorecon除非您对它从其父目录继承的上下文感到满意,否则您必须手动使用将所需的上下文应用于新创建的文件或目录。

我想知道是否可以根据其路径在创建时自动应用上下文而无需运行restorecon.

我用Google搜索了一下,发现这个帖子由丹·沃尔什,他提到restorecond它使用inotify到创作变化背景下。他还指出了它的明显问题(竞争条件)。这是在子目录不应从父目录继承其上下文的情况下自动解决重新上下文问题的唯一方法吗?

一个问题是它restorecond似乎不像 那样处理条目/etc/selinux/targeted/contexts/files/file_contexts,也就是说,没有正则表达式并且它不能递归地工作,所以/etc/selinux/restorecond.conf不能包含类似的东西

/var/www(/.*)?/logs(/.*)?
Run Code Online (Sandbox Code Playgroud)

或者

/var/www/*
Run Code Online (Sandbox Code Playgroud)

甚至

/var/www/*/logs
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个问题?

编辑:

根据@Michael的回答,如果存在相应的规则,这应该可以正常工作,但它没有:

# rm -rf /var/www/foo
# semanage fcontext -a -t httpd_log_t '/var/www/foo/logs'
# grep '/var/www.*logs' /etc/selinux/targeted/contexts/files/file_contexts*
/etc/selinux/targeted/contexts/files/file_contexts:/var/www(/.*)?/logs(/.*)?    system_u:object_r:httpd_log_t:s0
/etc/selinux/targeted/contexts/files/file_contexts.local:/var/www/foo/logs    system_u:object_r:httpd_log_t:s0
# matchpathcon /var/www/foo/logs
/var/www/foo/logs       system_u:object_r:httpd_log_t:s0
# mkdir -p /var/www/foo/logs
# touch /var/www/foo/logs/quux
# ls -alZ /var/www/foo/logs*
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 .
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 ..
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 quux
# restorecon -vR /var/www/foo
restorecon reset /var/www/foo/logs context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:httpd_log_t:s0
restorecon reset /var/www/foo/logs/quux context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:httpd_log_t:s0
Run Code Online (Sandbox Code Playgroud)

Mat*_*Ife 9

内核执行以下过程来确定新创建的文件的文件类型。

  • 策略中存在特定的文件转换规则。所以应用这个。
  • 使新创建的文件获取父目录的类型。

在绝大多数情况下,新文件继承父目录类型。有时这是不可取的——所以策略制定者可以根据谁在做标签以及在哪里转换到另一种类型的条件来创建规则。

这是在策略中用type_transition语句控制的,尽管通常策略编写者会调用filetrans_pattern宏。

在内核中,这些决定不是基于路径而是基于类型(尽管在较新的策略中存在一个小例外)。

规则通常如下所示;

type_transition httpd_t var_log_t:file httpd_var_log_t;

在本例中,规则规定了这一点。如果执行文件创建的进程/用户是httpd_t并且正在创建对象的目录是var_log_t并且对象归类为file,则新文件必须标记为httpd_var_log_t

这当然有许多限制,一个很好的例子就是在 apache(在 /var/www/html 中)创建 .htaccess 文件时的条件。在此示例中,创建与其父目录类型相同的文件类型的默认策略适用,但实际上此文件的正确类型httpd_sys_htacess_t不是httpd_sys_content_t.

这是多年来的一个已知问题,最终通过允许策略编写者在策略中指定转换适用的文件名来解决——不幸的是,EL6 中不提供此功能。

在您的特定情况下 - 正如您所提到的,有一些涉及 restorecond 的解决方法。除此之外,理想情况下,您应该将数据分成不同的类型,方法是将它们放在单独的子目录中,其中子目录是充分标记的类型。如果这仍然不可能,并且 restorecond 是不可能的——唯一的解决方案是在文件创建后对文件运行 restorecon 的后修复。

即使是“较新的”命名的 filetrans 也有问题,因为它最终不支持通配符或正则表达式,这严重限制了其功能仅限于命名良好的文件(如 .htaccess)。

就目前而言,不存在像restorecon它的正则表达式那样灵活的内核机制来正确地正确标记文件到那个程度。