4.7. SELinux 上下文 - 标记文件
在运行 SELinux 的系统上,所有进程和文件都采用代表安全相关信息的标记方式。此信息称为 SELinux 上下文。对于文件,这可使用 ls -Z 命令查看:
ls -Z file1
~]$ ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
在这个示例中,SELinux 提供了一个用户(
unconfined_u
)、角色(object_r
)、类型(user_home_t
)和级别(s0
)。此信息用于制定访问控制决策。在 DAC 系统上,访问权限根据 Linux 用户和组群 ID 进行控制。在 DAC 规则后检查 SELinux 策略规则。如果 DAC 规则首先拒绝访问,则不会使用 SELinux 策略规则。
注意
默认情况下,新建的文件和目录继承其父目录的 SELinux 类型。例如,当在
/etc
目录中创建带有 etc_t
类型的新文件时,新文件将继承相同的类型:
ls -dZ - /etc
~]$ ls -dZ - /etc
drwxr-xr-x. root root system_u:object_r:etc_t:s0 /etc
touch /etc/file1
~]# touch /etc/file1
ls -lZ /etc/file1
~]# ls -lZ /etc/file1
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0 /etc/file1
SELinux 提供多个命令来管理文件系统标记,如 chcon、semanage fcontext、restorecon 和
matchpathcon
。
4.7.1. 临时更改:chcon 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
chcon 命令更改文件的 SELinux 上下文。但是,使用 chcon 命令所做的更改不会在文件系统重新标记之间保留,或者执行 restorecon 命令。SELinux 策略控制用户是否能够修改任何给定文件的 SELinux 上下文。使用 chcon 时,用户提供要更改的所有或部分 SELinux 上下文。文件类型不正确是 SELinux 拒绝访问的常见原因。
快速参考
- 运行 chcon -t type file-name 命令来更改文件类型,其中 type 是 SELinux 类型,如
httpd_sys_content_t
,file-name 是文件或目录名称:chcon -t httpd_sys_content_t file-name
~]$ chcon -t httpd_sys_content_t file-name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 运行 chcon -R -t type directory-name 命令来更改目录及其内容的类型,其中 type 是 SELinux 类型,如
httpd_sys_content_t
,directory-name 是目录名称:chcon -R -t httpd_sys_content_t directory-name
~]$ chcon -R -t httpd_sys_content_t directory-name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
过程 4.6. 更改文件或目录的类型
以下步骤演示了更改类型,而不是 SELinux 上下文的其他属性。本节中的示例对目录的工作方式相同,例如
file1
是一个目录。
- 更改到您的主目录。
- 创建新文件并查看其 SELinux 上下文:
touch file1
~]$ touch file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z file1
~]$ ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,file1
的 SELinux 上下文包括 SELinuxunconfined_u
user、object_r
角色、user_home_t
类型和s0
级别。有关 SELinux 上下文的每个部分的描述,请参阅 第 2 章 SELinux Contexts。 - 输入以下命令将类型更改为
samba_share_t
。t
选项仅更改类型。然后查看更改:chcon -t samba_share_t file1
~]$ chcon -t samba_share_t file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z file1
~]$ ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:samba_share_t:s0 file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 使用以下命令,恢复
file1
文件的 SELinux 上下文。使用-v
选项查看哪些更改:restorecon -v file1
~]$ restorecon -v file1 restorecon reset file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:user_home_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,以前的类型samba_share_t
恢复到正确的user_home_t
类型。当使用 targeted 策略(Red Hat Enterprise Linux 中的默认 SELinux 策略时),restorecon 命令读取/etc/selinux/targeted/contexts/files/
目录中的文件,以查看哪些 SELinux 上下文文件应具有哪些 SELinux 上下文文件。
过程 4.7. 更改目录及其内容类型
以下示例演示了创建新目录,并将目录的文件类型及其内容更改为 Apache HTTP 服务器使用的类型。如果您希望 Apache HTTP 服务器使用不同的文档根(而不是
/var/www/html/
),则使用本例中的配置:
- 以 root 用户身份,创建一个新的
web/
目录,然后在该目录内 3 个空文件(file1、
3)。其中的file2
和 fileweb/
目录和文件标记为default_t
类型:mkdir /web
~]# mkdir /web
Copy to Clipboard Copied! Toggle word wrap Toggle overflow touch /web/file{1,2,3}
~]# touch /web/file{1,2,3}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -dZ /web
~]# ls -dZ /web drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /web
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -lZ /web
~]# ls -lZ /web -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file1 -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file2 -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以 root 用户身份,输入以下命令将
web/
目录(及其内容)的类型改为httpd_sys_content_t
:chcon -R -t httpd_sys_content_t /web/
~]# chcon -R -t httpd_sys_content_t /web/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -dZ /web/
~]# ls -dZ /web/ drwxr-xr-x root root unconfined_u:object_r:httpd_sys_content_t:s0 /web/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -lZ /web/
~]# ls -lZ /web/ -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 要恢复默认 SELinux 上下文,以 root 用户身份使用
restorecon
工具:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
有关 chcon 的详情,请查看 chcon(1) 手册页。
注意
类型强制是 SELinux targeted 策略中使用的主要权限控制。在大多数情况下,可以忽略 SELinux 用户和角色。
4.7.2. 持久性更改:semanage fcontext 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
semanage fcontext 命令用于更改文件的 SELinux 上下文。要显示新创建的文件和目录的上下文,以 root 用户身份输入以下命令:
semanage fcontext -C -l
~]# semanage fcontext -C -l
以下工具使用 semanage fcontext 所做的更改。当重新标记文件系统时,会使用
setfiles
工具,restorecon
实用程序恢复默认的 SELinux 上下文。这意味着 semanage fcontext 所做的更改是持久的,即使文件系统被重新标记也是如此。SELinux 策略控制用户是否能够修改任何给定文件的 SELinux 上下文。
快速参考
在文件系统重新标记后进行 SELinux 上下文更改:
- 输入以下命令,记得使用文件或目录的完整路径:
semanage fcontext -a options file-name|directory-name
~]# semanage fcontext -a options file-name|directory-name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 使用
restorecon
实用程序应用上下文更改:restorecon -v file-name|directory-name
~]# restorecon -v file-name|directory-name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
将正则表达式与 semanage fcontext 搭配使用
要使 semanage fcontext 命令正常工作,您可以使用完全限定的路径或 Perl 兼容的正则表达式(PCRE)。使用中唯一的 PCRE 标志是
PCRE2_DOTALL
,它会导致 .
通配符与任何内容(包括新行)匹配。代表路径的字符串被处理为字节,这意味着非 ASCII 字符不会被单个通配符匹配。
请注意,使用 semanage fcontext 指定的 file-context 定义会以相反的顺序评估它们是如何定义的:无论 stem 长度如何,都会首先评估最新的条目。存储在
file_contexts.local
中的本地文件上下文修改的优先级高于策略模块中指定的优先级。这意味着,每当在 file_contexts.local
中找到给定文件路径的匹配项时,不会考虑其他 file-context 定义。
重要
使用 semanage fcontext 命令指定的 file-context 定义有效地覆盖所有其他 file-context 定义。因此,所有正则表达式都应尽可能具体,以避免对文件系统中其他部分产生意外影响。
有关生效的 file-context 定义和标志中使用的正则表达式类型的更多信息,请参阅
semanage-fcontext (8)
手册页。
过程 4.8. 更改文件或目录的类型
以下示例演示了更改文件类型,而不是 SELinux 上下文的其他属性。本例对目录的工作方式相同,例如,如果
file1
是目录。
- 以 root 用户身份,在
/etc
目录中创建新文件。默认情况下,/etc
中新创建的文件使用etc_t
类型标记:touch /etc/file1
~]# touch /etc/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /etc/file1
~]$ ls -Z /etc/file1 -rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要列出有关目录的信息,请使用以下命令:ls -dZ directory_name
~]$ ls -dZ directory_name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以 root 用户身份,输入以下命令将
file1
类型更改为samba_share_t
:a
选项添加新的记录,而-t
选项则定义类型(samba_share_t
)。请注意,运行这个命令不会直接更改类型;file1
仍然使用etc_t
类型进行标记:semanage fcontext -a -t samba_share_t /etc/file1
~]# semanage fcontext -a -t samba_share_t /etc/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /etc/file1
~]# ls -Z /etc/file1 -rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow semanage fcontext -C -l
~]$ semanage fcontext -C -l /etc/file1 unconfined_u:object_r:samba_share_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以 root 用户身份,使用
restorecon
实用程序更改类型。因为semanage
在/etc/file1
的file_contexts.local
中添加一个条目,restorecon
将类型改为samba_share_t
:restorecon -v /etc/file1
~]# restorecon -v /etc/file1 restorecon reset /etc/file1 context unconfined_u:object_r:etc_t:s0->system_u:object_r:samba_share_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
过程 4.9. 更改目录及其内容类型
以下示例演示了创建新目录,并将目录的文件类型及其内容更改为 Apache HTTP 服务器使用的类型。如果您希望 Apache HTTP 服务器使用不同的文档根而不是
/var/www/html/
,则使用本例中的配置:
- 以 root 用户身份,创建一个新的
web/
目录,然后在该目录内 3 个空文件(file1、
3)。其中的file2
和 fileweb/
目录和文件标记为default_t
类型:mkdir /web
~]# mkdir /web
Copy to Clipboard Copied! Toggle word wrap Toggle overflow touch /web/file{1,2,3}
~]# touch /web/file{1,2,3}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -dZ /web
~]# ls -dZ /web drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /web
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -lZ /web
~]# ls -lZ /web -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file1 -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file2 -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以 root 用户身份,输入以下命令将
web/
目录及其中的文件更改为httpd_sys_content_t
的类型。a
选项添加新的记录,-t
选项定义类型(httpd_sys_content_t
)。"/web (/1.8)?"
正则表达式会导致semanage
应用到web/
,以及其中的文件。请注意,运行这个命令不会直接更改类型;其中中的web/
和文件仍使用default_t
类型标记:semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
~]# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -dZ /web
~]$ ls -dZ /web drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /web
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -lZ /web
~]$ ls -lZ /web -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file1 -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file2 -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow semanage fcontext -a -t httpd_sys_content_t "/web (/xz)?" 命令会将以下条目添加到/etc/selinux/targeted/contexts/files/file_contexts.local
:/web(/.*)? system_u:object_r:httpd_sys_content_t:s0
/web(/.*)? system_u:object_r:httpd_sys_content_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以 root 用户身份,使用
restorecon
实用程序更改web/
的类型,以及其中的所有文件。-R
用于递归,这意味着web/
下的所有文件和目录都标有httpd_sys_content_t
类型。由于semanage
向file.contexts.local
添加了一个条目/web (/ instead)?
,restorecon
将类型改为httpd_sys_content_t
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,默认情况下,新创建的文件和目录继承其父目录的 SELinux 类型。
过程 4.10. 删除添加的上下文
以下示例演示了添加和删除 SELinux 上下文。如果上下文是正则表达式的一部分,例如
/web (/ quota
)?,请使用正则表达式的引号:
semanage fcontext -d "/web(/.*)?"
~]# semanage fcontext -d "/web(/.*)?"
- 要删除上下文,请以 root 用户身份输入以下命令,其中 file-name|directory-name 是
file_contexts.local
中的第一个部分:semanage fcontext -d file-name|directory-name
~]# semanage fcontext -d file-name|directory-name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下是file_contexts.local
中的上下文示例:/test system_u:object_r:httpd_sys_content_t:s0
/test system_u:object_r:httpd_sys_content_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 第一部分正在测试。要防止
test/
目录在运行 restorecon 后标记为httpd_sys_content_t
,或者在文件系统重新标记之后,请以 root 用户身份输入以下命令,从file_contexts.local
中删除上下文:semanage fcontext -d /test
~]# semanage fcontext -d /test
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以 root 用户身份,使用
restorecon
实用程序恢复默认的 SELinux 上下文。
有关 semanage 的详情,请查看 semanage(8) 和 semanage-fcontext(8) 手册页。
重要
使用 semanage fcontext -a 更改 SELinux 上下文时,请使用文件或目录的完整路径以避免在文件系统重新标记或运行 restorecon 命令后标记文件。
4.7.3. 如何确定文件上下文 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
确定文件上下文是基于文件上下文定义,该定义在系统安全策略(
.fc
文件)中指定的。根据系统策略,semanage
generate file_contexts.homedirs
和 file_contexts
文件。
系统管理员可以使用 semanage fcontext 命令自定义 file-context 定义。这些自定义存储在
file_contexts.local
文件中。
当标记实用程序(如
matchpathcon
或 restorecon
)正在确定给定路径的正确标签时,它会首先搜索本地更改(file_contexts.local
)。如果工具找不到匹配的模式,它会搜索 file_contexts.homedirs
文件,最后是 file_contexts
文件。但是,每当找到与给定文件路径的匹配项时,搜索结束时,实用程序会查找任何其他文件上下文定义。这意味着与主目录相关的文件上下文的优先级高于其余的优先级,本地自定义会覆盖系统策略。
由系统策略
指定的 file-context 定义( file_contexts.homedirs
和 file_contexts
文件的内容)根据评估前的 stem (任何通配符前路径前缀)的长度进行排序。这意味着选择最具体的路径。但是,使用 semanage fcontext 指定的 file-context 定义会以相反的顺序评估它们是如何定义的:无论 stem 长度如何,都会首先评估最新的条目。
有关以下信息的更多信息:
- 使用
chcon
更改文件的上下文,请参阅 第 4.7.1 节 “临时更改:chcon”。 - 使用 semanage fcontext 更改和添加 file-context 定义,请参阅 第 4.7.2 节 “持久性更改:semanage fcontext”。
- 通过 system-policy 操作更改并添加文件上下文定义,请参阅 第 4.10 节 “维护 SELinux 标签” 或 第 4.12 节 “优先处理和禁用 SELinux 策略模块”。