debian12系统 配置使用SSH远程解锁LUKS加密的根分区

环境:在安装debian系统的时候在磁盘分区步骤 配置了LUKS加密根分区和其余需要加密的分区

1、更新系统

apt update -y
apt upgrade -y
apt full-upgrade -y

重启系统
reboot

2、安装 Dropbear

apt install -y dropbear-initramfs

3、配置在initramfs阶段的网络,添加静态ip

编辑 /etc/initramfs-tools/initramfs.conf 文件

vim /etc/initramfs-tools/initramfs.conf

添加ip
IP=192.168.2.19::192.168.2.254:255.255.255.0:debian

IP=– 启动静态 IP 配置
::– 现场分离器
192.168.2.19– IPv4 协议
192.168.2.254–网关
255.255.255.0– 网络掩码
debian– 主机名

4、配置 Dropbear 以解锁 LUKS 加密系统

  1. 新目录:/etc/dropbear/initramfs/
  2. 新配置文件:/etc/dropbear/initramfs/dropbear.conf
  3. 包含用于公钥身份验证的公钥的新文件:/etc/dropbear/initramfs/authorized_keys

先编辑配置文件

vim /etc/dropbear/initramfs/dropbear.conf

DROPBEAR_OPTIONS="-I 180 -j -k -p 2222 -s -c cryptroot-unlock"

-I 180:如果在 180 秒内没有传输或接收流量,则断开会话。
-j:关闭 ssh 本地端口转发。
-k:同时禁用远程端口转发。
-p 2222:在指定地址和 TCP 端口上侦听 Dropbear ssh 服务器。在此示例中,使用 TCP/2222。如果未给出选项,它将监听所有地址。最多可以指定 10 个。如果未指定,则默认值为 TCP/22。-p
-s:禁用密码登录。我们将在 Linux / Unix 系统上设置 SSH 密钥进行身份验证,以减少攻击面。
-c cryptroot-unlock:忽略用户提供的命令,始终运行 forced_command。这也会覆盖任何 authorized_keys command= 选项。换句话说,键入 ssh 命令后,立即解锁磁盘,不执行任何其他操作。如果您想手动键入 cryptroot-unlock,您可以跳过此选项。

5、创建用于登录的 SSH 密钥

使用PUTTYgen创建一对公钥和密钥,然后将公钥内容复制到 /etc/dropbear/initramfs/authorized_keys 文件里面保存, 私钥保存为本地文件。

6、更新或生成 initramfs 镜像

update-initramfs -u
update-initramfs -u -v

7、重启,使用PUTTY连接

打开putty,先加载私钥文件,然后再服务器地址栏输入 用户名@地址 和 端口号 进行连接

此时应该就能正常连接到了。然后输入解锁密码进行解锁就行

注意:目前此方法只能解锁根分区,根分区解锁后会断开连接,有可能是已经到了系统启动部分,会断网,ssh也会无法连接,就会导致剩余需要解锁的分区还是无法解锁,系统无法启动。

8、为了确保在解锁根分区后网络连接不丢失,以下步骤可以帮助你。

编辑/etc/initramfs-tools/scripts/init-bottom/目录中的脚本,以确保在根分区解锁后重新配置网络接口。

nano /etc/initramfs-tools/scripts/init-bottom/net-restart

添加以下内容:

#!/bin/sh
# Reconfigure network after switching root

# Bring down the interface to reset it
ip link set eth0 down

# Reconfigure network interface
ip addr flush dev eth0
ip addr add 192.168.1.100/24 dev eth0
ip link set eth0 up

# Re-add the default gateway
ip route add default via 192.168.1.1

# Reconfigure DNS
echo "nameserver 8.8.8.8" > /etc/resolv.conf

保存并关闭文件后,使脚本可执行:

chmod +x /etc/initramfs-tools/scripts/init-bottom/net-restart

每次修改initramfs相关脚本后,都需要更新initramfs镜像:

update-initramfs -u
这样配置之后网络是能通了,但是ssh还是无法连接,目前还没找到解决办法。

9、可以配置其余分区在根分区解锁后自动解锁,这样就只需要解锁根分区的时候输入密码,根分区解锁成功后其余配置过的分区可以自动解锁

步骤

1、确认分区和设备名称: 使用 lsblkblkid 命令查看分区和设备的名称,确保您知道根分区和其他加密分区的设备路径。

2、确保根分区的解锁顺序: 确保您的根分区在 /etc/crypttab 中的定义是正确的,并在引导过程中能够首先被解锁。例如:

cryptroot    UUID=<根分区的UUID>    none    luks

3、修改 /etc/crypttab: 在 /etc/crypttab 中,确保其他加密分区的定义位于根分区之后。示例:

cryptroot    UUID=<根分区的UUID>    none    luks
cryptdata    UUID=<其他分区的UUID>    none    luks

请使用 blkid 命令获取 UUID。

4、使用密钥文件自动解锁: 为了实现自动解锁,您需要使用一个密钥文件。进行以下步骤:

创建密钥文件

dd if=/dev/urandom of=/root/luks-keyfile bs=1024 count=4

# /root/luks-keyfile 代表密钥文件的路径和文件名称

将密钥文件添加到 LUKS: 首先,您需要将密钥文件添加到 LUKS 加密分区:

cryptsetup luksAddKey /dev/sda2 /root/luks-keyfile

# /dev/sda2 代表需要设置的LUKS加密的分区 

系统会要求您输入分区的原始 LUKS 密码。

确保密钥文件的权限

chmod 600 /root/luks-keyfile

5、更新 /etc/crypttab: 修改 /etc/crypttab 以指向密钥文件:

cryptroot    UUID=<根分区的UUID>    none    luks
cryptdata    UUID=<其他分区的UUID>    /root/luks-keyfile    luks

6、更新 initramfs

update-initramfs -u

7、重启,之后应该只需要输入根分区解锁密码,然后配置过自动解锁的其他分区都会自动解锁。

注意事项

  • 使用密钥文件自动解锁具有一定安全风险,确保密钥文件的安全性,限制访问。
  • 在设置这些更改之前,确保备份重要数据。
  • 如果系统仍然要求输入密码,检查 /etc/crypttab 和 /etc/fstab 的配置是否正确,确保没有拼写错误或不一致之处。

取消自动解锁

取消自动解锁,编辑 /etc/crypttab 文件 将指向密钥文件替换为none ,然后更新 update-initramfs -u 重启就行。密钥文件不要删除,并且最好在异地备份一下密钥文件,以免数据发生意外。

sanradar
sanradar
文章: 103