15 个用于更改安全上下文的 SELinux chcon 命令示例
在 SELinux 中,您可能执行的一项常见任务是更改对象的安全上下文。为此,您将使用 chcon 命令。
chcon 代表更改上下文,此命令用于更改文件的 SELinux 安全上下文。
本文用15个示例解释了以下 chcon 命令:
- 更改完整的 SELinux 上下文
- 使用另一个文件作为参考更改上下文
- 仅更改 SELinux 上下文中的用户
- 仅更改 SELinux 上下文中的角色
- 仅更改 SELinux 上下文中的类型
- 仅更改 SELinux 上下文中的范围
- 在 chcon 中组合用户、角色、类型、级别
- Chcon 在符号链接上的默认行为
- 强制更改符号链接的 SELinux 上下文
- 递归更改 SELinux 上下文
- 显示 chcon 操作的详细详细信息
- 递归符号链接上的 Chcon 默认行为
- 强制 chcon 为递归遍历指定的符号链接
- 强制 chcon 遍历所有符号链接以进行递归
- 系统范围更改的 / 根目录上的 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 命令的末尾错误地给出 / ,它不会意外地改变你系统中的所有文件。
- 点赞
- 收藏
- 关注作者
评论(0)