13 使用 cryptctl 对托管应用程序的存储区加密 #
数据库和类似的应用程序常常托管在由第三方工作人员管理的外部服务器上。某些数据中心维护任务需要第三方工作人员直接访问受影响的系统。在此类情况下,为了满足隐私要求,就必须进行磁盘加密。
cryptctl
可让您使用 LUKS 加密敏感目录,并提供以下附加功能:
加密密钥位于中心服务器上,而中心服务器可位于客户本地。
系统会在计划外重引导后自动重新挂载加密分区。
cryptctl
包括以下两个组件:
客户端是一台包含一个或多个加密分区的计算机,但不永久存储解密这些分区所必需的密钥。例如,客户端可以是云或托管计算机。
由服务器来保存加密密钥,客户端可以请求这些密钥来解锁加密分区。
您也可以设置
cryptctl
服务器,以便在与 KMIP(密钥管理互操作性协议)1.3 兼容的服务器上存储加密密钥。在这种情况下,cryptctl
服务器将不存储客户端的加密密钥,而是依赖与 KMIP 兼容的服务器提供这些密钥。
cryptctl
服务器维护
由于 cryptctl
服务器负责管理加密磁盘超时,而且还可以保存加密密钥(具体取决于配置),因此它应该由您自己直接控制,并由可信的人员管理。
此外,应定期对其进行备份。丢失服务器的数据意味着会失去客户端上加密分区的访问权限。
为了处理加密,cryptctl
将 LUKS 与 aes-xts-256 加密法和 512 位密钥结合使用。可使用 TLS 通过证书校验来传输加密密钥。
cryptctl
检索密钥(不连接 KMIP 服务器的模式) #cryptctl
在继续前,请确保您要设置为服务器或客户端的所有计算机上都已安装软件包 cryptctl。
13.1 设置 cryptctl
服务器 #
在您可以将一台计算机定义为 cryptctl
客户端之前,需将一台计算机设置为 cryptctl
服务器。
在开始之前,请选择是否要使用自我签名证书来保护服务器与客户端之间的通讯。如果不使用,请为服务器生成 TLS 证书,并通过证书颁发机构为该证书签名。
此外,可以让客户端使用由证书颁发机构签名的证书向服务器进行身份验证。要采取这项额外的安全措施,请务必在开始执行此过程之前准备好 CA 证书。
以
root
身份运行:#
cryptctl init-server
回答随后出现的每个提示问题,并在每回答一个问题后按 Enter。如果有默认的答案,提示末尾的方括号中会显示此答案。
创建一个强口令并妥善保护它。此口令可用于解锁服务器上注册的所有分区。
指定 PEM 编码的 TLS 证书或证书链文件的路径,或者将该字段留空以创建自我签名证书。如果指定了路径,请使用绝对路径。
如果您不想使用所显示的默认主机名来标识服务器,请指定主机名。
cryptctl
生成包含主机名的证书。指定 IP 地址,该地址属于您要在其上侦听来自客户端的解密请求的网络接口;然后设置端口号(默认端口为 3737)。
默认 IP 地址设置
0.0.0.0
表示cryptctl
将使用 IPv4 在所有网络接口上侦听客户端请求。指定服务器上用于保存客户端解密密钥的目录。
指定客户端是否需要使用 TLS 证书向服务器进行身份验证。如果您选择
,则表示客户端使用磁盘 UUID 进行身份验证。(不过,在所有情况下,都将使用服务器证书加密通讯。)如果您选择
,请选取一个用于对客户端证书进行签名的 PEM 编码的证书颁发机构。指定是否使用一台与 KMIP 1.3 兼容的服务器(或多台此类服务器)来存储客户端的加密密钥。如果您选择此选项,请提供一台或多台与 KMIP 兼容的服务器的主机名和端口。
此外,请提供 KMIP 服务器的用户名、口令、CA 证书,以及
cryptctl
服务器的客户端身份证书。重要:无法轻松重新配置 KMIP 设置以后将无法轻松更改有关使用 KMIP 服务器的设置。要更改此设置,需要从头开始配置
cryptctl
服务器及其客户端。最后,配置一台 SMTP 服务器用于发送加密和解密请求的电子邮件通知,或者将提示留空以跳过电子邮件通知的设置。
注意:受口令保护的服务器cryptctl
目前无法使用受身份验证保护的 SMTP 服务器发送电子邮件。如果必须发送电子邮件,请设置本地 SMTP 代理。当系统询问是否要启动
cryptctl
服务器时,请输入y
。
要检查服务
cryptctl-server
的状态,请使用:#
systemctl status cryptctl-server
如果以后要重新配置服务器,请执行以下操作之一:
再次运行
cryptctl init-server
命令。cryptctl
会建议将现有设置用作默认设置,因此您只需指定要更改的值。直接在配置文件
/etc/sysconfig/cryptctl-server
中进行更改。但是,为了避免出现问题,请勿手动更改
AUTH_PASSWORD_HASH
和AUTH_PASSWORD_SALT
设置。您需要正确计算这些选项的值。
13.2 设置 cryptctl
客户端 #
目前仅支持下述 cryptctl
交互式设置方法。
确保满足以下先决条件:
可通过网络使用
cryptctl
服务器。存在一个要加密的目录。
客户端计算机包含一个可用的空分区,该分区足以容纳要加密的目录。
使用自我签名证书时,在服务器上生成的证书(
*.crt
文件)可在客户端本地使用。否则,服务器证书的证书颁发机构必须受客户端的信任。如果您将服务器设置为要求客户端使用客户端证书进行身份验证,请为客户端准备一个由您为服务器选择的 CA 证书签名的 TLS 证书。
以
root
身份运行:#
cryptctl encrypt
回答随后出现的每个提示问题,并在每回答一个问题后按 Enter。如果有默认的答案,提示末尾的方括号中会显示此答案。
指定要在
cryptctl
服务器上连接到的主机名和端口。如果您已将服务器配置为要求客户端使用 TLS 证书进行身份验证,请指定客户端的证书和密钥文件。客户端证书必须由设置服务器时选择的证书颁发机构签名。
指定服务器证书(
*.crt
文件)的绝对路径。输入设置服务器时指定的加密口令。
指定要加密的目录的路径。指定用于包含目录加密内容的空分区的路径。
指定允许同时解密该分区的计算机数目。
然后指定在从一个或多个客户端收到最后一个活跃信号之后到允许其他计算机解密分区之前必须经过的超时(以秒为单位)。
当计算机意外停止工作然后再重引导时,它需要能够再次解锁其分区。这意味着,此超时应设置为比客户端重引导时长略短的时间。
重要:超时时长如果设置的时间太长,计算机首次尝试解密加密分区时将会失败。虽然
cryptctl
之后会继续定期检查加密密钥是否可用,但这会造成延迟。如果超时设置得太短,包含加密分区副本的计算机首先解锁该分区的可能性将会提高。
要开始加密,请输入
yes
。cryptctl
将指定的目录加密到先前为空的分区,然后挂载新加密的分区。文件系统类型与原始的未加密文件系统的类型相同。在创建加密分区之前,
cryptctl
会将原始目录的未加密内容移至带有cryptctl-moved-
前缀的位置。要检查是否确实正确挂载了该目录,请使用:
>
lsblk -o NAME,MOUNTPOINT,UUID
NAME MOUNTPOINT UUID [...] sdc └─sdc1 PARTITION_UUID └─cryptctl-unlocked-sdc1 /secret-partition UNLOCKED_UUIDcryptctl
根据加密分区的 UUID 来识别该分区。在上一示例中,其为sdc1
旁边显示的 UUID。在服务器上,您可以使用
cryptctl
来检查目录是否已解密。#
cryptctl list-keys
如果分区已成功解密,您将看到如下所示的输出:
2019/06/06 15:50:00 ReloadDB: successfully loaded database of 1 records Total: 1 records (date and time are in zone EDT) Used By When UUID Max.Users Num.Users Mount Point IP_ADDRESS 2019-06-06 15:00:50 UUID 1 1 /secret-partition
如果分区未成功解密,您将看到如下所示的输出:
2019/06/06 15:50:00 ReloadDB: successfully loaded database of 1 records Total: 1 records (date and time are in zone EDT) Used By When UUID Max.Users Num.Users Mount Point 2019-06-06 15:00:50 UUID 1 1 /secret-partition
在空的
Used by
列中可以看到差异。校验显示的 UUID 是否属于先前加密的分区。
确认加密分区可正常工作后,从客户端中删除未加密内容。例如,使用
rm
。为了提高安全性,请在删除文件内容之前将其重写(例如,使用shred -u
)。重要:shred
不保证擦除该数据使用
shred
不能保证去除所有数据,具体取决于存储媒体的类型。具体而言,SSD 采用耗损均衡策略,这使得shred
的效率不高。
客户端与服务器间的连接配置存储在 /etc/sysconfig/cryptctl-client
中,可以手动编辑。
服务器将客户端分区的加密密钥存储在 /var/lib/cryptctl/keydb/PARTITION_UUID
中。
13.3 为 LUKS 卷配置 /etc/fstab #
为使用 LUKS 加密的新文件系统配置挂载点时,YaST 默认将使用 /etc/fstab
中已加密设备的名称。(例如 /dev/mapper/cr_sda1
。)使用设备名称而不是 UUID 或卷标能够更稳健地操作 systemd 生成器和其他相关工具。
可以选择使用安装程序中的专家分区程序或通过 AutoYaST 调整每个设备的默认行为。
这种更改不会影响升级,也不影响已在 /etc/fstab
中定义了挂载点的任何其他方案。新建的挂载点会受影响(例如,在安装新系统期间,或者在运行中的系统上创建新分区期间)。
13.4 使用服务器端命令检查分区解锁状态 #
当 cryptctl
客户端处于活动状态时,它会每 10 秒向 cryptctl
服务器发送一次“检测信号”。如果在设置客户端期间配置的超时时长内服务器未收到来自客户端的检测信号,服务器将认为客户端已脱机。然后,服务器将允许另一个客户端与其连接(或允许同一客户端在重引导后重新连接)。
要查看所有密钥的使用状态,请使用:
#
cryptctl list-keys
Num. Users
下的信息将显示该密钥当前是否已被使用。要查看单个密钥的更多细节,请使用:
#
cryptctl show-key UUID
此命令将显示有关挂载点、挂载选项、用法选项、上次检索密钥的时间,以及来自客户端的最后三个检测信号的信息。
此外,您可以使用 journalctl
来查找检索密钥时的日志。
13.5 手动解锁加密分区 #
可通过两种方法手动解锁分区,这两种方法都在客户端上运行:
联机解锁: 联机解锁允许规避超时或用户限制。当客户端与服务器之间已建立网络连接,但客户端(目前)无法自动解锁分区时,可以使用此方法。此方法将解锁计算机上的所有加密分区。
要使用此方法,请运行
cryptctl online-unlock
。准备好输入在设置服务器时指定的口令。脱机解锁: 当客户端无法或者不得联机与其服务器通讯时,可以使用此方法。服务器中的加密密钥必须仍然可用。此方法在万不得已的情况下使用,每次只能解锁一个分区。
要使用此方法,请运行
cryptctl offline-unlock
。必要分区 (/var/lib/cryptctl/keydb/PARTITION_UUID
) 的服务器密钥文件需要在客户端上可用。
13.6 维护停机过程 #
为确保在维护停机期间不能解密分区,请关闭客户端并禁用 cryptctl
服务器。您可以通过以下方式来实现此目的:
停止服务
cryptctl-server
:#
systemctl stop cryptctl-server
断开
cryptctl
服务器的网络连接。
13.7 为 cryptctl-server 服务设置 HA 环境 #
为了避免因需要停止 cryptctl-server 进行维护或此服务遭受损坏而导致停机,强烈建议在 HA 环境中设置 cryptctl-server。为此,至少需要准备一个双节点 High Availability 群集。以下设置说明如何使用自我签名证书为 cryptctl-server 创建双节点 HA 群集。
确保满足以下先决条件:
至少有两个安装了 SUSE Linux Enterprise Server 和 High Availability 扩展的服务器。此外,所有服务器上必须已安装 cryptctl 软件包。所有服务器可以通过 SSH 相互访问。
如果您要设置新群集,需要为群集的 HA Web 控制台提供额外的 IP 地址 (AdminIP)。
为 cryptctl-server 预留了一个单独的 IP 地址 (CrypServerIP)。
为 cryptctl-server 预留了一个单独的 DNS 名称 (CrypServerHostName),该名称可解析为上述 IP 地址。
可提供一个已启用 HA 的块设备或 NFS 共享来存储密钥。
在本示例中,我们使用了 NFS 共享:
nfs-server.example.org/data/cryptctl-keys
。该共享已挂载到标准位置/var/lib/cryptctl/keydb
。强烈建议使用 SBD 设备。
以
root
身份登录到 Node1。按照第 13.1 节 “设置
cryptctl
服务器”中所述设置 cryptctl-server。请使用以下参数:要创建证书,请使用 cryptctl 服务器的专用主机名 CrypServerHostName。不要使用主机的主机名。
使用 cryptctl 服务器的专用 IP 地址 CrypServerIP。不要使用默认的 IP 地址设置。
不要配置 KMIP 服务器。
当系统询问是否要启动
cryptctl
服务器时,请输入n
。
设置双节点 HA 群集。
- 重要
Node1 必须是配置了 cryptctl 服务器的服务器。
在配置了 cryptctl 服务器的计算机上,如下所示设置第一个节点:
#
crm cluster init -i NetDev -A AdminIP -n ClusterName
通过 SSH 登录到 Node2,并从中加入群集:
#
ssh Node2
#
crm cluster join -y Node1
有关详细信息,另请参见 《安装和设置快速入门》。
为 cryptctl 服务器设置资源组:
可以使用 cryptcl crm-shell-script 通过一个步骤设置全部所需的资源代理,并将所有文件复制到所有节点。强烈建议您在第一个步骤中校验设置:
#
crm script verify cryptctl \ cert-path=/etc/cryptctl/servertls/CertificateFileName \ cert-key-path=/etc/cryptctl/servertls/CertificateKeyFileName \ virtual-ip:ip=CrypServerIP \ filesystem:device=DevicePath filesystem:fstype=FileSystemType
如果检查成功,请如下所示运行脚本来设置群集组:
#
crm script verify cryptctl \ cert-path=/etc/cryptctl/servertls/CertificateFileName \ cert-key-path=/etc/cryptctl/servertls/CertificateKeyFileName \ virtual-ip:ip=CrypServerIP \ filesystem:device=DevicePath filesystem:fstype=FileSystemType
名称 |
强制 |
默认值 |
说明 |
---|---|---|---|
id | 否 | cryptctl | 资源组的名称。 |
cert-path | 是 | 创建的证书的完整路径。 | |
cert-key-path | 是 | 创建的证书密钥的完整路径。 | |
virtual-ip:id | 否 | cryptctl-vip | cryptctl 服务器的虚拟 IP 资源的 ID。 |
virtual-ip:ip | 是 | cryptctl 服务器的 IP 地址。 | |
virtual-ip:nic | 否 | virtual-ip 资源代理检测到的值。 | cryptctl 服务器应侦听的网络设备。仅当无法从 IP 地址检测到设备时才需要提供。 |
virtual-ip:cidr_netmask | 否 | virtual-ip 资源代理检测到的值。 | cryptctl 服务器 IP 地址的数字网络掩码。仅当无法从 IP 地址检测到网络掩码时才需要提供。 |
virtual-ip:broadcast | 否 | virtual-ip 资源代理检测到的值。 | cryptctl 服务器 IP 地址的广播地址。仅当无法从 IP 地址检测到此地址时才需要提供。 |
filesystem:id | 否 | cryptctl-filesystem | 包含磁盘加密密钥和记录的文件系统资源的 ID。 |
filesystem:device | 是 |
包含文件系统的设备。这可以是块设备(例如 /dev/sda... )或 NFS 共享路径 server:/path 。
| |
filesystem:directory | 否 | /var/lib/cryptctl/keydb |
包含文件系统的设备所在的目录。这可以是块设备(例如 /dev/sda... )或 NFS 共享路径 server:/path 。
|
filesystem:fstype | 是 | 文件系统类型(例如 NFS、XFS、EXT4)。 | |
filesystem:options | 否 | 所选文件系统的默认选项。 | 文件系统的挂载选项。 |
13.8 更多信息 #
有关详细信息,另请参见项目主页 https://github.com/SUSE/cryptctl/。