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

前端之家收集整理的这篇文章主要介绍了SELinux – 在文件创建时自动应用上下文的规范方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前的理解是,您必须手动使用restorecon将所需的上下文应用于新创建的文件或目录,除非您对从其父目录继承的上下文感到满意.

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

我用谷歌搜索了一下,在Dan Walsh找到了this post,他提到了restorecond,它使用inotify来改变创作的背景.他还指出了它的明显问题(竞争条件).这是自动解决重新上下文问题的唯一方法,以防孩子不应该从父目录继承其上下文吗?

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

/var/www(/.*)?/logs(/.*)?

要么

/var/www/*

甚至

/var/www/*/logs

有办法解决这个问题吗?

编辑:

根据@ Michael的回答,如果存在相应的规则,这应该适用于OOTB,但它不会:

# 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

解决方法

内核通过以下过程来确定新创建的文件文件类型.

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

在绝大多数情况下,新文件继承父目录类型.有时这是不可取的 – 因此策略编写者可以根据谁在进行标记以及转换到另一种类型的条件来创建规则.

这是使用type_transition语句在策略中控制的,尽管通常策略编写器将调用filetrans_pattern宏.

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

规则通常如下所示;

type_transition httpd_t var_log_t:file httpd_var_log_t;

在此示例中,规则说明了这一点.如果执行文件创建的进程/用户是httpd_t并且正在创建对象的目录是var_log_t并且该对象被分类文件,则新文件必须标记为httpd_var_log_t.

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

这是一个众所周知的问题,并且最终通过允许策略编写者指定转换在策略中应用的文件名来解决 – 遗憾的是,这些功能在EL6中不可用.

在您的具体情况下 – 正如您所提到的,有一些涉及restorecond的变通方法.除此之外,理想情况下,您应该将数据分成不同类型,方法是将它们放在单独的子目录中,子目录是一个充分标记的类型.如果仍然无法实现这一点,则无法实现restorecond – 唯一的解决方案是在创建文件后对文件运行restorecon进行修复后.

即使是“较新的”命名文件传输也存在问题,因为它最终不支持globbing或regex,这严重限制了它的功能,特别是命名良好的文件(如.htaccess).

就目前而言,没有内核机制像restorecon一样灵活,它的正则表达式可以正确地将文件正确地标记到那个程度.

猜你在找的Linux相关文章