在 CentOS/RHEL 8 上使用基于网络的密钥服务 (NBDE) 的磁盘加密

问题:

如何使用 clevis(客户端)和 tang(服务器)创建在启动时自动解锁的加密 XFS 文件系统?

多年来,红帽一直将磁盘加密纳入 Linux 磁盘统一密钥设置格式 (LUKS)。
该解决方案易于实施和配置以满足加密需求,但其密钥管理的管理和实用性对于服务器来说是可怕的。
它在启动或者挂载时需要密码短语,必须手动输入。
这使得该解决方案令系统管理员头疼。

从 RHEL 7.4 开始,在 RHEL 7.5 的完全支持下,Red Hat 实施了一个添加组件,可用于远程启用 LUKS 磁盘。
这称为网络绑定磁盘加密 (NBDE)。

网络绑定磁盘加密 (NBDE) 是:

  • Linux 统一密钥设置 (LUKS) 是一种磁盘加密标准。
  • Cryptsetup 配置基于磁盘的加密并包括对 LUKS 的支持
  • Tang 是一个通过 HTTP 提供加密服务的网络服务
  • Clevis 是一个加密框架。 Clevis 可以使用 Tang 提供的密钥作为密码来解锁 LUKS 卷
  • 客户端 clevis 必须是 CentOS/RHEL 8,因为 CentOS/RHEL 7 上的 clevis 功能有限,需要一组不同的命令,本文未涵盖。
  • 服务器 tang 可以在 CentOS/RHEL 7 或者 8 上运行
查看更多教程 https://on  itroad.com

设置唐服务器

  1. 安装 RPM:
# dnf install -y tang
  1. 允许所需端口通过防火墙:
# firewall-cmd --add-service=http --permanent
# firewall-cmd --reload
  1. 启用服务:
# systemctl enable --now tangd.socket

安装 U 形夹客户端

创建加密文件系统

  1. 在客户端安装必要的包:
# dnf install -y cryptsetup clevis-systemd clevis-luks
  1. 在 /dev/xvdc 上创建加密磁盘:

注意:确保 xvdc 是一个空驱动器,因为它上面的所有数据都将被删除。

# cryptsetup luksFormat --type luks2 --cipher aes-xts-plain64 --key-size 512 --hash sha256 --use-random /dev/xvdc
WARNING!
========
This will overwrite data on /dev/xvdc irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/xvdc:
Verify passphrase:
  1. 解锁块设备:
# cryptsetup --verbose luksOpen /dev/xvdc demodisk
Enter passphrase for /dev/xvdc:
Key slot 0 unlocked.
Command successful.
  1. 在加密磁盘上创建文件系统:
# mkfs.xfs /dev/mapper/demodisk
meta-data=/dev/mapper/demodisk isize=512 agcount=4, agsize=326656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=1306624, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
  1. 识别新文件系统的 UUID:
# blkid -s UUID /dev/mapper/demodisk
/dev/mapper/demodisk: UUID="24f9bfe9-1f6d-491d-8fa2-eab946464166"
  1. 为文件系统创建一个 fstab 条目:
# echo "UUID=24f9bfe9-1f6d-491d-8fa2-eab946464166 /encrypted xfs defaults 0 0" | sudo tee -a /etc/fstab
UUID=24f9bfe9-1f6d-491d-8fa2-eab946464166 /encrypted xfs defaults 0 0
  1. 挂载文件系统:
# mkdir /encrypted
# mount /encrypted

向加密设备添加远程密钥

  1. 查看密钥:
# cryptsetup luksDump /dev/xvdc
LUKS header information
Version: 2
Epoch: 3
Metadata area: 16384 [bytes]
Keyslots area: 16744448 [bytes]
UUID: 47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26
Label: (no label)
  1. 添加遥控钥匙:
# clevis luks bind -d /dev/xvdc tang '{"url":"http://"}'
The advertisement contains the following signing keys:
KlbbdbNpdMrVwrk6hZ1wCCeabOY
Do you wish to trust these keys? [ynYN] Y
Enter existing LUKS password:
  1. 显示槽 1 中有一个新的键槽正在被 Clevis 使用:
