初始 SELinux 上下文
所有资源(如进程、文件和端口)都标有 SELinux 上下文。SELinux 在 /etc/selinux/targeted/contexts/files/ 目录中维护基于文件的文件标签策略数据库。新文件在文件名与现有标签策略匹配时获得默认标签。
当新文件的名称与现有标签策略不匹配时,该文件将继承与父目录相同的标签。使用标签继承时,所有文件在创建时始终都带有标签,无论文件是否存在显式策略。
在具有现有标签策略的默认位置创建文件时,或者存在针对自定义位置的策略时,新文件将使用正确的 SELinux 上下文进行标记。但是,如果在没有现有标签策略的情况下在意外位置创建文件,则继承的标签可能不适合新文件的预期用途。
此外,将文件复制到新位置可能会导致该文件的 SELinux 上下文发生变化,新的上下文由新位置的标签策略决定,或者从父目录继承(如果不存在策略)。在复制期间可以保持文件的 SELinux 上下文,以保留为文件的原始位置确定的上下文标签。例如,在复制过程中,cp -p 命令会尽可能保留所有文件属性,而 cp --preserve=context 命令则仅保留 SELinux 上下文。
以下示例演示了此过程的工作方式。
在 /tmp 目录中创建两个文件。两个文件都获得 user_tmp_t 上下文类型。
将第一个文件移动到 /var/www/html 目录,再将第二个文件复制到这个目录。
- 移动的文件保留从原始
/tmp目录标记的文件上下文。 - 复制的文件具有新的索引节点,并从目标
/var/www/html目录继承 SELinux 上下文。
ls -Z 命令显示文件的 SELinux 上下文。观察在 /tmp 目录中创建的文件的标签。
bash
[root@host ~]# touch /tmp/file1 /tmp/file2
[root@host ~]# ls -Z /tmp/file*
unconfined_u:object_r:user_tmp_t:s0 /tmp/file1
unconfined_u:object_r:user_tmp_t:s0 /tmp/file2
ls -Zd 命令显示指定目录的 SELinux 上下文。注意 /var/www/html 目录的标签以及其中的文件。
bash
[root@host ~]# ls -Zd /var/www/html/
system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
[root@host ~]# ls -Z /var/www/html/index.html
unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
将一个文件从 /tmp 目录移至 /var/www/html 目录。将另一个文件复制到同一目录中。注意每个文件生成的标签。
bash
[root@host ~]# mv /tmp/file1 /var/www/html/
[root@host ~]# cp /tmp/file2 /var/www/html/
[root@host ~]# ls -Z /var/www/html/file*
unconfined_u:object_r:user_tmp_t:s0 /var/www/html/file1
unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file2
移动的文件保留其原始标签,复制的文件则继承目标目录标签。unconfined_u 是 SELinux 用户角色,object_r 是 SELinux 角色,而 s0 则是(最低可能的)敏感度级别。高级 SELinux 配置和功能使用这些值。
更改 SELinux 上下文
您可以使用 semanage fcontext、restorecon 和 chcon 命令管理文件的 SELinux 上下文。
为文件更改上下文的建议方法是,使用 semanage fcontext 命令创建文件上下文策略,然后使用 restorecon 命令将策略中指定的上下文应用到文件。此方法确保您可以在必要时使用 restorecon 命令将文件重新标记为正确的上下文。这种方法的优点是您不需要记住上下文应该是什么,而且您可以更正一组文件的上下文。
chcon 命令直接在文件上更改 SELinux 上下文,不引用系统的 SELinux 策略。虽然 chcon 可用于测试和调试,但使用此方法手动更改上下文是暂时的。虽然您可以手动更改的文件上下文在重启后仍然有效,但如果您运行 restorecon 来重新标记文件系统的内容,则上下文可能会被替换掉。
以下示例使用从 / 父目录继承的 default_t SELinux 上下文来创建目录。
bash
[root@host ~]# mkdir /virtual
[root@host ~]# ls -Zd /virtual
unconfined_u:object_r:default_t:s0 /virtual
chcon 命令将 /virtual 目录的文件上下文设置为 httpd_sys_content_t 类型。
bash
[root@host ~]# chcon -t httpd_sys_content_t /virtual
[root@host ~]# ls -Zd /virtual
unconfined_u:object_r:httpd_sys_content_t:s0 /virtual
运行 restorecon 命令可将上下文重置为默认值 default_t。注意 Relabeled 消息。
bash
[root@host ~]# restorecon -v /virtual
Relabeled /virtual from unconfined_u:object_r:httpd_sys_content_t:s0 to
unconfined_u:object_r:default_t:s0
[root@host ~]# ls -Zd /virtual
unconfined_u:object_r:default_t:s0 /virtual