15 使用 cryptctl 对托管应用程序的储存区加密 #
数据库和类似的应用程序常常托管在由第三方工作人员管理的外部服务器上。某些数据中心维护任务需要第三方工作人员直接访问受影响的系统。在此类情况下,为了满足隐私要求,就必须进行磁盘加密。
cryptctl 可让您使用 LUKS 加密敏感目录,并提供以下附加功能:
   
- 加密密钥位于中心服务器上,而中心服务器可位于客户本地。 
- 系统会在计划外重引导后自动重新装入加密分区。 
cryptctl 包括以下组件:
  
- 客户端是一台包含一个或多个加密分区的计算机,但不永久储存解密这些分区所必需的密钥。例如,客户端可以是云或托管计算机。 
- 由服务器来保存加密密钥,客户端可以请求这些密钥来解锁加密分区。 - 您也可以设置 - cryptctl服务器,以便在与 KMIP(密钥管理互操作性协议)1.3 兼容的服务器上储存加密密钥。在这种情况下,- cryptctl服务器将不储存客户端的加密密钥,而是依赖与 KMIP 兼容的服务器提供这些密钥。
cryptctl 服务器维护
    由于 cryptctl 服务器负责管理加密磁盘超时,而且还可以保存加密密钥(具体取决于配置),因此它应该由您自己直接控制,并仅由可信的人员管理。
   
此外,应定期对其进行备份。丢失服务器的数据意味着会失去客户端上加密分区的访问权限。
   为了处理加密,cryptctl 将 LUKS 与 aes-xts-256 加密法和 512 位密钥结合使用。可使用 TLS 通过证书校验来传输加密密钥。
  
cryptctl 检索密钥(不连接 KMIP 服务器的模式) #cryptctl在继续之前,请确保软件包 cryptctl 已安装在您要设置为服务器或客户端的所有计算机上。
15.1 设置 cryptctl 服务器 #
    在您可以将一台计算机定义为 cryptctl 客户端之前,需将一台计算机设置为 cryptctl 服务器。
   
在开始之前,请选择是否要使用自我签名证书来保护服务器与客户端之间的通讯。如果不使用,请为服务器生成 TLS 证书,并通过证书颁发机构为该证书签名。
此外,可以让客户端使用由证书颁发机构签名的证书向服务器进行身份验证。要采取这项额外的安全措施,请务必在开始执行此过程之前准备好 CA 证书。
- 以 - root身份运行:- root #- cryptctl init-server
- 回答随后出现的每个提示问题,并在每回答一个问题后按 Enter。如果有默认的答案,提示末尾的方括号中会显示此答案。 - 选择使用至少包含 10 个字符的口令并确认该口令。此口令将充当主口令,可以解锁服务器上注册的所有分区。 
- 指定 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的状态,请使用:- root #- systemctl status cryptctl-server
如果以后要重新配置服务器,请执行以下操作之一:
- 再次运行 - cryptctl init-server命令。- cryptctl随后会建议将现有设置用作默认设置,因此您只需指定要更改的值。
- 直接在配置文件 - /etc/sysconfig/cryptctl-server中进行更改。- 不过,为了避免出现问题,请不要手动更改 - AUTH_PASSWORD_HASH和- AUTH_PASSWORD_SALT设置。您需要正确计算这些选项的值。
15.2 设置 cryptctl 客户端 #
    目前仅支持下述 cryptctl 交互式设置方法。
   
