第 9 章 使用基于策略的解密配置加密卷的自动解锁。

基于策略的解密(PBD)是一个技术集合,它能够解锁物理机和虚拟机上的加密硬盘根卷和辅助卷。PBD采用多种解锁方式,如用户密码、可信平台模块(TPM)设备、连接到系统的PKCS #11设备,如智能卡或特殊网络服务器。

PBD允许将不同的解锁方式结合到一个策略中,这样就可以用不同的方式解锁同一个卷。目前在Red Hat Enterprise Linux中实现的PBD由Clevis框架和称为pins的插件组成。每个针脚都提供单独的解锁功能。目前,有以下针脚。

  • tang- 允许使用网络服务器解锁卷。
  • tpm2- 允许使用TPM2策略解锁卷。

网络绑定磁盘加密(NBDE)是PBD的一个子类别,允许将加密卷绑定到一个特殊的网络服务器上。目前NBDE的实现包括唐服务器和唐服务器本身的Clevis引脚。

9.1. 网络绑定的磁盘加密

在Red Hat Enterprise Linux中,NBDE是通过以下组件和技术实现的。

图 9.1. 使用LUKS1加密卷时的NBDE方案。luksmeta包不用于LUKS2卷。

RHEL安全指南 453350 0717 ECE NBDE

唐是一个将数据绑定到网络存在的服务器。它使包含你的数据的系统在绑定到一定的安全网络时可以使用。Tang是无状态的,不需要TLS或认证。与基于托管的解决方案不同,服务器存储了所有加密密钥,并且知道每一个曾经使用过的密钥,而Tang从不与任何客户端密钥进行交互,因此它永远不会从客户端获得任何身份信息。

Clevis是一个可插拔的自动解密框架。在NBDE中,Clevis提供LUKS卷的自动解锁功能。该 clevis包提供了该功能的客户端。

Clevis pin 是 Clevis 框架的一个插件。其中,有一个实现与NBDE服务器交互的插件--唐。

Clevis和Tang是通用的客户端和服务器组件,它们提供网络绑定的加密。在Red Hat Enterprise Linux中,它们与LUKS配合使用,对根和非根存储卷进行加密和解密,以完成网络绑定磁盘加密。

客户端和服务器端组件都使用José库来执行加密和解密操作。

当你开始配置NBDE时,唐服务器的Clevis针得到唐服务器的广告非对称密钥列表。另外,由于密钥是非对称的,所以可以将唐人的公钥列表分布在带外,这样客户可以在不访问唐人服务器的情况下进行操作。这种模式称为离线配置

唐的Clevis针使用其中一个公钥生成一个唯一的、加密性强的加密密钥。一旦使用该密钥对数据进行加密,该密钥就会被丢弃。Clevis客户端应该将这次供应操作产生的状态存储在一个方便的位置。这个对数据进行加密的过程就是供应步骤

LUKS版本2(LUKS2)是Red Hat Enterprise Linux 8中的默认格式,因此,NBDE的供应状态以令牌的形式存储在LUKS2头中。贸发会议对非商业化发展的供应状态的利用。 luksmeta包只用于用LUKS1加密的卷。唐人的Clevis针脚同时支持LUKS1和LUKS2,不需要任何规格。

当客户端准备好访问它的数据时,它会加载供应步骤中产生的元数据,它响应恢复加密密钥。这个过程就是恢复步骤

在NBDE中,Clevis使用针脚绑定LUKS卷,这样就可以自动解锁。成功完成绑定过程后,可以使用提供的Dracut解锁器解锁磁盘。

9.2. 安装加密客户端 - Clevis

使用此步骤在系统上部署并开始使用Clevis可插拔框架。

流程

  1. 在有加密卷的系统上安装Clevis及其引脚。

    # yum install clevis
  2. 要解密数据,可以使用clevis解密命令,并提供JSON Web加密(JWE)格式的密文,例如。

    $ clevis decrypt < secret.jwe

其它资源

  • 关于快速参考,请参见内置的CLI帮助。

    $ clevis
    Usage: clevis COMMAND [OPTIONS]
    
    clevis decrypt             Decrypts using the policy defined at encryption time
    clevis encrypt sss         Encrypts using a Shamir's Secret Sharing policy
    clevis encrypt tang        Encrypts using a Tang binding server policy
    clevis encrypt tpm2        Encrypts using a TPM2.0 chip binding policy
    clevis luks bind           Binds a LUKS device using the specified policy
    clevis luks list           Lists pins bound to a LUKSv1 or LUKSv2 device
    clevis luks pass           Returns the LUKS passphrase used for binding a particular slot.
    clevis luks regen          Regenerate LUKS metadata
    clevis luks report         Report any key rotation on the server side
    clevis luks unbind         Unbinds a pin bound to a LUKS volume
    clevis luks unlock         Unlocks a LUKS volume
  • 更多信息,请参见clevis(1)man页面。

