在之前的文章中,我们了解了如何使用LUKS给自己的Linux系统全盘加密。但是启用了 LUKS 后,我们在每次启动时,都需要手动输入密码,对于服务器 / 电脑不在身边或者没有 VNC/IPMI 的情况,就很难实现远程解锁了。在这里我们介绍两种优雅的方法,让你无需物理接触到电脑即可解锁LUKS。
准备
# 添加rd.neednet=1引导参数,在initramfs中加载网络,静态ip需额外配置,见下文
sed -i 's/^GRUB_CMDLINE_LINUX="/&rd.neednet=1 /' /etc/default/grub
⚠️注意,如果你的网络没有DHCP,则需要在rd.neednet=1
后另外加上ip=地址::网关:子网掩码:::none
这个参数指定静态ip(请自行替换网关等参数)。这时你/etc/default/grub
中的启动参数应该是这样的:
GRUB_CMDLINE_LINUX="rd.neednet=1 ip=IPADDR::GATEWAY:NETMASK:::none ........"
⚠️注意,如果你有多个物理网卡,则还需要手动指明网卡名:ip=地址::网关:子网掩码::网卡名:none
最后,执行命令更新grub配置:
# 更新grub2配置文件(CentOS)
grub2-mkconfig -o /boot/grub2/grub.cfg
# 更新grub2配置文件(Debian/Ubuntu)
update-grub
使用clevis / tang server网络远程自动解锁
只需在另一台服务器上安装tang server,客户端使用clevis稍作配置即可。这种方法要求你的两台电脑都需要有网络连接,并且需要保证tang server在一个安全的网络环境,或者做好了相关的网络安全配置。以下我们使用CentOS系统配置,如果是其他系统,则需要替换软件包管理器命令(如apt
dnf
等)。
安装步骤
- 首先安装tang server并配置
yum -y install tang
# 手动编辑systemd,更改端口,本处以7500端口为例
systemctl edit --full tangd.socket
systemctl enable tangd.socket --now
# 验证服务成功启动
systemctl status tangd.socket
curl localhost:7500/adv
- 配置clevis客户端
yum install -y clevis-dracut
# 得到启用LUKS的设备名,本处为/dev/sda2
blkid -t TYPE=crypto_LUKS -o device
# 将LUKS分区绑定到tang server上
clevis luks bind -f -d /dev/sda2 tang '{"url":"http://server:7500"}'
# 更新initramfs镜像
dracut -f -v
重启后即可看到自动解锁的效果。
使用SSH远程输入密码解锁
启动时,因为分区尚未被解锁,所以系统内的OpenSSH服务器肯定也还没有运行,此时我们就需要在引导中添加一个临时SSH服务器来输入密码并解锁LUKS分区。此处根据系统的不同,我们安装的软件包也有所不同。
Debian/Ubuntu
apt install dropbear-initramfs
编辑配置
vi /etc/dropbear-initramfs/config
更新的配置如下:
DROPBEAR_OPTIONS="-I 180 -j -k -p 2222 -s -c /bin/cryptroot-unlock"
选项如下:
- -I 180 : 如果在 180 秒内没有传输或接收流量,则断开会话。
- -j : 禁用SSH本地端口转发。
- -k : 同时禁用远程端口转发。
- -p 2222 : 在指定的地址和TCP端口上监听Dropbear SSH服务器。如果只给出了一个端口,例如 2222,则监听所有地址。最多可以指定 10 个(如果未指定,则默认为端口22)。
- -s : 禁用密码登录。
- -c /bin/cryptroot-unlock 强制登录后运行解锁命令
接下来,我们需要将自己的公钥(假设在~/.ssh/authorized_keys
)复制到/etc/dropbear-initramfs/authorized_keys
,当然也可以自行编辑该文件。格式应该为OpenSSH Publickey。
最后再执行命令,更新initramfs镜像即可。
update-initramfs -u -v
CentOS / Rocky Linux / Alma Linux / Fedora / RHEL
提供两种安装方式:
- 包安装
https://download.copr.fedorainfracloud.org/results/gsauthof/dracut-sshd/
首先,我们需要在这个页面找到对应系统的rpm包地址,将其复制后下载。此处以Rocky Linux 8为例。
yum install -y https://download.copr.fedorainfracloud.org/results/gsauthof/dracut-sshd/epel-8-x86_64/01898435-dracut-sshd/dracut-sshd-0.6.2-2.el8.noarch.rpm
- 直接安装
curl -sSL -o dracut-sshd.zip https://github.com/gsauthof/dracut-sshd/archive/refs/heads/master.zip
unzip dracut-sshd.zip
cp -iR dracut-sshd-master/46sshd /usr/lib/dracut/modules.d
yum install -y dracut-network
安装好后,我们需要保证在以下任意目录之一中存在公钥文件:
- /root/.ssh/dracut_authorized_keys
- /etc/dracut-sshd/authorized_keys
- /root/.ssh/authorized_keys
最后运行dracut -f -v
命令重建initramfs镜像文件即可。