第 10 章 在多个系统中部署相同的 SELinux 配置


您可以使用以下方法之一在多个系统上部署验证的 SELinux 配置:

  • 使用 RHEL 系统角色和 Ansible
  • 使用 RHEL web 控制台
  • 在脚本中使用 semanage 导出和导入命令

10.1. 使用 RHEL 系统角色配置 SELinux

您可以使用 selinux RHEL 系统角色远程配置和管理 SELinux 权限,例如:

  • 清理与 SELinux 布尔值、文件上下文、端口和登录相关的本地策略修改。
  • 设置 SELinux 策略布尔值、文件上下文、端口和登录。
  • 在指定文件或目录中恢复文件上下文。
  • 管理 SELinux 模块。

当文件有不正确的 SELinux 上下文时,可能会出现多个情况。例如,如果文件被复制或移到一个目录中,则它们的 SELinux 上下文可能与新位置的预期上下文不匹配。使用不正确的 SELinux 上下文时,应用程序可能无法访问文件。要对大量主机上的目录远程重置 SELinux 上下文,您可以使用 selinux RHEL 系统角色。

先决条件

步骤

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Managing SELinux
      hosts: managed-node-01.example.com
      tasks:
        - name: Restore SELinux context
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.selinux
          vars:
            selinux_restore_dirs:
              - /var/www/
              - /etc/
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    selinux_restore_dirs: <list>
    定义角色应重置 SELinux 上下文的目录的列表。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.selinux/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 显示您已重置了上下文的文件或目录的 SELinux 上下文。例如,要显示 /var/www/ 目录上的上下文,请输入:

    # ansible rhel10.example.com -m command -a 'ls -ldZ /var/www/'
    drwxr-xr-x. 4 root root system_u:object_r:httpd_sys_content_t:s0 33 Feb 28 13:20 /var/www/
    Copy to Clipboard Toggle word wrap

如果要在非标准端口上运行服务,您必须在此端口上设置相应的 SELinux 类型标签。这可防止在服务希望侦听非标准端口时,SELinux 拒绝对服务的访问权限。通过使用 selinux RHEL 系统角色,您可以自动化此任务,并在端口上远程分配一个类型标签。

先决条件

步骤

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Managing SELinux
      hosts: managed-node-01.example.com
      tasks:
        - name: Set http_port_t label on network port
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.selinux
          vars:
            selinux_ports:
              - ports: <port_number>
                proto: tcp
                setype: http_port_t
                state: present
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    ports: <port_number>
    定义您要为其分配 SELinux 标签的端口号。使用逗号分隔多个值。
    setype: <type_label>
    定义 SELinux 类型标签。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.selinux/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 显示分配了 http_port_t 标签的端口号:

    # ansible managed-node-01.example.com -m shell -a 'semanage port --list | grep http_port_t'
    http_port_t      tcp     80, 81, 443, <port_number>, 488, 8008, 8009, 8443, 9000
    Copy to Clipboard Toggle word wrap

如果默认的 SELinux 策略不满足您的要求,您可以创建自定义模块来允许您的应用程序访问所需的资源。通过使用 selinux RHEL 系统角色,您可以自动化此过程,并远程部署 SELinux 模块。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您要部署的 SELinux 模块存储在与 playbook 同样的目录中。
  • SELinux 模块以通用中间语言(CIL)或策略软件包(PP)格式提供。

    如果使用 PP 模块,请确保受管节点上的 policydb 版本与用来构建 PP 模块的版本相同或更新。

步骤

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Managing SELinux
      hosts: managed-node-01.example.com
      tasks:
        - name: Deploying a SELinux module
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.selinux
          vars:
            selinux_modules:
              - path: <module_file>
    	    priority: <value>
                state: enabled
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    path: <module_file>
    设置控制节点上模块文件的路径。
    priority: <value>
    设置 SELinux 模块优先级。400 是默认值。
    state: <value>

    定义模块的状态:

    • enabled :安装或启用模块。
    • disabled :禁用模块。
    • absent :删除模块。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.selinux/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 远程显示您在 playbook 中使用的 SELinux 模块和过滤器的列表:

    # ansible managed-node-01.example.com -m shell -a 'semodule -l | grep <module>'
    Copy to Clipboard Toggle word wrap

    如果列出了模块,则其已安装且启用了。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat