磁盘加密保护静态数据。在 VPS 上,宿主机控制着虚拟机监控程序,因此无法阻止一个执意如此的服务商读取内存。它擅长的是防范丢失的备份、回收的磁盘以及被盗或被扣押的存储。在投入时间之前,先弄清你要防范的是其中哪一种。
确定你要防范什么
- 报废或被复制的磁盘:加密帮助很大。
- 泄露的快照:如果密钥没有与快照存放在一起,加密就有帮助。
- 正在运行系统上的活跃攻击者:加密没有帮助,因为卷已处于解锁状态。
- 恶意的虚拟机监控程序:在 VPS 上加密没有帮助。完全掌控硬件的独立服务器是更强的选择。
方案 1:加密的数据卷
这是最安全的起点。挂载第二块磁盘或创建回环文件,并把敏感数据放在那里。示例使用名为 /dev/vdb 的空设备。请务必再次核对设备名称,因为格式化会销毁其中的内容。
sudo apt install -y cryptsetup
sudo cryptsetup luksFormat /dev/vdb
sudo cryptsetup open /dev/vdb secure
sudo mkfs.ext4 /dev/mapper/secure
sudo mkdir -p /srv/secure
sudo mount /dev/mapper/secure /srv/secure
再次关闭它:sudo umount /srv/secure && sudo cryptsetup close secure。
方案 2:基于文件的容器
如果没有多余的磁盘,就用一个文件作为容器。
sudo fallocate -l 20G /root/vault.img
sudo cryptsetup luksFormat /root/vault.img
sudo cryptsetup open /root/vault.img vault
sudo mkfs.ext4 /dev/mapper/vault
sudo mount /dev/mapper/vault /srv/vault
方案 3:带远程解锁的根磁盘
加密根磁盘需要一种在启动时、网络尚未启用之前输入口令的方式。常见的做法是在 initramfs 中放一个小型 SSH 服务器(dropbear)。这取决于你的服务商是否允许你安装自定义镜像或用自己的分区方案重装,所以请先确认。许多 VPS 面板不允许这样做,而且一旦出错可能导致服务器无法启动,因此请准备好救援方案。
概括来说:安装带加密根分区的系统,添加 dropbear-initramfs,将你的 SSH 公钥放入 /etc/dropbear/initramfs/authorized_keys,重新生成 initramfs,然后重启并通过 SSH 使用 cryptroot-unlock 解锁。
妥善处理密钥
- 使用长口令并保存在密码管理器中,而不是放在服务器上。
- 备份 LUKS 头:
sudo cryptsetup luksHeaderBackup /dev/vdb --header-backup-file header.img。离线保存。 - 不要用存放在同一块磁盘上的密钥文件自动解锁。那就失去意义了。
- 请记住,在启动时解锁意味着每次重启都需要你在场。