使用clevis和tang服务器配置LUKS网络绑定磁盘加密
在本文中,将介绍配置CentOS/Red Hat"网络绑定磁盘加密(NBDE)"的步骤。
在我们之前的文章中,我们研究了有关加密不同类型磁盘设备的所有内容,并通过使用密钥(/etc/crypttab
)代替密码短语来自动挂载那些LUKS设备以在没有密码的情况下启动。
现在,通过这些步骤,我们将需要在单个Linux服务器上创建密钥(luksAddkey
)以无需密码即可启动的开销。
假设我们有100台服务器,那么这将是非常耗时的任务。
从RHEL 7.4开始,我们可以配置网络绑定磁盘加密,以使用来自特定LUKS服务器的密钥来"自动卸载网络中客户端节点上的LUKS设备"并"不带密码启动"。
基于策略的解密
基于策略的解密(PBD)是一组技术,可以对物理和虚拟机上的硬盘驱动器的加密的根卷和二级卷进行解锁。
"网络绑定磁盘加密(NBDE)是PBD的子类别",它允许将加密的卷绑定到特殊的网络服务器,而无需密码即可启动。
NBDE的当前实现使用Clevis和Tang加密,其中包括用于Tang服务器和Tang服务器本身的Clevis引脚。
让我们了解本文中将使用的一些新术语。
Tang
Tang是用于将数据绑定到网络状态的服务器。
当系统绑定到某个安全网络时,它将使包含数据的系统可用。
Tang是无状态的,不需要TLS或者身份验证。
Clevis
Clevis是用于自动解密的可插入框架。
在NBDE中,Clevis提供了LUKS卷的自动解锁。
clevis软件包提供了该功能的客户端。
Clevis和Tang加密是提供网络绑定磁盘加密的通用客户端和服务器组件。
在Red Hat Enterprise Linux中,它们与LUKS结合使用以对根和非根存储卷进行加密和解密,以完成网络绑定磁盘加密(NBDE)。
客户端和服务器端组件都使用José库执行加密和解密操作。
网络绑定磁盘加密(NBDE)如何工作?
Tang Server的Clevis密码使用一个公钥来生成唯一的,加密强度高的加密密钥。
一旦使用此密钥加密了数据,该密钥将被丢弃。
加密数据的此过程是预配步骤。当客户端准备好访问其数据时,它将加载在设置步骤中生成的元数据,并响应以恢复加密密钥。
此过程是恢复步骤。在NBDE中,Clevis使用大头针绑定LUKS卷,以便可以自动将其解锁。
成功完成绑定过程后,可以使用提供的Dracut解锁器来解锁磁盘。
实验室环境
我创建了两个虚拟机来在Oracle VirtualBox上配置Clevis和Tang加密,其中服务器与RHEL 8一起安装。
当客户端与CentOS 8.0一起安装时为1
在我的客户机节点centos-8
上,我已经将整个根文件系统迁移到LUKS加密的设备,该设备现在每次重启节点时都需要一个密钥。
因此,在我的客户端上,我将在服务器rhel-8上安装并配置clevis,同时我将配置tang服务器以在每次客户端centos-8重新启动时执行网络绑定磁盘加密(无需密码即可启动)。
服务器
→rhel-8.example.com→192.168.0.121→RHEL 8.1客户端
→centos-8.example.com→192.168.0.119→CentOS 8.0
以下是我的客户端和服务器节点上安装的操作系统。
[root@centos-8 ~]# cat /etc/redhat-release CentOS Linux release 8.0.1905 (Core) [root@rhel-8 ~]# cat /etc/redhat-release Red Hat Enterprise Linux release 8.1 (Ootpa)
提示:
根据Red Hat文档,从RHEL 7.4开始,NDBE可以使用clevis和tang加密,但是本文将使用RHEL 8. 如果我们遇到RHEl 7.4及更高版本的任何问题,请通过本文下面的评论部分告诉我。
配置服务器(RHEL 8)
我们将使用它的默认端口和rhel-8
上的设置来配置tang服务器,它将用作我们的服务器。
默认情况下,tang配置为使用端口80,但我们也可以将tang服务器配置为使用其他自定义端口,以增强安全性。
安装和配置Tang服务器
要启用Clevis和tang加密,我们将首先使用'yum'在我们的服务器节点上安装tang rpm。
说明:
在RHEL系统上,我们必须具有RHN的有效订阅,或者我们可以配置本地脱机存储库,通过该本地脱机存储库,yum
软件包管理器可以安装提供的rpm及其依赖项。
[root@rhel-8 ~]# yum -y install tang
下一步启动并启用" tangd"套接字。
由于" tangd"使用" systemd"套接字激活机制,因此服务器在第一个连接进入后即启动。
在第一次启动时会自动生成一组新的加密密钥。
[root@rhel-8 ~]# systemctl enable tangd.socket --now Created symlink /etc/systemd/system/multi-user.target.wants/tangd.socket → /usr/lib/systemd/system/tangd.socket.
为了测试目的,我在设置中禁用了firewalld
,nftables
和selinux
。
[root@rhel-8 ~]# systemctl disable firewalld --now
但是,如果我们想使用firewalld
,则可以添加以下规则
# firewall-cmd --add-port=80/tcp # firewall-cmd --runtime-to-permanent
说明:
如果我们希望使用其他端口来配置Tang Server,则可以在"防火墙"规则中提供相应的端口,前提是我们选择的端口为7500。
# firewall-cmd --add-port=7500/tcp # firewall-cmd --runtime-to-permanent
类似地,对于selinux,使用semanage port -a -t tangd_port_t -p tcp 7500
。
此外,我们还必须在/etc/systemd/system/tangd.socket.d/override.conf中添加以下内容。
[Socket] ListenStream= ListenStream=7500
并重新加载更改的配置:
# systemctl daemon-reload
检查配置是否正常工作:
[root@rhel-8 ~]# systemctl show tangd.socket -p Listen Listen=[::]:80 (Stream)
列出Tang服务器密钥
tang服务器的密钥在/var/db/tang
下可用,它将由客户端用于网络绑定磁盘加密(NBDE)。
[root@rhel-8 ~]# ls -l /var/db/tang/ total 8 -rw-r--r-- 1 root tang 349 Nov 21 11:36 7VXZSkDbTEqqIh7TqoXG6u82LK0.jwk -rw-r--r-- 1 root tang 354 Nov 21 11:36 -NYm6-gTZ9dquHe6zy9ynGU8SAI.jwk
现在,我们将打开tang服务器的终端,并执行journalctl -f
来监视tang服务器i上的实时传入日志。
e。rhel-8.example.com
[root@rhel-8 ~]# journalctl -f -- Logs begin at Wed 2019-11-20 17:52:06 IST. - Nov 21 11:46:12 rhel-8.example.com tangd[4454]: 192.168.0.119 POST /rec/7VXZSkDbTEqqIh7TqoXG6u82LK0 => 200 (src/tangd.c:168) Nov 21 11:48:33 rhel-8.example.com systemd[1]: Started Tang Server (192.168.0.119:53408). Nov 21 11:48:33 rhel-8.example.com tangd[4461]: 192.168.0.119 POST /rec/7VXZSkDbTEqqIh7TqoXG6u82LK0 => 200 (src/tangd.c:168) Nov 21 11:49:49 rhel-8.example.com systemd[1]: Started Tang Server (192.168.0.119:60284). Nov 21 11:49:49 rhel-8.example.com tangd[4465]: 192.168.0.119 POST /rec/7VXZSkDbTEqqIh7TqoXG6u82LK0 => 200 (src/tangd.c:168)
配置客户端
接下来,继续在客户端节点" centos-8"上进行" clevis和tang加密"配置。
使用终端或者ssh客户端连接到客户端节点" centos-8"。
现在,我们已经将整个文件系统迁移到LUKS加密的设备,该设备现在在每次重新启动时都会提示我们输入密码。
其中我们希望配置基于网络的磁盘加密,以使用tang服务器(rhel-8
)的密钥来启用无密码启动以解锁LUKS设备。
安装和配置Clevis
要自动解锁现有的LUKS加密的根卷并在没有密码的情况下启动,请在包含LUKS加密分区的客户端节点上安装以下程序包:
[root@centos-8 ~]# yum -y install clevis clevis-luks clevis-dracut
使用luksDump
验证可用的密钥槽。
如我们所看到的突出显示的部分,我们目前仅使用了一个键槽,即0:luks2
[root@centos-8 ~]# cryptsetup luksDump /dev/sdb1 <Output trimmed> Keyslots: 0: luks2 Key: 256 bits Priority: normal Cipher: aes-xts-plain64 PBKDF: argon2i Time cost: 4 Memory: 572835 Threads: 1 Salt: 2b f5 65 0e 50 36 d9 5a 2c 90 e9 e6 61 c8 db bc ba 86 1b cd ea 79 cd b8 b1 cc 8d 20 84 29 fb 87 AF stripes: 4000 Area offset:32768 [bytes] Area length:131072 [bytes] Digest ID: 0 <Output trimmed>
识别LUKS设备
识别使用NBDE进行基于策略的解密的LUKS加密卷。
在以下示例中,块设备称为/dev/sdb1
:
[root@centos-8 ~]# blkid -t TYPE=crypto_LUKS -o device /dev/sdb1
所以我们的LUKS加密设备是/dev/sdb1
。
要启用Clevis和tang加密,请使用clevisluks bind
命令将加密的卷绑定到tang服务器:
[root@centos-8 ~]# clevis luks bind -d /dev/sdb1 tang '{"url":"192.168.0.121"}' The advertisement contains the following signing keys: -NYm6-gTZ9dquHe6zy9ynGU8SAI Do you wish to trust these keys? [ynYN] Y Enter existing LUKS password:
该命令执行四个步骤:
创建一个与LUKS主密钥具有相同熵的新密钥。
使用Clevis加密新密钥。
将Clevis JWE对象存储在LUKS2标头令牌中,如果使用了非默认的LUKS1标头,则使用LUKSMeta。
启用与LUKS一起使用的新密钥。
说明:
绑定过程假定至少有一个免费的LUKS密码插槽。
clevisluks bind
命令占用一个插槽。
现在可以使用我们现有的密码以及Clevis策略来解锁LUKS加密卷。
现在,如果我们验证我们为LUKS加密设备安装了两个密钥,请突出显示:
[root@centos-8 ~]# cryptsetup luksDump /dev/sdb1 <Output trimmed> Keyslots: 0: luks2 Key: 256 bits Priority: normal Cipher: aes-xts-plain64 PBKDF: argon2i Time cost: 4 Memory: 572835 Threads: 1 Salt: 2b f5 65 0e 50 36 d9 5a 2c 90 e9 e6 61 c8 db bc ba 86 1b cd ea 79 cd b8 b1 cc 8d 20 84 29 fb 87 AF stripes: 4000 Area offset:32768 [bytes] Area length:131072 [bytes] Digest ID: 0 1: luks2 Key: 256 bits Priority: normal Cipher: aes-xts-plain64 PBKDF: argon2i Time cost: 4 Memory: 560933 Threads: 1 Salt: 11 4b dd b5 f7 c9 72 74 90 a5 3e b2 7e 37 37 fa e0 42 d5 7d 7e 18 19 56 ec c4 31 e3 cb 4b 25 d6 AF stripes: 4000 Area offset:163840 [bytes] Area length:131072 [bytes] Digest ID: 0 <Output trimmed>
要使早期引导系统能够处理磁盘绑定和无密码引导,请在已安装的系统上输入以下命令:
[root@centos-8 ~]# dracut -f
我们都已经其中设置好了,现在我们可以重新启动客户端节点" centos-8"并观察节点控制台。
如我们所见,在启动阶段,客户端会提示我们的根文件系统使用LUKS加密密码。
但是在等待了几秒钟之后,它从tang服务器(rhel-8
)获得了密钥,并继续在没有密码的情况下启动。