控制 SELinux 文件上下文 初始 SELinux 上下文所有资源如进程、文件和端口都标有 SELinux 上下文。SELinux 在/etc/selinux/targeted/contexts/files/目录中维护基于文件的文件标签策略数据库。新文件在文件名与现有标签策略匹配时获得默认标签。当新文件的名称与现有标签策略不匹配时该文件将继承与父目录相同的标签。使用标签继承时所有文件在创建时始终都带有标签无论文件是否存在显式策略。在具有现有标签策略的默认位置创建文件时或者存在针对自定义位置的策略时新文件将使用正确的 SELinux 上下文进行标记。但是如果在没有现有标签策略的情况下在意外位置创建文件则继承的标签可能不适合新文件的预期用途。此外将文件复制到新位置可能会导致该文件的 SELinux 上下文发生变化新的上下文由新位置的标签策略决定或者从父目录继承如果不存在策略。在复制期间可以保持文件的 SELinux 上下文以保留为文件的原始位置确定的上下文标签。例如在复制过程中cp -p命令会尽可能保留所有文件属性而cp --preservecontext命令则仅保留 SELinux 上下文。以下示例演示了此过程的工作方式。在/tmp目录中创建两个文件。两个文件都获得user_tmp_t上下文类型。将第一个文件移动到/var/www/html目录再将第二个文件复制到这个目录。移动的文件保留从原始/tmp目录标记的文件上下文。复制的文件具有新的索引节点并从目标/var/www/html目录继承 SELinux 上下文。ls -Z命令显示文件的 SELinux 上下文。观察在/tmp目录中创建的文件的标签。[roothost ~]# touch /tmp/file1 /tmp/file2 [roothost ~]# ls -Z /tmp/file* unconfined_u:object_r:user_tmp_t:s0 /tmp/file1 unconfined_u:object_r:user_tmp_t:s0 /tmp/file2ls -Zd命令显示指定目录的 SELinux 上下文。注意/var/www/html目录的标签以及其中的文件。[roothost ~]# ls -Zd /var/www/html/ system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ [roothost ~]# 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目录。将另一个文件复制到同一目录中。注意每个文件生成的标签。[roothost ~]# mv /tmp/file1 /var/www/html/ [roothost ~]# cp /tmp/file2 /var/www/html/ [roothost ~]# 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_tSELinux 上下文来创建目录。[roothost ~]# mkdir /virtual [roothost ~]# ls -Zd /virtual unconfined_u:object_r:default_t:s0 /virtualchcon命令将/virtual目录的文件上下文设置为httpd_sys_content_t类型。[roothost ~]# chcon -t httpd_sys_content_t /virtual [roothost ~]# ls -Zd /virtual unconfined_u:object_r:httpd_sys_content_t:s0 /virtual运行restorecon命令可将上下文重置为默认值default_t。注意 Relabeled 消息。[roothost ~]# restorecon -v /virtual Relabeled /virtual from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 [roothost ~]# ls -Zd /virtual unconfined_u:object_r:default_t:s0 /virtual