9.3. 在强制模式下使用SELinux部署Tang服务器。

使用此过程将运行在自定义端口上的Tang服务器部署为SELinux强制模式下的限制服务。

先决条件

  • policycoreutils-python-utils 包及其依赖项已经安装。

流程

  1. 要安装tang包及其依赖项,以root身份输入以下命令。

    # yum install tang
  2. 选择一个未被占用的端口,例如7500/tcp,并允许tangd服务绑定到该端口。

    # semanage port -a -t tangd_port_t -p tcp 7500

    请注意,一个端口一次只能被一个服务使用,因此试图使用一个已经被占用的端口意味着ValueError:Port already definederror 消息。

  3. 打开防火墙中的端口。

    # firewall-cmd --add-port=7500/tcp
    # firewall-cmd --runtime-to-permanent
  4. 启用tangd服务。

    # systemctl enable tangd.socket
  5. 创建一个覆盖文件。

    # systemctl edit tangd.socket
  6. 在下面的编辑界面中,打开位于/etc/systemd/system/tangd.socket.d/目录下的一个空的override.conf文件,通过添加以下几行,将唐人服务器的默认端口从80改为之前选好的号码。

    [Socket]
    ListenStream=
    ListenStream=7500

    保存文件并退出编辑器。

  7. 重新加载更改后的配置。

    # systemctl daemon-reload
  8. 检查你的配置是否正常。

    # systemctl show tangd.socket -p Listen
    Listen=[::]:7500 (Stream)
  9. 启动tangd服务。

    # systemctl start tangd.socket

    因为tangd使用systemd套接字激活机制,所以当第一个连接进来时,服务器就会启动。第一次启动时,会自动生成一组新的加密密钥。要执行手动生成密钥等加密操作,请使用jose工具。

其它资源

  • tang(8)man page
  • semanage(8)man page
  • firewall-cmd(1)man page
  • systemd.unit(5)systemd.socket(5)联机手册。
  • jose(1)man page

9.4. 旋转唐朝服务器键和更新客户端上的绑定。

使用下面的步骤来轮换您的 Tang 服务器键,并更新客户端上现有的绑定。你应该轮换它们的精确间隔取决于你的应用、关键大小和机构政策。

先决条件

  • 一台唐人服务器正在运行。
  • 您的客户机上安装了clevisclevis-luks软件包。
  • 请注意,在RHEL 8.2中引入了clevis luks listclevis luks reportclevis luks regen

流程

  1. 要轮换密钥,请使用/usr/libexec/tangd-keygen命令在Tang服务器的/var/db/tang密钥数据库目录下生成新的密钥。

    # ls /var/db/tang
    UV6dqXSwe1bRKG3KbJmdiR020hY.jwk y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk
    # /usr/libexec/tangd-keygen /var/db/tang
    # ls /var/db/tang
    UV6dqXSwe1bRKG3KbJmdiR020hY.jwk y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk
    3ZWS6-cDrCG61UPJS2BMmPU4I54.jwk zyLuX6hijUy_PSeUEFDi7hi38.jwk
  2. 检查你的Tang服务器是否从新的密钥对中宣传签名密钥,例如。

    # tang-show-keys 7500
    3ZWS6-cDrCG61UPJS2BMmPU4I54
  3. 重新命名旧的钥匙,有一个领先的.以隐藏它们的广告。需要注意的是,下面例子中的文件名与唐人服务器的密钥数据库目录中的唯一文件名不同。

    # cd /var/db/tang
    # ls -l
    -rw-r--r--. 1 root tang 354 Sep 23 16:08 3ZWS6-cDrCG61UPJS2BMmPU4I54.jwk
    -rw-r--r--. 1 root tang 349 Sep 23 16:08 I-zyLuX6hijUy_PSeUEFDi7hi38.jwk
    -rw-r--r--. 1 root root 349 Feb  7 14:55 UV6dqXSwe1bRKG3KbJmdiR020hY.jwk
    -rw-r--r--. 1 root root 354 Feb  7 14:55 y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk
    # mv UV6dqXSwe1bRKG3KbJmdiR020hY.jwk .UV6dqXSwe1bRKG3KbJmdiR020hY.jwk
    # mv y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk .y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk

    唐国栋立刻接过所有的变化。不需要重新启动。此时,新的客户端绑定接上新的密钥,老客户端可以继续利用旧的密钥。

  4. 在你的NBDE客户端上,使用clevis luks报告命令来检查唐朝服务器所公布的密钥是否保持不变。例如,你可以使用clevis luks list命令来识别相关绑定的插槽。

    # clevis luks list -d /dev/sda2
    1: tang '{"url":"http://tang.srv"}'
    # clevis luks report -d /dev/sda2 -s 1
    ...
    Report detected that some keys were rotated.
    Do you want to regenerate luks metadata with "clevis luks regen -d /dev/sda2 -s 1"? [ynYN]
  5. 要为新按键重新生成LUKS元数据,可以按y键到上一条命令的提示,或者使用clevis luks regen命令。

    # clevis luks regen -d /dev/sda2 -s 1
  6. 当你确定所有的老客户都使用新的密钥时,你可以从唐人服务器上删除旧的密钥,例如。

    # cd /var/db/tang
    # rm .*.jwk
