10.16. 使用 RHEL 系统角色配置 NBDE
您可以使用 nbde_client
和 nbde_server
RHEL 系统角色使用 Clevis 和 Tang 自动部署基于策略的解密(PBD)解决方案。rhel-system-roles
包中包含了这些系统角色、相关的例子以及参考文档。
10.16.1. 使用 nbde_server
RHEL 系统角色设置多个 Tang 服务器
通过使用 nbde_server
系统角色,您可以部署和管理 Tang 服务器作为自动磁盘加密解决方案的一部分。此角色支持以下功能:
- 轮转 Tang 密钥
- 部署和备份 Tang 密钥
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Deploy a Tang server hosts: tang.server.example.com tasks: - name: Install and configure periodic key rotation ansible.builtin.include_role: name: rhel-system-roles.nbde_server vars: nbde_server_rotate_keys: yes nbde_server_manage_firewall: true nbde_server_manage_selinux: true
此 playbook 示例确保部署 Tang 服务器和密钥轮转。
示例 playbook 中指定的设置包括以下内容:
nbde_server_manage_firewall: true
-
使用
firewall
系统角色管理nbde_server
角色使用的端口。 nbde_server_manage_selinux: true
使用
selinux
系统角色管理nbde_server
角色使用的端口。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.nbde_server/README.md
文件。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在您的 NBDE 客户端上,使用以下命令验证您的 Tang 服务器是否正常工作。该命令必须返回您传递的与加密和解密相同的消息:
# ansible managed-node-01.example.com -m command -a 'echo test | clevis encrypt tang '{"url":"<tang.server.example.com>"}' -y | clevis decrypt' test
其他资源
-
/usr/share/ansible/roles/rhel-system-roles.nbde_server/README.md
file -
/usr/share/doc/rhel-system-roles/nbde_server/
directory
10.16.2. 使用 nbde_client
RHEL 系统角色使用 DHCP 设置 Clevis 客户端
nbde_client
系统角色使您能够以自动化的方式部署多个Clevis客户端。
此角色支持将 LUKS 加密卷绑定到一个或多个网络绑定(NBDE)服务器 - Tang 服务器。您可以使用密码短语保留现有的卷加密,或者将其删除。删除密码短语后,您只能使用 NBDE 解锁卷。当卷最初是使用在置备系统后会删除的临时密钥或密码进行加密时,这非常有用,
如果您同时提供密语和密钥文件,角色将使用您首先提供的那一个。如果找不到任何有效密语或密码,它将尝试从现有的绑定中检索密码短语。
基于策略的解密(PBD)将绑定定义为设备到插槽的映射。这意味着对同一个设备你可以有多个绑定。默认插槽是插槽 1。
nbde_client
系统角色只支持 Tang 绑定。因此,您无法将其用于 TPM2 绑定。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 已使用 LUKS 加密的卷。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure clients for unlocking of encrypted volumes by Tang servers hosts: managed-node-01.example.com tasks: - name: Create NBDE client bindings ansible.builtin.include_role: name: rhel-system-roles.nbde_client vars: nbde_client_bindings: - device: /dev/rhel/root encryption_key_src: /etc/luks/keyfile nbde_client_early_boot: true state: present servers: - http://server1.example.com - http://server2.example.com - device: /dev/rhel/swap encryption_key_src: /etc/luks/keyfile servers: - http://server1.example.com - http://server2.example.com
这个示例 playbook 配置 Clevis 客户端,以便在两个 Tang 服务器中至少有一个可用时自动解锁两个 LUKS 加密卷。
示例 playbook 中指定的设置包括以下内容:
state: present
-
state
的值表示运行 playbook 后的配置。使用present
值来创建新绑定或更新现有绑定。与clevis luks bind
命令不同,您可以使用state: present
来覆盖其设备插槽中的现有绑定。absent
的值会删除指定的绑定。 nbde_client_early_boot: true
nbde_client
角色可确保 Tang pin 的网络默认在早期引导时可用。如果您需要禁用此功能,请在 playbook 中添加nbde_client_early_boot: false
变量。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.nbde_client/README.md
文件。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在 NBDE 客户端中,检查您的 Tang 服务器是否应自动解锁的加密卷,其中包含其 LUKS pin 中对应的信息:
# ansible managed-node-01.example.com -m command -a 'clevis luks list -d /dev/rhel/root' 1: tang '{"url":"<http://server1.example.com/>"}' 2: tang '{"url":"<http://server2.example.com/>"}'
如果不使用
nbde_client_early_boot: false
变量,请验证绑定可用于早期引导,例如:# ansible managed-node-01.example.com -m command -a 'lsinitrd | grep clevis-luks' lrwxrwxrwx 1 root root 48 Jan 4 02:56 etc/systemd/system/cryptsetup.target.wants/clevis-luks-askpass.path -> /usr/lib/systemd/system/clevis-luks-askpass.path …
其他资源
-
/usr/share/ansible/roles/rhel-system-roles.nbde_client/README.md
文件 -
/usr/share/doc/rhel-system-roles/nbde_client/
directory
10.16.3. 使用 nbde_client
RHEL 系统角色设置 static-IP Clevis 客户端
nbde_client
RHEL 系统角色只支持使用动态主机配置协议(DHCP)的情况。在带有静态 IP 配置的 NBDE 客户端中,您必须将网络配置作为内核引导参数传递。
通常,管理员希望重复使用 playbook,且不会为 Ansible 在早期引导过程中为其分配静态 IP 地址的每个主机维护单独的 playbook。在这种情况下,您可以在 playbook 中使用变量并在外部文件中提供设置。因此,您只需要一个 playbook 和一个带有设置的文件。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 已使用 LUKS 加密的卷。
步骤
使用主机的网络设置创建文件,如
static-ip-settings-clients.yml
,并添加您要动态分配给主机的值:clients: managed-node-01.example.com: ip_v4: 192.0.2.1 gateway_v4: 192.0.2.254 netmask_v4: 255.255.255.0 interface: enp1s0 managed-node-02.example.com: ip_v4: 192.0.2.2 gateway_v4: 192.0.2.254 netmask_v4: 255.255.255.0 interface: enp1s0
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:- name: Configure clients for unlocking of encrypted volumes by Tang servers hosts: managed-node-01.example.com,managed-node-02.example.com vars_files: - ~/static-ip-settings-clients.yml tasks: - name: Create NBDE client bindings ansible.builtin.include_role: name: rhel-system-roles.network vars: nbde_client_bindings: - device: /dev/rhel/root encryption_key_src: /etc/luks/keyfile servers: - http://server1.example.com - http://server2.example.com - device: /dev/rhel/swap encryption_key_src: /etc/luks/keyfile servers: - http://server1.example.com - http://server2.example.com - name: Configure a Clevis client with static IP address during early boot ansible.builtin.include_role: name: rhel-system-roles.bootloader vars: bootloader_settings: - kernel: ALL options: - name: ip value: "{{ clients[inventory_hostname]['ip_v4'] }}::{{ clients[inventory_hostname]['gateway_v4'] }}:{{ clients[inventory_hostname]['netmask_v4'] }}::{{ clients[inventory_hostname]['interface'] }}:none"
此 playbook 为
~/static-ip-settings-clients.yml
文件中列出的每个主机动态读取某些值。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
其他资源
-
/usr/share/ansible/roles/rhel-system-roles.nbde_client/README.md
文件 -
/usr/share/doc/rhel-system-roles/nbde_client/
directory - 在初始 ramdisk (initrd) (Red Hat 启用 Sysadmin)中查找 Linux 网络配置