第 10 章 在多个系统中部署相同的 SELinux 配置
您可以使用以下方法之一在多个系统上部署验证的 SELinux 配置:
- 使用 RHEL 系统角色和 Ansible
- 使用 RHEL web 控制台
- 
					在脚本中使用 semanage导出和导入命令
10.1. 使用 RHEL 系统角色配置 SELinux
				您可以使用 selinux RHEL 系统角色远程配置和管理 SELinux 权限,例如:
			
- 清理与 SELinux 布尔值、文件上下文、端口和登录相关的本地策略修改。
- 设置 SELinux 策略布尔值、文件上下文、端口和登录。
- 在指定文件或目录中恢复文件上下文。
- 管理 SELinux 模块。
10.1.1. 使用 selinux RHEL 系统角色恢复目录上的 SELinux 上下文
					当文件有不正确的 SELinux 上下文时,可能会出现多个情况。例如,如果文件被复制或移到一个目录中,则它们的 SELinux 上下文可能与新位置的预期上下文不匹配。使用不正确的 SELinux 上下文时,应用程序可能无法访问文件。要对大量主机上的目录远程重置 SELinux 上下文,您可以使用 selinux RHEL 系统角色。
				
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
- 
							您用于连接到受管节点的帐户对它们具有 sudo权限。
步骤
- 创建一个包含以下内容的 playbook 文件,如 - ~/playbook.yml:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 示例 playbook 中指定的设置包括如下: - selinux_restore_dirs: <list>
- 定义角色应重置 SELinux 上下文的目录的列表。
 - 有关 playbook 中使用的所有变量的详情,请查看控制节点上的 - /usr/share/ansible/roles/rhel-system-roles.selinux/README.md文件。
- 验证 playbook 语法: - ansible-playbook --syntax-check ~/playbook.yml - $ ansible-playbook --syntax-check ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。 
- 运行 playbook: - ansible-playbook ~/playbook.yml - $ ansible-playbook ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
验证
- 显示您已重置了上下文的文件或目录的 SELinux 上下文。例如,要显示 - /var/www/目录上的上下文,请输入:- ansible rhel10.example.com -m command -a 'ls -ldZ /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 Copied! - Toggle word wrap Toggle overflow 
10.1.2. 使用 selinux RHEL 系统角色管理 SELinux 网络端口标签
					如果要在非标准端口上运行服务,您必须在此端口上设置相应的 SELinux 类型标签。这可防止在服务希望侦听非标准端口时,SELinux 拒绝对服务的访问权限。通过使用 selinux RHEL 系统角色,您可以自动化此任务,并在端口上远程分配一个类型标签。
				
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
- 
							您用于连接到受管节点的帐户对它们具有 sudo权限。
步骤
- 创建一个包含以下内容的 playbook 文件,如 - ~/playbook.yml:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 示例 playbook 中指定的设置包括如下: - ports: <port_number>
- 定义您要为其分配 SELinux 标签的端口号。使用逗号分隔多个值。
- setype: <type_label>
- 定义 SELinux 类型标签。
 - 有关 playbook 中使用的所有变量的详情,请查看控制节点上的 - /usr/share/ansible/roles/rhel-system-roles.selinux/README.md文件。
- 验证 playbook 语法: - ansible-playbook --syntax-check ~/playbook.yml - $ ansible-playbook --syntax-check ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。 
- 运行 playbook: - ansible-playbook ~/playbook.yml - $ ansible-playbook ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
验证
- 显示分配了 - http_port_t标签的端口号:- ansible managed-node-01.example.com -m shell -a 'semanage port --list | grep 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 Copied! - Toggle word wrap Toggle overflow 
10.1.3. 使用 selinux RHEL 系统角色部署 SELinux 模块
					如果默认的 SELinux 策略不满足您的要求,您可以创建自定义模块来允许您的应用程序访问所需的资源。通过使用 selinux RHEL 系统角色,您可以自动化此过程,并远程部署 SELinux 模块。
				
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
- 
							您用于连接到受管节点的帐户对它们具有 sudo权限。
- 您要部署的 SELinux 模块存储在与 playbook 同样的目录中。
- SELinux 模块以通用中间语言(CIL)或策略软件包(PP)格式提供。 - 如果使用 PP 模块,请确保受管节点上的 - policydb版本与用来构建 PP 模块的版本相同或更新。
步骤
- 创建一个包含以下内容的 playbook 文件,如 - ~/playbook.yml:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 示例 playbook 中指定的设置包括如下: - path: <module_file>
- 设置控制节点上模块文件的路径。
- priority: <value>
- 
										设置 SELinux 模块优先级。400是默认值。
- state: <value>
- 定义模块的状态: - 
												enabled:安装或启用模块。
- 
												disabled:禁用模块。
- 
												absent:删除模块。
 
- 
												
 - 有关 playbook 中使用的所有变量的详情,请查看控制节点上的 - /usr/share/ansible/roles/rhel-system-roles.selinux/README.md文件。
- 验证 playbook 语法: - ansible-playbook --syntax-check ~/playbook.yml - $ ansible-playbook --syntax-check ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。 
- 运行 playbook: - ansible-playbook ~/playbook.yml - $ ansible-playbook ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
验证
- 远程显示您在 playbook 中使用的 SELinux 模块和过滤器的列表: - ansible managed-node-01.example.com -m shell -a 'semodule -l | grep <module>' - # ansible managed-node-01.example.com -m shell -a 'semodule -l | grep <module>'- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 如果列出了模块,则其已安装且启用了。