# cryptsetup luksDump /dev/xvdc
LUKS header information
Version: 2
Epoch: 5
Metadata area: 16384 [bytes]
Keyslots area: 16744448 [bytes]
UUID: 47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26
Label: (no label)
Subsystem: (no subsystem)
Flags: (no flags)
Data segments:
0: crypt
offset: 16777216 [bytes]
length: (whole device)
cipher: aes-xts-plain64
sector: 512 [bytes]
Keyslots:
0: luks2
Key: 512 bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 512 bits
PBKDF: argon2i
Time cost: 4
Memory: 399588
Threads: 4
Salt: 0d 75 99 50 22 e2 2a 93 82 51 fc 49 6f 54 61 fe
10 b6 24 62 21 2e 07 2b 04 0a 56 c8 03 23 6f 8f
AF stripes: 4000
AF hash: sha256
Area offset:32768 [bytes]
Area length:258048 [bytes]
Digest ID: 0
1: luks2
Key: 512 bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 512 bits
PBKDF: argon2i
Time cost: 4
Memory: 508554
Threads: 4
Salt: 21 c8 91 58 22 9f 50 83 77 6f fe 12 0b 3a 66 3c
d2 47 70 88 45 70 5e f1 c1 1e d0 e1 8f 96 97 ce
AF stripes: 4000
AF hash: sha256
Area offset:290816 [bytes]
Area length:258048 [bytes]
Digest ID: 0
Tokens:
0: clevis
Keyslot: 1
Digests:
0: pbkdf2
Hash: sha256
Iterations: 30284
Salt: de a0 3f 92 e1 c7 1d 5e 0e 52 65 37 19 84 2b 3c
46 2a ba 56 77 25 78 c3 27 fa 5b 07 e1 9a 25 24
Digest: 5b 95 93 af 0e a9 8d 24 cb 35 1e 77 e5 9f 15 85
eb d1 53 85 5b e4 10 2a 68 d0 11 6b 9b 71 f4 05

在启动时挂载加密的文件系统

  1. 识别块设备UUID以备后用:
# blkid -s UUID /dev/xvdc
/dev/xvdc: UUID="47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26"
  1. 使用为“/dev/xvdc”发现的 UUID 启用服务:
# systemctl enable clevis-luks-askpass@47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26.path
Created symlink /etc/systemd/system/basic.target.wants/clevis-luks-askpass@47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26.path → /usr/lib/systemd/system/clevis-luks-askpass@.path.
  1. 在启动过程中解锁块设备:
# echo "encrypteddisk UUID=47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26 - _netdev" | sudo tee -a /etc/crypttab
encrypteddisk UUID=47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26 - _netdev
  1. 稍后在启动时挂载文件系统:
# vi /etc/fstab

UUID=24f9bfe9-1f6d-491d-8fa2-eab946464166 /encrypted xfs defaults 0 0

改成

/dev/mapper/encrypteddisk /encrypted xfs _netdev 0 0
  1. 重新启动服务器并验证功能:
# reboot
# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs 1.8G 8.5M 1.8G 1% /run
tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup
/dev/mapper/ol_dhcp-root 22G 1.6G 20G 8% /
/dev/xvda1 1014M 221M 794M 22% /boot
tmpfs 365M 0 365M 0% /run/user/0
/dev/mapper/encrypteddisk 5.0G 68M 5.0G 2% /encrypted

可选:删除已知密码

我们可以从插槽 0 中删除已知密码并强制使用 tang 服务器。
如果无法访问 tang 服务器,则无法解锁磁盘且无法访问文件系统。

  1. 删除密码:
# cryptsetup --verbose luksRemoveKey /dev/xvdc
Enter passphrase to be deleted:
Key slot 0 unlocked.
Keyslot 0 is selected for deletion.
Key slot 0 removed.
Command successful.
  1. 显示现在只有 U 形夹键槽:
# cryptsetup --verbose luksRemoveKey /dev/xvdc
Enter passphrase to be deleted:
Key slot 0 unlocked.
Keyslot 0 is selected for deletion.
Key slot 0 removed.
Command successful.
# cryptsetup luksDump /dev/xvdc
LUKS header information
Version: 2
Epoch: 6
Metadata area: 16384 [bytes]
Keyslots area: 16744448 [bytes]
UUID: 47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26
  1. 重新启动并验证功能:
# reboot
# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs 1.8G 8.5M 1.8G 1% /run
tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup
/dev/mapper/ol_dhcp-root 22G 1.6G 20G 8% /
/dev/xvda1 1014M 221M 794M 22% /boot
/dev/mapper/encrypteddisk 5.0G 68M 5.0G 2% /encrypted
tmpfs 365M 0 365M 0% /run/user/0
日期:2020-09-17 00:14:16 来源:oir作者:oir