警告

当客户还在使用旧钥匙时,删除旧钥匙会导致数据丢失。如果不小心删除了这样的密钥,请在客户端使用clevis luks regen命令,并手动提供LUKS密码。

其它资源

  • tang-show-keys(1), clevis-luks-list(1), clevis-luks-report(1), and clevis-luks-regen(1) man pages

9.5. 在网络控制台中配置使用唐键的自动解锁功能

配置使用唐人服务器提供的密钥自动解锁LUKS加密存储设备。

先决条件

  • RHEL 8网络控制台已经安装完毕。

    详情请参阅 安装 Web 控制台

  • 系统中安装了驾驶舱存储包。
  • cockpit.socket服务运行在9090端口。
  • 安装了clevistangclevis-dracut包。
  • 一台唐人服务器正在运行。

流程

  1. 在网络浏览器中输入以下地址,打开RHEL网络控制台。

    https://localhost:9090

    连接到远程系统时,用远程服务器的主机名或IP地址代替localhost部分。

  2. 提供您的凭证,然后单击"存储"。选择加密设备并点 内容部分中的 Encryption
  3. 钥匙部分点击+,添加唐键。

    RHEL web控制台。加密
  4. 提供您的Tang服务器的地址和解锁LUKS加密设备的密码。点击"添加"确认。

    RHEL网络控制台。添加唐键
  5. 下面的对话窗口提供了一个命令来验证密钥哈希是否匹配。RHEL 8.2 引入了tang-show-keys脚本,您可以在运行在7500 端口的 Tang 服务器上使用以下命令获取密钥哈希。

    # tang-show-keys 7500
    3ZWS6-cDrCG61UPJS2BMmPU4I54

    在RHEL 8.1及更早的版本中,使用以下命令获取密钥哈希。

    # curl -s localhost:7500/adv | jose fmt -j- -g payload -y -o- | jose jwk use -i- -r -u verify -o- | jose jwk thp -i-
    3ZWS6-cDrCG61UPJS2BMmPU4I54
  6. 当 web 控制台中的密钥哈希值与之前列出的命令的输出中的值相同时,点 Trust key

    RHEL网络控制台。验证唐键
  7. 要启用早期启动系统处理磁盘绑定,请单击左侧导航栏底部的终端,输入以下命令。

    # yum install clevis-dracut
    # dracut -fv --regenerate-all

验证步骤

  1. 检查新添加的唐键现在已经被列在Keys部分,类型为Keyserver

    RHEL网络控制台。一个密钥服务器密钥被列出
  2. 验证绑定是否可以用于早期启动,例如。

    # lsinitrd | grep clevis
    clevis
    clevis-pin-sss
    clevis-pin-tang
    clevis-pin-tpm2
    -rwxr-xr-x   1 root     root         1600 Feb 11 16:30 usr/bin/clevis
    -rwxr-xr-x   1 root     root         1654 Feb 11 16:30 usr/bin/clevis-decrypt
    ...
    -rwxr-xr-x   2 root     root           45 Feb 11 16:30 usr/lib/dracut/hooks/initqueue/settled/60-clevis-hook.sh
    -rwxr-xr-x   1 root     root         2257 Feb 11 16:30 usr/libexec/clevis-luks-askpass

其它资源

9.6. 使用唐人街为NBDE系统部署加密客户端。