确保满足以下先决条件:
- 可通过网络使用 - cryptctl服务器。
- 存在一个要加密的目录。 
- 客户端计算机包含一个可用的空分区,该分区足以容纳要加密的目录。 
- 使用自我签名证书时,在服务器上生成的证书( - *.crt文件)可在客户端本地使用。否则,服务器证书的证书颁发机构必须受客户端的信任。
- 如果您将服务器设置为要求客户端使用客户端证书进行身份验证,请为客户端准备一个由您为服务器选择的 CA 证书签名的 TLS 证书。 
- 以 - root身份运行:- root #- cryptctl encrypt
- 回答随后出现的每个提示问题,并在每回答一个问题后按 Enter。如果有默认的答案,提示末尾的方括号中会显示此答案。 - 指定要在 - cryptctl服务器上连接到的主机名和端口。
- 如果您已将服务器配置为要求客户端使用 TLS 证书进行身份验证,请指定客户端的证书和密钥文件。客户端证书必须由设置服务器时选择的证书颁发机构签名。 
- 指定服务器证书( - *.crt文件)的绝对路径。
- 输入设置服务器时指定的加密口令。 
- 指定要加密的目录的路径。指定用于包含目录加密内容的空分区的路径。 
- 指定允许同时解密该分区的计算机数目。 - 然后指定在从一个或多个客户端收到最后一个活跃信号之后到允许其他计算机解密分区之前必须经过的超时(以秒为单位)。 - 当计算机意外停止工作然后再重引导时,它需要能够再次解锁其分区。这意味着,此超时应设置为比客户端重引导时长略短的时间。 重要:超时时长- 如果设置的时间太长,计算机首次尝试解密加密分区时将会失败。虽然 - cryptctl之后会继续定期检查加密密钥是否可用,但这会造成一定的延迟。- 如果超时设置得太短,包含加密分区副本的计算机首先解锁该分区的可能性将会提高。 
 
- 要开始加密,请输入 - yes。- cryptctl现在会将指定目录加密到先前为空的分区中,然后装入这个新加密的分区。文件系统类型将与原始的未加密文件系统的类型相同。- 在创建加密分区之前, - cryptctl会将原始目录的未加密内容移至带有- cryptctl-moved-前缀的位置。
- 要检查是否确实正确装入了该目录,请使用: - tux >- lsblk -o NAME,MOUNTPOINT,UUIDNAME MOUNTPOINT UUID [...] sdc └─sdc1 PARTITION_UUID └─cryptctl-unlocked-sdc1 /secret-partition UNLOCKED_UUID- cryptctl通过加密分区的 UUID 来识别该分区。在上一示例中,其为- sdc1旁边显示的 UUID。- 在服务器上,您可以使用 - cryptctl来检查目录是否已解密。- root #- 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 中。
   
15.3 使用服务器端命令检查分区解锁状态 #
    当 cryptctl 客户端处于活动状态时,它每 10 秒会向 cryptctl 服务器发送一次“检测信号”。如果在设置客户端期间配置的超时时长内服务器未收到来自客户端的检测信号,服务器将认为客户端已脱机。然后,服务器将允许另一个客户端与其连接(或允许同一客户端在重引导后重新连接)。
   
要查看所有密钥的使用状态,请使用:
root #cryptctl list-keys
Num.Users 下的信息显示该密钥当前是否已使用。要查看单个密钥的更多细节,请使用:
   
root #cryptctl show-key UUID
此命令将显示有关安装点、装入选项、用法选项、上次检索密钥的时间,以及来自客户端的最后三个检测信号的信息。
    此外,您可以使用 journalctl 来查找检索密钥时的日志。
   
15.4 手动解锁加密分区 #
可通过两种方法手动解锁分区,这两种方法都在客户端上运行:
- 联机解锁: 联机解锁允许规避超时或用户限制。当客户端与服务器之间已建立网络连接,但客户端(目前)无法自动解锁分区时,可以使用此方法。此方法将解锁计算机上的所有加密分区。 - 要使用此方法,请运行 - cryptctl online-unlock。准备好输入在设置服务器时指定的口令。
- 脱机解锁: 当客户端无法或者不得联机与其服务器通讯时,可以使用此方法。服务器中的加密密钥必须仍然可用。此方法只能在万不得已的情况下才使用,每次只能解锁一个分区。 - 要使用此方法,请运行 - cryptctl offline-unlock。服务器的必备分区 (- /var/lib/cryptctl/keydb/PARTITION_UUID) 的密钥文件需在客户端上可用。
15.5 维护停机过程 #
    为确保在维护停机期间不能解密分区,请关闭客户端并禁用 cryptctl 服务器。您可以通过以下方式来实现此目的:
   
- 停止服务 - cryptctl-server:- root #- systemctl stop cryptctl-server
- 断开 - cryptctl服务器的网络连接。
15.6 更多信息 #
有关详细信息,另请参见项目主页 https://github.com/SUSE/cryptctl/。
