13.2. 类型
SELinux 目标策略中用于提供高级进程隔离的主要权限控制方法是 Type Enforcement。所有文件和进程都设置了类型标签:type 为进程定义 SELinux 域,以及文件的 SELinux 类型。SELinux 策略规则定义类型如何相互访问,无论是访问某一类型的域还是访问其他域的域。只有在存在允许访问的特定 SELinux 策略规则时才允许访问。
以下示例在
/var/www/html/
目录中创建了一个新文件,并显示从其父目录继承 httpd_sys_content_t
类型的文件(/var/www/html/
):
- 输入以下命令查看
/var/www/html/
的 SELinux 上下文:~]$ ls -dZ /var/www/html drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
这显示了/var/www/html/
标记为httpd_sys_content_t
类型。 - 以 root 用户身份使用
touch
工具创建新文件:~]# touch /var/www/html/file1
- 输入以下命令查看 SELinux 上下文:
~]$ ls -Z /var/www/html/file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
ls -Z 命令显示标记为
httpd_sys_content_t
类型的 file1
。SELinux 允许 httpd
读取使用这个类型标记的文件,但没有写入它们,即使 Linux 权限允许写权限。SELinux 策略定义了在 httpd_t
域(即 httpd
运行)中运行的进程可以读取和写入哪些类型。这有助于防止进程访问由另一个进程使用的文件。
例如,
httpd
可以访问标有 httpd_sys_content_t
类型的文件(用于 Apache HTTP 服务器),但默认情况下,无法访问使用 samba_share_t
类型标记的文件(用于 Samba)。另外,用户主目录中的文件使用 user_home_t
类型进行标记:默认情况下,这会阻止 httpd
读取或写入到用户主目录中的文件。
下表列出了用于
httpd
的一些类型。不同的类型允许您配置灵活的访问:
httpd_sys_content_t
- 将此类型用于静态 Web 内容,如静态网站使用的
.html
文件。使用此类型标记的文件可由httpd
执行的httpd
和脚本访问(只读)。默认情况下,使用这个类型标记的文件和目录不会被httpd
或其他进程写入或修改。请注意,默认情况下,在 /var/www/html/ 目录中创建或复制到/var/www/html/
目录中的文件使用httpd_sys_content_t
类型进行标记。 httpd_sys_script_exec_t
- 将此类型用于您希望
httpd
执行的脚本。这个类型通常用于/var/www/cgi-bin/
目录中的通用网关接口(CGI)脚本。默认情况下,SELinux 策略阻止httpd
执行 CGI 脚本。要允许此操作,使用httpd_sys_script_exec_t
类型标记脚本,并启用httpd_enable_cgi
布尔值。由 httpd 执行时,标有httpd_sys_script_exec_t
的脚本在 httpd 执行的httpd_sys_script_t
域中运行
。httpd_sys_script_t
域有权访问其他系统域,如postgresql_t
和mysqld_t
。 httpd_sys_rw_content_t
- 使用此类型标记的文件可以通过标记为
httpd_sys_script_exec_t
类型的脚本写入,但无法通过标记为任何其他类型的脚本进行修改。您必须使用httpd_sys_rw_content_t
类型来标记将通过httpd_sys_script_exec_t
类型标记的脚本读取和写入的文件。 httpd_sys_ra_content_t
- 使用此类型标记的文件可以通过标有
httpd_sys_script_exec_t
类型的脚本附加到,但无法通过标记为任何其他类型的脚本进行修改。您必须使用httpd_sys_ra_content_t
类型来标记要从中读取的文件,并通过标有httpd_sys_script_exec_t
类型的脚本附加到。 httpd_unconfined_script_exec_t
- 带有此类型标记的脚本在未受到 SELinux 保护的情况下运行。耗尽所有其他选项后,仅将此类型用于复杂的脚本。最好使用此类型而不是对
httpd
或整个系统禁用 SELinux 保护。
注意
要查看 httpd 的更多可用类型,请输入以下命令:
~]$ grep httpd /etc/selinux/targeted/contexts/files/file_contexts
过程 13.1. 更改 SELinux 上下文
可以使用 chcon 命令更改文件和目录的类型。使用 chcon 所做的更改不会在文件系统重新标记或 restorecon 命令后保留。SELinux 策略控制用户是否能够修改任何给定文件的 SELinux 上下文。以下示例演示了创建一个新目录和一个
index.html
文件供 httpd
使用,并标记该文件及目录以允许 httpd
访问它们:
- 以 root 用户身份使用
mkdir
工具创建顶层目录结构,以存储httpd
使用的文件:~]# mkdir -p /my/website
- 与 file-context 配置中不匹配模式的文件和目录可以使用
default_t
类型进行标记。受限制的服务无法访问此类型:~]$ ls -dZ /my drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /my
- 以 root 用户输入以下命令,将
my/
目录和子目录的类型更改为httpd
可访问的类型。现在,在/my/website/
下创建的文件继承httpd_sys_content
类型,因此 httpd 可以访问它:_t
~]# chcon -R -t httpd_sys_content_t /my/ ~]# touch /my/website/index.html ~]# ls -Z /my/website/index.html -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /my/website/index.html
有关 chcon 的详情,请查看 第 4.7.1 节 “临时更改:chcon”。
使用 semanage fcontext 命令(semanage 由 policycoreutils-python 软件包提供),以在重新标记和 restorecon 命令后保留标签更改。此命令会添加对 file-context 配置的更改。然后,运行 restorecon,它读取 file-context 配置,以应用标签更改。以下示例演示了创建一个新目录和用于
httpd
的 index.html
文件,并永久更改该目录和文件的标签,以允许 httpd
访问它们:
- 以 root 用户身份使用
mkdir
工具创建顶层目录结构,以存储httpd
使用的文件:~]# mkdir -p /my/website
- 以 root 用户身份输入以下命令,将标签更改添加到 file-context 配置中:
~]# semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
"/my (/oriented)?"
表达式表示标签更改适用于my/
目录以及其下的所有文件和目录。 - 以 root 用户身份使用
touch
工具创建新文件:~]# touch /my/website/index.html
- 以 root 身份输入以下命令,以应用标签更改(restorecon 读取 file-context 配置,它由第 2 步中的 semanage 命令修改):
~]# restorecon -R -v /my/ restorecon reset /my context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /my/website context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /my/website/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
有关 semanage 的详情请参考 第 4.7.2 节 “持久性更改:semanage fcontext”。