下面的步骤包含了用唐人网络服务器配置自动解锁加密卷的步骤。

先决条件

  • Clevis框架已安装完毕。
  • 有一个唐人服务器。

流程

  1. 要将Clevis加密客户端绑定到Tang服务器,请使用clevis encrypt tang子命令。

    $ clevis encrypt tang '{"url":"http://tang.srv:port"}' < input-plain.txt > secret.jwe
    The advertisement contains the following signing keys:
    
    _OsIk0T-E2l6qjfdDiwVmidoZjA
    
    Do you wish to trust these keys? [ynYN] y

    将前面例子中的http://tang.srv:portURL 改为与安装tang的服务器的 URL 相匹配。secret.jwe 输出文件包含了您的加密密码文本,采用 JSON Web 加密格式。这个密文是从input-plain.txt输入文件中读取的。

    另外,如果你的配置需要在没有SSH访问的情况下与唐人服务器进行非交互式通信,你可以下载一个广告并保存到文件中。

    $ curl -sfg http://tang.srv:port/adv -o adv.jws

    adv.jws文件中的广告用于以下任何任务,例如文件或消息的加密。

    $ echo 'hello' | clevis encrypt tang '{"url":"http://tang.srv:port","adv":"adv.jws"}'
  2. 要解密数据,请使用clevis解密命令并提供密文(JWE)。

    $ clevis decrypt < secret.jwe > output-plain.txt

其它资源

  • 关于快速参考,请参见clevis-encrypt-tang(1)man 页面或使用内置 CLI 帮助。

    $ clevis
    $ clevis decrypt
    $ clevis encrypt tang
    Usage: clevis encrypt tang CONFIG < PLAINTEXT > JWE
    ...
  • 更多信息,请参见以下手册页面。

    • clevis(1)
    • clevis-luks-unlockers(7)

9.7. 手动从LUKS加密卷中移除一个Clevis针脚。

使用下面的步骤手动删除由clevis luks bind命令创建的元数据,也可以擦除包含Clevis添加的密码口令的键槽。

重要

从LUKS加密卷中移除Clevis引脚的推荐方法是通过clevis luks unbind命令。使用clevis luks unbind的移除过程只有一个步骤,并且适用于LUKS1和LUKS2卷。以下示例命令删除绑定步骤创建的元数据,并擦拭/dev/sda2设备上的键槽1

# clevis luks unbind -d /dev/sda2 -s 1

先决条件

  • 一本LUKS加密卷,采用Clevis装订。

流程

  1. 检查该卷的LUKS版本,例如/dev/sda2,是由哪个版本加密的,并确定一个插槽和一个绑定到Clevis的令牌。

    # cryptsetup luksDump /dev/sda2
    LUKS header information
    Version:        2
    ...
    Keyslots:
      0: luks2
    ...
    1: luks2
          Key:        512 bits
          Priority:   normal
          Cipher:     aes-xts-plain64
    ...
          Tokens:
            0: clevis
                  Keyslot:  1
    ...

    在前面的例子中,Clevis令牌的标识为0,相关的密钥槽为1

  2. 在LUKS2加密的情况下,删除令牌。

    # cryptsetup token remove --token-id 0 /dev/sda2
  3. 如果你的设备被LUKS1加密了,在cryptsetup luksDump命令的输出中用Version: 1字符串表示,那么就用luksmeta wipe命令执行这个额外的步骤。

    # luksmeta wipe -d /dev/sda2 -s 1
  4. 擦拭含有Clevis密码的钥匙槽。

    # cryptsetup luksKillSlot /dev/sda2 1

其它资源

  • 更多信息请参见clevis-luks-unbind(1)cryptsetup(8)luksmeta(8)的手册。

9.8. 使用TPM 2.0策略部署加密客户端

以下程序包含使用可信平台模块 2.0 (TPM 2.0) 策略配置加密卷自动解锁的步骤。

先决条件

流程

  1. 要部署使用TPM 2.0芯片加密的客户端,请使用clevis encrypt tpm2子命令,唯一的参数是JSON配置对象的形式。

    $ clevis encrypt tpm2 '{}' < input-plain.txt > secret.jwe

    要选择不同的层次结构、哈希和密钥算法,请指定配置属性,例如。

    $ clevis encrypt tpm2 '{"hash":"sha1","key":"rsa"}' < input-plain.txt > secret.jwe
  2. 要解密数据,请提供JSON Web加密(JWE)格式的密文。

    $ clevis decrypt < secret.jwe > output-plain.txt

