15 个用于更改安全上下文的 SELinux chcon 命令示例

举报
Tiamo_T 发表于 2021/10/13 09:53:59 2021/10/13
【摘要】 在 SELinux 中,您可能执行的一项常见任务是更改对象的安全上下文。为此,您将使用 chcon 命令。chcon 代表更改上下文,此命令用于更改文件的 SELinux 安全上下文。本文用15个示例解释了以下 chcon 命令:更改完整的 SELinux 上下文使用另一个文件作为参考更改上下文仅更改 SELinux 上下文中的用户仅更改 SELinux 上下文中的角色仅更改 SELinux...

在 SELinux 中,您可能执行的一项常见任务是更改对象的安全上下文。为此,您将使用 chcon 命令。

chcon 代表更改上下文,此命令用于更改文件的 SELinux 安全上下文。

本文用15个示例解释了以下 chcon 命令:

  1. 更改完整的 SELinux 上下文
  2. 使用另一个文件作为参考更改上下文
  3. 仅更改 SELinux 上下文中的用户
  4. 仅更改 SELinux 上下文中的角色
  5. 仅更改 SELinux 上下文中的类型
  6. 仅更改 SELinux 上下文中的范围
  7. 在 chcon 中组合用户、角色、类型、级别
  8. Chcon 在符号链接上的默认行为
  9. 强制更改符号链接的 SELinux 上下文
  10. 递归更改 SELinux 上下文
  11. 显示 chcon 操作的详细详细信息
  12. 递归符号链接上的 Chcon 默认行为
  13. 强制 chcon 为递归遍历指定的符号链接
  14. 强制 chcon 遍历所有符号链接以进行递归
  15. 系统范围更改的 / 根目录上的 Chcon 行为


1. 更改完整的 SELinux 上下文

要查看文件的安全上下文,请在 ls 命令中使用 -Z(大写 Z)选项,如下所示。

# ls -lZ httpd.conf
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 httpd.conf

在上面的例子中,httpd.conf 文件的安全上下文如下:


unconfined_u:object_r:admin_home_t:s0

这是 /etc/httpd/conf 目录下 httpd.conf 文件的错误 SELinux 上下文。

因此,要更改安全上下文,请使用以下 chcon 命令。

# chcon system_u:object_r:httpd_config_t:s0 httpd.conf

在上面的示例中,我们将 httpd.conf 文件的安全上下文更改为以下内容,这是正确的。

system_u:object_r:httpd_config_t:s0

我们可以使用以下 ls -lZ 命令来验证这一点。

# ls -lZ httpd.conf
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 httpd.conf

注意:在上面的例子中,我们以 user:role:type:range 的格式给出了文件的完整 SELinux 上下文(即用户、角色、类型和范围),而没有进一步打破它。

2. 使用另一个文件作为参考更改上下文

有时您可能不知道应该为文件设置什么 SELinux 上下文。

在这种情况下,您可以使用另一个文件的安全上下文作为参考,并将其分配给您的文件。

基本上,您不是为文件指定完整的 SELinux 上下文,而是为您的文件使用另一个文件的上下文。

在下面的例子中,我们看到 ssl.conf 和 httpd.conf 都有不同的 SELinux 上下文。

# ls -lZ
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 ssl.conf
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 httpd.conf

在这种情况下,我们知道 ssl.conf 文件具有正确的安全上下文。但是,httpd.conf 有一个不正确的。

因此,我们将更改 httpd.conf 文件的安全上下文,但我们将使用 ssl.conf 的上下文作为此更改的参考,如下所示。

# chcon --reference=ssl.conf httpd.conf

经过上面的改动,可以看到httpd.conf文件和ssl.conf文件的安全上下文是一样的。

# ls -lZ
-rw-r--r--。root root system_u:object_r:httpd_config_t:s0 ssl.conf
-rw-r--r--。root root system_u:object_r:httpd_config_t:s0 httpd.conf

在相关说明中,要查看 SELinux 的当前状态,请使用 sestatus 命令。

3. 只更改 SELinux 上下文中的 USER

除了更改整个 SELinux 安全上下文之外,我们还可以仅更改它的部分值。

以下是 httpd.conf 文件的当前安全上下文。

