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
~]$ ls -dZ /var/www/html drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/htmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这显示了/var/www/html/标记为httpd_sys_content_t类型。 - 以 root 用户身份使用
touch工具创建新文件:touch /var/www/html/file1
~]# touch /var/www/html/file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 输入以下命令查看 SELinux 上下文:
ls -Z /var/www/html/file1
~]$ ls -Z /var/www/html/file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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 的更多可用类型,请输入以下命令:
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
grep httpd /etc/selinux/targeted/contexts/files/file_contexts
~]$ 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
~]# mkdir -p /my/websiteCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 与 file-context 配置中不匹配模式的文件和目录可以使用
default_t类型进行标记。受限制的服务无法访问此类型:ls -dZ /my
~]$ ls -dZ /my drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /myCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 以 root 用户输入以下命令,将
my/目录和子目录的类型更改为httpd可访问的类型。现在,在/my/website/下创建的文件继承httpd_sys_content类型,因此 httpd 可以访问它:_tchcon -R -t httpd_sys_content_t /my/ touch /my/website/index.html ls -Z /my/website/index.html
~]# 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.htmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
有关 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
~]# mkdir -p /my/websiteCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 以 root 用户身份输入以下命令,将标签更改添加到 file-context 配置中:
semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
~]# semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"Copy to Clipboard Copied! Toggle word wrap Toggle overflow "/my (/oriented)?"表达式表示标签更改适用于my/目录以及其下的所有文件和目录。 - 以 root 用户身份使用
touch工具创建新文件:touch /my/website/index.html
~]# touch /my/website/index.htmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 以 root 身份输入以下命令,以应用标签更改(restorecon 读取 file-context 配置,它由第 2 步中的 semanage 命令修改):
restorecon -R -v /my/
~]# 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:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow
有关 semanage 的详情请参考 第 4.7.2 节 “持久性更改:semanage fcontext”。