该引脚还支持将数据封存到平台配置寄存器(PCR)状态。这样一来,只有当PCR的哈希值与封印时使用的策略相匹配时,数据才能被解封。

例如,将SHA-1库的数据用索引0和1封到PCR上。

$ clevis encrypt tpm2 '{"pcr_bank":"sha1","pcr_ids":"0,1"}' < input-plain.txt > secret.jwe

其它资源

  • 关于更多的信息和可能的配置属性列表,请参见clevis-encrypt-tpm2(1)man页面。

9.9. 配置LUKS加密卷的手动注册。

使用以下步骤来配置使用 NBDE 解锁 LUKS 加密卷。

先决条件

  • 一台唐人服务器正在运行并可用。

流程

  1. 要自动解锁现有的LUKS加密卷,请安装clevis-luks子包。

    # yum install clevis-luks
  2. 确定PBD的LUKS加密卷。在下面的例子中,块设备被称为/dev/sda2

    # lsblk
    NAME                                          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    sda                                             8:0    0    12G  0 disk
    ├─sda1                                          8:1    0     1G  0 part  /boot
    └─sda2                                          8:2    0    11G  0 part
      └─luks-40e20552-2ade-4954-9d56-565aa7994fb6 253:0    0    11G  0 crypt
        ├─rhel-root                               253:0    0   9.8G  0 lvm   /
        └─rhel-swap                               253:1    0   1.2G  0 lvm   [SWAP]
  3. 使用clevis luks bind命令将卷绑定到Tang服务器上。

    # clevis luks bind -d /dev/sda2 tang '{"url":"http://tang.srv"}'
    The advertisement contains the following signing keys:
    
    _OsIk0T-E2l6qjfdDiwVmidoZjA
    
    Do you wish to trust these keys? [ynYN] y
    You are about to initialize a LUKS device for metadata storage.
    Attempting to initialize it may result in data loss if data was
    already written into the LUKS header gap in a different format.
    A backup is advised before initialization is performed.
    
    Do you wish to initialize /dev/sda2? [yn] y
    Enter existing LUKS password:

    该命令执行四个步骤。

    1. 创建一个与LUKS主密钥具有相同熵的新密钥。
    2. 用Clevis加密新密钥。
    3. 将Clevis JWE对象存储在LUKS2头标记中,如果使用非默认的LUKS1头标记,则使用LUKSMeta。
    4. 启用新的密钥,以便与LUKS一起使用。

      注意

      绑定程序假设至少有一个免费的LUKS密码槽。clevis luks bind 命令占用了其中一个插槽。

  4. 现在可以用您现有的密码以及Clevis策略来解锁音量。
  5. 要启用早期启动系统处理磁盘绑定,请在已经安装的系统上输入以下命令。

    # yum install clevis-dracut
    # dracut -fv --regenerate-all

验证步骤

  1. 要验证Clevis JWE对象是否成功地放在LUKS头中,请使用clevis luks list命令。

    # clevis luks list -d /dev/sda2
    1: tang '{"url":"http://tang.srv:port"}'
重要

要在静态IP配置的客户机上使用NBDE(没有DHCP),请手动将您的网络配置传递给dracut工具,例如。

# dracut -fv --regenerate-all --kernel-cmdline "ip=192.0.2.10::192.0.2.1:255.255.255.0::ens3:none:192.0.2.45"

另外,在/etc/dracut.conf.d/目录下创建一个包含静态网络信息的.conf文件。例如:

# cat /etc/dracut.conf.d/static_ip.conf
kernel_cmdline="ip=192.0.2.10::192.0.2.1:255.255.255.0::ens3:none:192.0.2.45"

重新生成初始RAM磁盘镜像。

# dracut -fv --regenerate-all

其它资源

更多信息,请参见以下手册页面。

  • clevis-luks-bind(1)
  • dracut.cmdline(7)

9.10. 使用 Kickstart 配置 LUKS 加密卷的自动注册。

按照本程序中的步骤配置使用 Clevis 注册 LUKS 加密卷的自动安装过程。