# ls -lZ httpd.conf 
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 httpd.conf

在上面的示例中,“unconfined_u”是安全上下文的 USER 部分。

使用 chcon -u 选项,我们只能更改安全上下文的用户部分。

在以下示例中,我们将 httpd.conf 文件的安全上下文的用户部分设置为 system_u。

# chcon -u system_u httpd.conf

正如您从以下输出中看到的,只有 httpd.conf 文件的安全上下文的 USER 部分发生了更改。

# ls -lZ httpd.conf
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 httpd.conf

您还可以使用 –user 代替 -u。以下两个命令完全相同。

# chcon --user system_u httpd.conf

# chcon -u system_u httpd.conf

4. 只更改 SELinux Context 中的 ROLE

使用 chcon -r 选项,我们只能更改安全上下文的 ROLE 部分。

在以下示例中,我们将 httpd.conf 文件的安全上下文的角色部分设置为 object_r。

# chcon -r object_r httpd.conf

正如您从以下输出中看到的,只有 httpd.conf 文件的安全上下文的 ROLE 部分发生了更改。

# ls -lZ httpd.conf
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 httpd.conf

当您提供一个 SELinux 无法识别的角色时,您将收到以下无效参数错误。在这个例子中,没有“identity_r”这样的角色。

# chcon -r identity_r httpd.conf
chcon: failed to change context of ‘httpd.conf’ to ‘system_u:identity_r:admin_home_t:s0’: Invalid argument

您还可以使用 –role 代替 -r。以下两个命令完全相同。

# chcon --role object_r httpd.conf

# chcon -r object_r httpd.conf

5. 只更改 SELinux Context 中的 TYPE

这可能是您最常使用的,因为在典型的 SELinux 设置中,TYPE 是我们大多数时候关心的。

以下是 httpd.conf 文件的当前安全上下文。

# ls -lZ httpd.conf 
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 httpd.conf

在上面的示例中,“admin_home_t”是安全上下文的 TYPE 部分。

使用 chcon -t 选项,我们只能更改安全上下文的类型部分。

在以下示例中,我们将安全上下文的类型部分设置为 httpd.conf 文件的 httpd_config_t。

# chcon -t httpd_config_t httpd.conf

正如您从以下输出中看到的,只有 httpd.conf 文件的安全上下文的 TYPE 部分发生了更改。

# ls -lZ httpd.conf
-rw-r--r--。root root system_u:object_r:httpd_config_t:s0 httpd.conf

您也可以使用 –type 代替 -t。以下两个命令完全相同。

# chcon -t httpd_config_t httpd.conf

# chcon --type httpd_config_t httpd.conf

6. 只更改 SELinux Context 中的 RANGE (Level)

使用 chcon -l 选项,我们只能更改安全上下文的 RANGE 部分(也称为级别)。范围仅在 MLS 中使用,在典型情况下,我们可能不会更改范围。

在以下示例中,我们将 httpd.conf 文件的安全上下文的范围部分设置为“s0”。

# chcon -l s0 httpd.conf

正如您从以下输出中看到的,只有 httpd.conf 文件的安全上下文的 ROLE 部分发生了更改。

# ls -lZ httpd.conf
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 httpd.conf

您还可以使用 –range 代替 -l。以下两个命令完全相同。

# chcon -l s0 httpd.conf

# chcon --range s0 httpd.conf

7.在chcon中结合User、Role、Type、Level

您可以在 chcon 中组合用户 (-u)、角色 (-r)、类型 (-t) 或级别 (-l) 选项。

例如,以下将更改所有四个,如下所示。

# chcon -u system_u -r object_r -t httpd_config_t -l s0 httpd.conf

或者,您可以混合搭配并一次只更改其中的几个。例如,在以下示例中,我们仅更改 httpd.conf 文件的 USER 和 TYPE。

# chcon -u system_u -t httpd_config_t httpd.conf

8. Chcon 在符号链接上的默认行为

在以下示例中,apache.conf 是指向 httpd.conf 文件的符号链接。它们都有错误的安全上下文。

# ls -lZ
lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 apache.conf -> httpd.conf
-rw-r--r--. unconfined_u:object_r:admin_home_t:s0 httpd.conf

