服务器安全指南 - 自动/远程解锁你的磁盘

2023-11-16 20:18:01 浏览数 (1)

在之前的文章中,我们了解了如何使用LUKS给自己的Linux系统全盘加密。但是启用了 LUKS 后,我们在每次启动时,都需要手动输入密码,对于服务器 / 电脑不在身边或者没有 VNC/IPMI 的情况,就很难实现远程解锁了。在这里我们介绍两种优雅的方法,让你无需物理接触到电脑即可解锁LUKS。

准备

代码语言:javascript复制
# 添加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中的启动参数应该是这样的:

代码语言:javascript复制
GRUB_CMDLINE_LINUX="rd.neednet=1 ip=IPADDR::GATEWAY:NETMASK:::none   ........"

⚠️注意,如果你有多个物理网卡,则还需要手动指明网卡名:ip=地址::网关:子网掩码::网卡名:none

最后,执行命令更新grub配置:

代码语言:javascript复制
# 更新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等)。

安装步骤

  1. 首先安装tang server并配置
代码语言:javascript复制
yum -y install tang

# 手动编辑systemd,更改端口,本处以7500端口为例
systemctl edit --full tangd.socket

systemctl enable tangd.socket --now

# 验证服务成功启动
systemctl status tangd.socket
curl localhost:7500/adv
  1. 配置clevis客户端
代码语言:javascript复制
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

代码语言:javascript复制
apt install dropbear-initramfs

编辑配置

代码语言:javascript复制
vi /etc/dropbear-initramfs/config

更新的配置如下:

代码语言:javascript复制
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镜像即可。

代码语言:javascript复制
update-initramfs -u -v

CentOS / Rocky Linux / Alma Linux / Fedora / RHEL

提供两种安装方式:

  • 包安装

https://download.copr.fedorainfracloud.org/results/gsauthof/dracut-sshd/ 首先,我们需要在这个页面找到对应系统的rpm包地址,将其复制后下载。此处以Rocky Linux 8为例。

代码语言:javascript复制
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
  • 直接安装
代码语言:javascript复制
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镜像文件即可。

.asciicast { text-indent: 0; }

0 人点赞