流程

  1. 指示 Kickstart 对磁盘进行分区,使除/boot 以外的所有挂载点都使用临时密码启用 LUKS 加密。这一步报名过程中的密码是临时的。

    part /boot --fstype="xfs" --ondisk=vda --size=256
    part / --fstype="xfs" --ondisk=vda --grow --encrypted --passphrase=temppass

    需要注意的是,OSPP-投诉系统需要更复杂的配置,例如。

    part /boot --fstype="xfs" --ondisk=vda --size=256
    part / --fstype="xfs" --ondisk=vda --size=2048 --encrypted --passphrase=temppass
    part /var --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass
    part /tmp --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass
    part /home --fstype="xfs" --ondisk=vda --size=2048 --grow --encrypted --passphrase=temppass
    part /var/log --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass
    part /var/log/audit --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass
  2. 通过在%packages部分列出相关的Clevis软件包来安装。

    %packages
    clevis-dracut
    %end
  3. 调用clevis luks bind来执行%post部分的绑定。之后,删除临时密码。

    %post
    curl -sfg http://tang.srv/adv -o adv.jws
    clevis luks bind -f -k- -d /dev/vda2 \
    tang '{"url":"http://tang.srv","adv":"adv.jws"}' \ <<< "temppass"
    cryptsetup luksRemoveKey /dev/vda2 <<< "temppass"
    %end

    在前面的例子中,请注意,我们将从唐人服务器上下载广告作为绑定配置的一部分,使得绑定完全没有交互性。

    警告

    cryptsetup luksRemoveKey 命令可以防止对应用该命令的 LUKS2 设备进行任何进一步的管理。只有LUKS1设备可以使用dmsetup命令恢复被删除的主密钥。

当使用TPM 2.0策略而不是Tang服务器时,您可以使用类似的过程。

其它资源

9.11. 配置LUKS加密的可移动存储设备的自动解锁。

使用此步骤设置LUKS加密USB存储设备的自动解锁过程。

流程

  1. 要自动解锁LUKS加密的可移动存储设备,例如U盘,请安装clevis-udisks2软件包。

    # yum install clevis-udisks2
  2. 重新启动系统,然后使用clevis luks bind命令执行绑定步骤,如配置手动注册luks加密卷中所述。

    # clevis luks bind -d /dev/sdb1 tang '{"url":"http://tang.srv"}'
  3. LUKS 加密的可移动设备现在可以在 GNOME 桌面会话中自动解锁。绑定到Clevis策略的设备也可以通过clevis luks解锁命令解锁。

    # clevis luks unlock -d /dev/sdb1

当使用TPM 2.0策略而不是Tang服务器时,您可以使用类似的过程。

其它资源

更多信息,请看下面的手册页。

  • clevis-luks-unlockers(7)

9.12. 部署高可用性的NBDE系统

唐建国提供了两种构建高可用性部署的方法。

客户端冗余(建议)
客户端应配置为可以绑定多个唐人服务器。在这种设置中,每个Tang服务器都有自己的密钥,客户端可以通过联系这些服务器的子集来解密。Clevis已经通过SSS插件支持这种工作流程。红帽推荐这种方法用于高可用性部署。
钥匙共享
为了实现冗余,可以部署多个唐的实例。要设置第二个或任何后续的实例,安装tang包,并通过SSH 使用rsync将 key 目录复制到新主机上。请注意,Red Hat不推荐这种方法,因为共享密钥会增加密钥泄露的风险,并且需要额外的自动化基础设施。

9.12.1. 使用Shamir的秘密共享的高可用NBDE

Shamir's Secret Sharing(SSS)是一种加密方案,它将一个秘密分为几个独特的部分。要想重新构建秘密,需要一些部件。这个数字称为阈值,SSS也被称为阈值化方案。

Clevis提供了SSS的实施。它创造了一把钥匙,并将其分成若干块。每一块都是用另一个引脚加密,包括甚至SSS递归。此外,你还定义了阈值t。如果一个NBDE部署至少解密了t件,那么它就会恢复加密密钥,解密过程就会成功。当Clevis检测到的零件数量少于阈值中指定的数量时,它会打印一条错误信息。

9.12.1.1. 例1:两台Tang服务器的冗余

当两个Tang服务器中至少有一个可用时,以下命令可以解密LUKS加密的设备。

# clevis luks bind -d /dev/sda1 sss '{"t":1,"pins":{"tang":[{"url":"http://tang1.srv"},{"url":"http://tang2.srv"}]}}'

前面的命令使用了以下配置方案。

{
    "t":1,
    "pins":{
        "tang":[
            {
                "url":"http://tang1.srv"
            },
            {
                "url":"http://tang2.srv"
            }
        ]
    }
}

在这个配置中,SSS阈值t被设置为1,如果至少有一个从两个列出的tang服务器中可用,那么clevis luks bind命令就会成功地重建秘密。

9.12.1.2. 例2:唐人服务器和TPM设备上的共享秘密