在以下示例中,我正在更改 apache.conf 符号链接的 USER 和 TYPE。

# chcon -u system_u -t httpd_config_t apache.conf

但是,正如您在此处看到的,这确实更改了它指向的文件的 SELinux 上下文,而不是更改符号链接的上下文。

# ls -lZ
lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 apache.conf -> httpd.conf
-rw-r--r--. system_u:object_r:httpd_config_t:s0 httpd.conf

这是 chcon 命令的默认行为。即它将改变它指向的文件的上下文而不是符号链接本身。

这种行为称为取消引用。Chcon 有一个名为 –dereference 的选项,它将更改文件而不是符号链接。

下面的两个例子完全一样。

# chcon -u system_u -t httpd_config_t apache.conf

# chcon --dereference -u system_u -t httpd_config_t apache.conf

9.强制改变符号链接的SELinux上下文

除了更改符号链接引用的文件的安全上下文之外,您还可以强制 chcon 更改符号链接本身的上下文。

在以下示例中,apache.conf 是指向 httpd.conf 文件的符号链接。它们都有错误的安全上下文。

# ls -lZ
lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 apache.conf -> httpd.conf
-rw-r--r--. unconfined_u:object_r:admin_home_t:s0 httpd.conf

当我们在 chcon 中指定 –no-dereference 选项时,它将更改符号链接的上下文,而不是它指向的文件。

因此,以下示例将更改 apache.conf 符号链接(而不是 httpd.conf 文件)的 USER 和 TYPE。

# chcon --no-dereference -u system_u -t httpd_config_t apache.conf

从下面可以看出,只有 apache.conf 符号链接的 SELinux 上下文更改为我们上面指定的上下文。

# ls -lZ
lrwxrwxrwx. system_u:object_r:httpd_config_t:s0 apache.conf -> httpd.conf
-rw-r--r--. unconfined_u:object_r:admin_home_t:s0 httpd.conf

除了 –no-dereference,我们还可以指定 '-h' 选项,如下所示。

以下两个命令完全相同。

# chcon -h -u system_u -t httpd_config_t apache.conf

# chcon --no-dereference -u system_u -t httpd_config_t apache.conf

10. 递归更改 SELinux 上下文

在这个例子中,下面是conf.d下所有文件的当前安全linux上下文

# ls -lZ conf.d/
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 autoindex.conf
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 nss.conf
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 README
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 userdir.conf
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 welcome.conf

使用 chcon -R 递归选项,我们可以递归地将 conf.d 中的所有文件更改为给定的安全上下文,如下所示。

# chcon -R system_u:object_r:httpd_config_t:s0 conf.d

如下所示,conf.d 中的所有文件的上下文都会递归更改

# ls -lZ conf.d
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 autoindex.conf
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 nss.conf
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 README
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 userdir.conf
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 welcome.conf

注意:如果 conf.d 中还有其他子目录,所有这些子目录及其下的文件也会受到 -R 选项的影响。

您还可以使用 –recursive 选项。以下两个命令完全相同。

# chcon --recursive system_u:object_r:httpd_config_t:s0 conf.d

# chcon -R system_u:object_r:httpd_config_t:s0 conf.d

11.显示chcon操作的详细信息

使用 -v 选项,您可以显示 chcon 正在执行的操作的详细信息。

-v 代表详细,它将显示当前由 chcon 命令处理的文件的名称,如下所示。

当您与 -R 递归选项结合使用时,这非常有用,您可能正在更改大量文件的上下文,并且您想查看 chcon 当前正在做什么,如下所示。

# chcon -Rv system_u:object_r:httpd_config_t:s0 conf.d
changing security context of ‘conf.d/README’
changing security context of ‘conf.d/autoindex.conf’
changing security context of ‘conf.d/userdir.conf’
changing security context of ‘conf.d/welcome.conf’
changing security context of ‘conf.d/nss.conf’
changing security context of ‘conf.d’

12. 递归符号链接的 Chcon 默认行为

在这个例子中,“config”是一个指向 conf.d 目录的符号链接,如下所示。

# ls -lZ
drwxr-xr-x. system_u:object_r:httpd_config_t:s0 conf.d
lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 config -> conf.d

默认情况下,当您对符号链接进行递归操作时,它不会遍历目录结构。

