对sda和sdb进行LUKS加密的解锁设置【更新:看2楼】

在 Linux 系统中,如果你的两块硬盘(例如 sda 作为根系统盘,sdb 作为数据盘)都进行了 LUKS 加密,使用 Dropbear SSH 进行远程解锁是非常经典的无头服务器(Headless Server)解决方案。

针对这种情况,通常有两种架构方案。我将为你详细梳理这两种方法的配置逻辑。


方案一:Dropbear 解锁根盘 + Keyfile 自动解锁数据盘(:star: 最推荐的行业标准)

这是最优雅且最常见的做法。你只需要通过 Dropbear SSH 输入一次密码来解锁包含操作系统的 sda。系统启动并挂载根目录后,会自动读取根目录内的密钥文件(Keyfile)来静默解锁 sdb

第一步:配置 Dropbear 以解锁 sda(根分区)

  1. 安装必要的包(以 Debian/Ubuntu 为例):
    sudo apt install dropbear-initramfs cryptsetup
    
  2. 将你本机的 SSH 公钥(id_rsa.pubid_ed25519.pub)添加到 initramfs 的 Dropbear 授权文件中:
    sudo nano /etc/dropbear/initramfs/authorized_keys
    
  3. 确保你的服务器在 initramfs 阶段能获取 IP 联网。编辑 /etc/initramfs-tools/initramfs.conf,在末尾添加网络配置(根据实际情况调整 DHCP 或静态 IP):
    IP=:::::eth0:dhcp
    
  4. 更新 initramfs 生效:
    sudo update-initramfs -u
    

第二步:使用 Keyfile 自动解锁 sdb

  1. 在已解锁的根分区创建一个安全的密钥文件:
    sudo mkdir -p /etc/luks-keys
    sudo dd if=/dev/urandom of=/etc/luks-keys/sdb_key bs=1024 count=4
    sudo chmod 0400 /etc/luks-keys/sdb_key
    
  2. 将这个密钥文件添加到 sdb 的 LUKS 密钥槽中(会要求你输入一次 sdb 当前的加密密码):
    sudo cryptsetup luksAddKey /dev/sdbX /etc/luks-keys/sdb_key
    
  3. 配置 /etc/crypttab 让系统启动时自动读取该文件:
    # <target name>  <source device>         <key file>               <options>
    sdb_crypt        UUID=你的sdb_UUID       /etc/luks-keys/sdb_key   luks
    
  4. /etc/fstab 中配置自动挂载 /dev/mapper/sdb_crypt

使用体验: 重启后,你只需 SSH 进入 Dropbear,运行 cryptroot-unlock 并输入 sda 的密码。系统启动后会自动解锁并挂载 sdb


方案二:在 Dropbear 中手动依次解锁 sdasdb

如果出于极高的安全合规要求,你绝对不能在根分区中明文存储 sdb 的 Keyfile,那么你可以强制 initramfs 阶段同时识别这两个盘,并通过 Dropbear 依次输入密码。

第一步:强制将 sdb 包含入 initramfs
默认情况下,initramfs 只关心启动系统所需的根分区。你需要通过修改 /etc/crypttab 强制它加载 sdb

  1. 编辑 /etc/crypttab,在 sdb 的选项中加入 initramfs 标志:
    # <target name>  <source device>         <key file>  <options>
    sda_crypt        UUID=你的sda_UUID       none        luks,initramfs
    sdb_crypt        UUID=你的sdb_UUID       none        luks,initramfs
    
    注意:使用 none 表示启动时需要手动输入密码。

第二步:更新 initramfs
重新生成引导镜像,将两个加密卷的配置打包进去:

sudo update-initramfs -u

第三步:远程解锁体验

  1. 服务器重启卡在引导阶段时,通过 SSH 连接到 Dropbear:

    ssh root@你的服务器IP -p 22
    # (或者根据 dropbear 默认配置,端口可能是 2222,且有时候需要特定的 SSH 密钥)
    
  2. 登录后,通常会进入一个 BusyBox shell。运行官方解锁脚本:

    cryptroot-unlock
    
  3. 此时,脚本会依次弹窗要求你输入:

    • Please unlock disk sda_crypt: (输入 sda 的密码)
    • Please unlock disk sdb_crypt: (输入 sdb 的密码)
  4. 两次输入正确后,Dropbear 会自动关闭连接,服务器继续正常的启动流程。


:light_bulb: 核心建议

对于 99% 的场景,强烈建议采用 方案一
方案二虽然全手动,但在实际运维中非常繁琐(每次重启都要输两次独立密码),且一旦输错一个,容易导致 initramfs 超时而彻底卡死,需要接物理显示器才能救砖。采用方案一,只要保护好根分区的安全,数据盘的安全性是同等级的。