tang服务器和tpm2设备都可用时,下面的命令可以成功解密LUKS加密的设备。

# clevis luks bind -d /dev/sda1 sss '{"t":2,"pins":{"tang":[{"url":"http://tang1.srv"}], "tpm2": {"pcr_ids":"0,1"}}}'

SSS阈值't'设置为'2'的配置方案现。

{
    "t":2,
    "pins":{
        "tang":[
            {
                "url":"http://tang1.srv"
            }
        ],
        "tpm2":{
            "pcr_ids":"0,1"
        }
    }
}

其它资源

  • 关于推荐的高可用性 NBDE 设置的更多信息,请参见以下手册页面。

    • 堂(8)高可用性部分
    • clevis(1)Shamir's Secret Sharing部分。
    • clevis-encrypt-sss(1)

9.13. 在NBDE网络中部署虚拟机。

clevis luks bind 命令不会改变 LUKS 主密钥。这意味着,如果您创建了用于虚拟机或云环境的LUKS加密映像,所有运行该映像的实例都将共享一个主密钥。这是极不安全的,任何时候都应该避免。

这不是Clevis的局限,而是LUKS的设计原则。如果你希望在云中拥有加密的根卷,你需要确保你也为云中的每个Red Hat Enterprise Linux实例执行安装过程(通常使用Kickstart)。如果不同时共享LUKS主密钥,则无法共享图片。

如果你打算在虚拟化环境中部署自动解锁,Red Hat 强烈建议你使用 lorax 或 virt-install 等系统与 Kickstart 文件一起使用(请参见使用 Kickstart 配置自动注册 LUKS 加密卷)或其他自动供应工具,以确保每个加密的虚拟机都有一个唯一的主密钥。

注意

虚拟机中不支持使用TPM 2.0策略自动解锁。

其它资源

更多信息,请看下面的手册页。

  • clevis-luks-bind(1)

9.14. 使用NBDE为云环境构建可自动注册的虚拟机镜像

在云环境中部署可自动注册的加密图像会带来一系列独特的挑战。与其他虚拟化环境一样,建议减少从单个镜像启动的实例数量,以避免共享LUKS主密钥。

因此,最好的做法是创建不在任何公共存储库中共享的定制图像,并为部署有限数量的实例提供基础。创建实例的确切数量应该由部署的安全策略来定义,并基于与LUKS主密钥攻击向量相关的风险容忍度。

为了构建LUKS的自动部署,应该使用Lorax或virt-install等系统和Kickstart文件来确保镜像构建过程中主密钥的唯一性。

云环境可以实现两种唐服务器的部署方案,我们在此考虑。首先,唐人服务器可以在云环境中自行部署。其次,唐人服务器可以部署在云外的独立基础设施上,两个基础设施之间有VPN连接。

在云端原生部署Tang,确实可以轻松部署。但是,考虑到它与其他系统的密文数据持久层共享基础设施,可能唐服务器的私钥和Clevis元数据都存储在同一个物理磁盘上。访问这个物理磁盘,可以对密文数据进行全面妥协。

重要

因此,Red Hat 强烈建议在存储数据的位置和运行 Tang 的系统之间保持物理隔离。这种云端和唐人服务器之间的分离,保证了唐人服务器的私钥不会意外地与Clevis元数据结合。如果云基础架构面临风险,它还可以对唐服务器进行本地控制。

9.15. Clevis 和 Tang 系统角色介绍

RHEL 系统角色是 Ansible 角色和模块的集合,可为远程管理多个 RHEL 系统提供一致的配置界面。

RHEL 8.3引入了Ansible角色,用于使用Clevis和Tang自动部署基于策略的解密(PBD)解决方案。rhel-system-roles 包中包含了这些系统角色、相关的例子以及参考文档。

nbde_client 系统角色使您能够以自动化的方式部署多个Clevis客户端。需要注意的是,nbde_client角色只支持Tang绑定,目前还不能用于TPM2绑定。

nbde_client 角色需要已经使用 LUKS 加密的卷。该角色支持将LUKS加密卷绑定到一个或多个网络绑定(NBDE)服务器--Tang服务器。您可以使用密码保留现有的卷加密,或者将其删除。删除密码后,只能使用NBDE解锁卷。当一个卷最初使用临时密钥或密码加密时,这很有用,在您提供系统后,您应该将其删除。

如果你同时提供密码和密钥文件,角色会使用你先提供的文件。如果它没有发现这些有效的信息,它就会尝试从现有的绑定中检索密码。

