如何用“system_u”标记新创建的文件?

如何用“system_u”标记新创建的文件?

我刚刚为 freetds 创建了一个空白的conf文件,发现权限是错误的:

[root@box etc]# touch freetds.conf.new
[root@box etc]# ll -lZ freetds.conf*
-rw-r--r--. root root system_u:object_r:etc_t:s0   freetds.conf
-rw-rw----. root root unconfined_u:object_r:etc_t:s0   freetds.conf.new

所以我尝试:

[root@box]# semanage fcontext -a -t system_u /etc/freetds.conf.new 

但这失败了:

ValueError: Type system_u is invalid, must be a file or device type

我应该使用什么来将文件 freetds.conf.new 上的标签从 更改为unconfined_usystem_u

答案1

“临时”标签更改是通过以下chcon命令完成的:

bash-4.2# touch freetds.conf.new
bash-4.2# ls -lZ freetds.conf.new
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0   freetds.conf.new
bash-4.2# chcon -t etc_t -u system_u freetds.conf.new 
bash-4.2# ls -lZ freetds.conf.new
-rw-r--r--. root root system_u:object_r:etc_t:s0       freetds.conf.new

永久更改将通过semanage命令完成。这将添加(或修改)一行,/etc/selinux/targeted/contexts/files/file_contexts.local然后可以在其中应用restorecon.

那么,让我们从一个新文件开始:

bash-4.2# rm freetds.conf.new
bash-4.2# touch freetds.conf.new
bash-4.2# ls -lZ freetds.conf.new
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0   freetds.conf.new

我们可以为此添加一条规则:

bash-4.2# semanage fcontext -a -t etc_t -s system_u /etc/freetds.conf.new
bash-4.2# cat /etc/selinux/targeted/contexts/files/file_contexts.local
# This file is auto-generated by libsemanage
# Do not edit directly.

/etc/freetds.conf.new    system_u:object_r:etc_t:s0

但这还没有改变文件

bash-4.2# ls -lZ freetds.conf.new
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0   freetds.conf.new

所以现在我们应用它:

bash-4.2# restorecon -vF /etc/freetds.conf.new
restorecon reset /etc/freetds.conf.new context unconfined_u:object_r:etc_t:s0->system_u:object_r:etc_t:s0
bash-4.2# ls -lZ /etc/freetds.conf.new
-rw-r--r--. root root system_u:object_r:etc_t:s0       /etc/freetds.conf.new

ETA:如果您要在更新后将freetds.conf.new其复制到freetds.conf,那么我可能会坚持使用该chcon命令;它更容易,并且现有规则集在具有正确名称时将处理重新标记。semanage如果这是最终名称,我只会使用该表格。

答案2

Selinux 用户和类型保存在文件属性中。为了使用semanage您需要安装policycoreutils-python-utils软件包(在 RHEL9 中)。使用 semanage 所做的更改将是“持久”的,它将restorecon始终在定义的位置标记此类命名文件。移动后,您将restorecon看到该文件,它将被设置为与当前位置相关的类型(例如,admin_home_t 表示 /root/ 目录,etc_runtime_t 表示 / 中的文件)。对于文件来说,它不再以任何方式“持久”,文件可以在文件系统中自由移动而不会丢失属性(甚至使用cp -a副本 selinux 类型和关联用户进行复制)。因此,使用 semanage 更改文件属性似乎是错误的,因为 /etc/selinux/targeted/contexts/files/file_contexts.local 的结构是文件路径的规则集,除了路径本身之外,未链接到真实文件。chcon将在不使用如此严格的路径数据库的情况下更改文件上下文,并且用它更改的文件上下文将在重新启动、移动和复制(使用 -a)时保持不变,就像从semanage fcontext.

所以大多数情况下的正确答案是使用

chcon -u USER /path/to/files

它根据我们的需要在文件属性中标记文件。

此外,当使用semanage更改关联的selinux用户时,您需要提供selinux类型。当需要创建这样的文件列表以使特定文件始终具有与定义的用户相同的 selinux 标签并且不更改其类型时,您可以使用该命令:

for i in $(find /root/* -type f) ; do semanage fcontext -a -t $(ls -Z $i | awk -F':' '{print $3}') -s SELINUX_USER $i; restorecon -v $i ; done

当文件已经以这种方式标记时,semange fcontext您将收到错误:

ValueError: File context for /root/sth.txy already defined

并且您应该使用 –m(修改)而不是 –a(添加):

[root@box /]# for i in $(find /root/* -type f) ; do semanage fcontext -m -t $(ls -Z $i | awk -F':' '{print $3}') -s SELINUX_USER $i; restorecon -v $i ; done

相关内容