以安全的方式在系统启动时自动打开 LUKS 容器

信息安全 linux 磁盘加密 卢克斯 自动化
2021-08-19 14:19:53

我有一个在云提供商处运行的 linux 系统,我使用 LUKS 创建了一个加密容器来存储个人数据。

加密容器手动挂载在/srv; 系统的其余部分未加密,因此服务器,尤其是 ssh 守护程序在系统引导时自动启动。

目前,如果服务器重新启动(由于需要重新启动的更新或因为运行Droplet的主机系统需要重新启动)我需要手动打开LUKS容器并启动将数据存储在加密分区中的服务( dovecot、mysql 等)。当然,这是拥有加密分区的逻辑结果。但我想知道我是否可以以安全的方式自动执行此操作。

出于明显的原因,我不想将密码存储在服务器上。所以我写了一个在家里的 Raspberry Pi 上运行的小脚本:它每 5 分钟 ssh-es 到服务器并检查 Loopback Device 是否已挂载。/srv如果不是,它会挂载容器(脚本的相关行,仅在未挂载时才执行):

# Mount Srv Container
ssh root@<ip> "echo -n '*** my passphrase ***' | cryptsetup luksOpen /root/srv_container_file container -"
ssh root@<ip> "mount -t ext4 /dev/mapper/container /srv"

# Start Services that store data on /srv
# ...

该方法有效,但感觉超级hacky。不确定持续连接(即主动检查)是否是一个好主意,我也不确定是否通过将我的密码回显到cryptsetup.

因此我的问题是:

什么是自动打开 LUKS 容器而不将我的密码存储在服务器上并且不打开我的系统漏洞的好/标准方法(与手动打开容器相比)?非常欢迎参考官方文档。

我想保护自己免受什么伤害?

  • 我不知道云提供商如何处理旧的和/或有故障的磁盘。我不希望任何人从我的云提供商制作的物理磁盘或备份中读取我的数据。
  • 我不知道我的磁盘映像是否被移动到物理存储上(根据我的提供商的文档,它是冗余存储的),所以我不希望在我之后有权访问这些块的任何人都能够恢复数据.

  • 我知道一旦攻击者对我正在运行的系统进行 shell 访问,它就结束了,因为分区是打开的并且不需要密码。

1个回答

与其让本地计算机定期查询服务器并在必要时将密钥推送给它,不如反过来做,让服务器从本地计算机中提取密钥。服务器和客户端可以通过 SSH 相互验证对方的身份,这使得有权访问本地计算机存储或远程计算机存储的主动攻击者需要窃取密钥。如果攻击者是被动的,只能读取远程机器磁盘的内容,但不能对其采取行动(例如,通过 SSH 连接到真实服务器并对其进行后门),那么拉取密码应该是安全的。具体实现由您决定,但可能是:

  1. 服务器启动,连接到您的本地计算机,并请求密钥。

  2. 服务器和您的本地计算机通过 SSH 相互验证。

  3. 或者,两台机器可以验证另一台是否从正确的 IP 连接。

  4. 身份验证后,服务器从您的本地计算机中提取密钥。

由于您指定您的威胁模型涉及对远程服务器存储具有完全访问权限的攻击者,因此请注意,您只能防御被动对手,而不是能够同时读取存储MITM 连接或直接 SSH 的攻击者使用被盗的凭据。