您可以通过将 -v 选项与 -R 组合来查看这一点,这不会在输出中显示任何文件名。这表明它没有遍历“config”符号链接。

# chcon -Rv -t httpd_config_t config
changing security context of ‘configuration’

此默认行为也由 -P(大写 P)选项引用。

因此,以下两个命令完全相同。两者都不会遍历符号链接。

# chcon -Rv -t httpd_config_t config

# chcon -RPv -t httpd_config_t configuration

13.强制chcon为递归遍历指定的符号链接

在这个例子中,“config”是一个指向 conf.d 目录的符号链接,如下所示。

# ls -lZ
drwxr-xr-x. system_u:object_r:httpd_config_t:s0 conf.d
lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 config -> conf.d

当您在 chcon 命令中指定符号时,您可以使用 -H 选项强制 chcon 遍历它,如下所示。

正如您从以下输出中看到的,当我们指定“-H”选项和“-R”选项时,chcon 正在遍历配置符号链接并处理所有文件。

# chcon -RHv -t httpd_config_t config
changing security context of ‘config/README’
changing security context of ‘config/autoindex.conf’
changing security context of ‘config/userdir.conf’
changing security context of ‘config/welcome.conf’
changing security context of ‘config/nss.conf’
changing security context of ‘config/ndd’
changing security context of ‘config’

14. 强制 chcon 为递归遍历所有符号链接

在这个例子中,“config”是一个指向 conf.d 目录的符号链接,如下所示。

# ls -lZ
drwxr-xr-x. system_u:object_r:httpd_config_t:s0 conf.d
lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 config -> conf.d

在以下示例中,在 config 目录中,我们有“ndd”目录,它是一个符号链接。

# ls -l configuration/ndd
lrwxrwxrwx. 1 root root 6 Jul  8 00:13 configuration/ndd -> ../ndd

如果您希望 chcon 命令遍历它在递归操作期间遇到的所有符号链接,您应该指定 -L 选项。

以下选项结合了 -L 选项和 -R 选项。这将遍历它遇到的每个符号链接。例如,如下所示,这已经遍历了“ndd”符号链接并相应地处理了所有文件。

# chcon -RLv -t httpd_config_t configuration
changing security context of ‘configuration/README’
changing security context of ‘configuration/autoindex.conf’
changing security context of ‘configuration/userdir.conf’
changing security context of ‘configuration/welcome.conf’
changing security context of ‘configuration/nss.conf’
changing security context of ‘configuration/ndd/nd1-conf’
changing security context of ‘configuration/ndd/nd2-conf’
changing security context of ‘configuration/ndd/nd3-conf’
changing security context of ‘configuration/ndd/nd-main.conf’
changing security context of ‘configuration/ndd’
changing security context of ‘configuration’

注意:当您指定 -P、-H 或 -L 选项(与 -R 一起)时,如果出于某种原因将它们组合在一起,那么指定为最后一个选项的任何内容都将生效。

15. 系统范围更改的 / 根目录上的 Chcon 行为

默认情况下,您可以使用 chcon 递归更改根文件系统下所有文件的 SELinux 上下文,如下所示。

这称为不保留根选项(即 –no-preserve-root 是默认行为)

警告:不要在您的系统上执行此命令。您最终将拥有一个无法使用的系统。以下两个命令的行为将完全相同。

chcon -Rv system_u:object_r:httpd_config_t:s0 /

chcon -Rv --no-preserve-root system_u:object_r:httpd_config_t:s0 /

但是,除非您知道自己在做什么,否则不建议这样做,因为您不希望系统上所有文件的 SELinux 上下文都相同。

当您指定 –no-preserve-root 选项时,它不会遍历根,当您将其指定为命令行选项时,如下所示。

# chcon -Rv --preserve-root system_u:object_r:httpd_config_t:s0 /
chcon: it is dangerous to operate recursively on `/'
chcon: use --no-preserve-root to override this failsafe

由于默认行为是危险的,为了避免任何意外错误,无论何时您在大型目录上执行 -R 递归选项(尤其是从 shell 脚本内部),我建议您使用 –preserve-root。这样如果你在 chcon 命令的末尾错误地给出 / ,它不会意外地改变你系统中的所有文件。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。