PBD将绑定定义为设备与插槽的映射。这意味着您可以为同一设备拥有多个绑定。默认的插槽是插槽1。

nbde_client 角色也提供了 state 变量。使用现值来创建新的绑定或更新现有的绑定。与clevis luks bind命令相反,你也可以使用state: present来覆盖其设备槽中的现有绑定。absent 的值会删除指定的绑定。

使用nbde_server角色,您可以部署和管理Tang服务器作为自动化磁盘加密解决方案的一部分。此角色支持以下功能:

  • 轮转 Tang 密钥
  • 部署和备份 Tang 密钥

其它资源

  • 要了解有关 Network-Bound Disk Encryption (NBDE) 角色变量的详细参考资料,请安装rhel-system-roles软件包,并查看/usr/share/doc/rhel-system-roles/nbde_client//usr/share/doc/rhel-system-roles/nbde_server/目录中的README.mdREADME.html文件。
  • 例如system-roles playbooks,安装rhel-system-roles包,查看/usr/share/ansible/roles/rhel-system-roles.nbde_server/examples/目录。
  • 有关 RHEL 系统角色的更多信息,请参阅 RHEL 系统角色简介

9.16. 使用 nbde_server 系统角色设置多个 Tang 服务器

按照以下步骤准备并应用包含您的 Tang-server 设置的 Ansible playbook。

先决条件

流程

  1. 启用 RHEL Ansible 存储库,例如:

    # subscription-manager repos --enable ansible-2-for-rhel-8-x86_64-rpms
  2. 安装 Ansible Engine:

    # yum install ansible
  3. 安装 RHEL 系统角色:

    # yum install rhel-system-roles
  4. 准备包含 Tang 服务器设置的 playbook。你可以从头开始,或者使用/usr/share/ansible/roles/rhel-system-roles.nbde_server/examples/目录中的一个示例playbook。

    # cp /usr/share/ansible/roles/rhel-system-roles.nbde_server/examples/simple_deploy.yml ./my-tang-playbook.yml
  5. 在您选择的文本编辑器中编辑 playbook,例如:

    # vi my-tang-playbook.yml
  6. 添加所需参数。下面的示例玩法确保了你的唐朝服务器的部署和关键轮换。

    ---
    - hosts: all
    
      vars:
        nbde_server_rotate_keys: yes
    
      roles:
        - linux-system-roles.nbde_server
  7. 应用完成的 playbook:

    # ansible-playbook -i host1,host2,host3 my-tang-playbook.yml

其它资源

  • 更多信息,请安装rhel-system-roles包,并查看/usr/share/doc/rhel-system-roles/nbde_server/usr/share/ansible/roles/rhel-system-roles.nbde_server/目录。

9.17. 使用 nbde_client 系统角色设置多个 Clevis 客户端

按照以下步骤准备并应用包含 Clevis-client 设置的 Ansible playbook。

注意

nbde_client 系统角色只支持 Tang 绑定。这意味着您目前无法将其用于 TPM2 绑定。

先决条件

流程

  1. 启用 RHEL Ansible 存储库,例如:

    # subscription-manager repos --enable ansible-2-for-rhel-8-x86_64-rpms
  2. 安装 Ansible Engine:

    # yum install ansible
  3. 安装 RHEL 系统角色:

    # yum install rhel-system-roles
  4. 准备包含 Clevis 客户端设置的 playbook。你可以从头开始,或者使用/usr/share/ansible/roles/rhel-system-roles.nbde_client/examples/目录中的一个示例playbook。

    # cp /usr/share/ansible/roles/rhel-system-roles.nbde_client/examples/high_availability.yml ./my-clevis-playbook.yml
  5. 在您选择的文本编辑器中编辑 playbook,例如:

    # vi my-clevis-playbook.yml
  6. 添加所需参数。下面的示例演练手册配置了Clevis客户端,以便在两个Tang服务器中至少有一个可用时自动解锁两个LUKS加密卷。

    ---
    - hosts: all
    
      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
    
      roles:
        - linux-system-roles.nbde_client
  7. 应用完成的 playbook:

    # ansible-playbook -i host1,host2,host3 my-clevis-playbook.yml

其它资源

  • 有关nbde_client角色的参数和其他信息的详细信息,请安装rhel-system-roles软件包,并查看/usr/share/doc/rhel-system-roles/nbde_client//usr/share/ansible/roles/rhel-system-roles.nbde_client/目录。

9.18. 其它资源


为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。