13.2. 类型


SELinux 目标策略中用于提供高级进程隔离的主要权限控制方法是 Type Enforcement。所有文件和进程都设置了类型标签:type 为进程定义 SELinux 域,以及文件的 SELinux 类型。SELinux 策略规则定义类型如何相互访问,无论是访问某一类型的域还是访问其他域的域。只有在存在允许访问的特定 SELinux 策略规则时才允许访问。
以下示例在 /var/www/html/ 目录中创建了一个新文件,并显示从其父目录继承 httpd_sys_content_t 类型的文件(/var/www/html/):
  1. 输入以下命令查看 /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 类型。
  2. 以 root 用户身份使用 touch 工具创建新文件:
    ~]# touch /var/www/html/file1
  3. 输入以下命令查看 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_tmysqld_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 访问它们:
  1. 以 root 用户身份使用 mkdir 工具创建顶层目录结构,以存储 httpd 使用的文件:
    ~]# mkdir -p /my/website
  2. 与 file-context 配置中不匹配模式的文件和目录可以使用 default_t 类型进行标记。受限制的服务无法访问此类型:
    ~]$ ls -dZ /my
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /my
    
  3. 以 root 用户输入以下命令,将 my/ 目录和子目录的类型更改为 httpd 可访问的类型。现在,在 /my/website/ 下创建的文件继承 httpd_sys_content _t 类型,因此 httpd 可以访问它:
    ~]# 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 命令(semanagepolicycoreutils-python 软件包提供),以在重新标记和 restorecon 命令后保留标签更改。此命令会添加对 file-context 配置的更改。然后,运行 restorecon,它读取 file-context 配置,以应用标签更改。以下示例演示了创建一个新目录和用于 httpdindex.html 文件,并永久更改该目录和文件的标签,以允许 httpd 访问它们:
  1. 以 root 用户身份使用 mkdir 工具创建顶层目录结构,以存储 httpd 使用的文件:
    ~]# mkdir -p /my/website
  2. 以 root 用户身份输入以下命令,将标签更改添加到 file-context 配置中:
    ~]# semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
    "/my (/oriented)?" 表达式表示标签更改适用于 my/ 目录以及其下的所有文件和目录。
  3. 以 root 用户身份使用 touch 工具创建新文件:
    ~]# touch /my/website/index.html
  4. 以 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”
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.