使用 SSH 解锁 LUKS 分区

使用 SSH 解锁 LUKS 分区

我正在尝试设置一个带有加密驱动器的专用服务器,我在网上找到了一些帮助来启动和运行它,但是在dropbear-initramfs正确启动时遇到了一些麻烦。(类似这样的教程https://hamy.io/post/0005/remote-unlocking-of-luks-encrypted-root-in-ubuntu-debian/

因此,我安装了 dropbear-initramfs 软件包,并收到缺少密钥的错误,无法正常工作。我添加了 authorized_keys,配置 dropbear 以在不同的端口上运行,并更新了 initramfs,但在启动时 dropbear 无法启动,我只是被提示输入正常的用户名/密码。我尝试了几种方法来启动并运行它,我尝试在密钥设置正确后使用 dpkg 重新配置软件包,我不再收到错误消息,但 dropbear 仍然无法启动。

如果有人能提供任何指点,我将非常感激:)

此致

附言:我查看了已经打开的问题,但其中大多数已经很旧了,并且自 ubuntu 16.04(带有 dropbear-initramfs 包)以来,dropbear + initramfs 应该更容易。

答案1

几乎做了该做的事。

###简短版本:

###TL;DR 由于安全问题,包含您客户端公钥的authorized_keys已被删除...

  1. Dropbear 和 openssh 都是 SSH 服务器,但它们的密钥格式并不相同,尽管它们具有相同的私钥-公钥原理:
  • dropbear 的 DER 格式
  • openssh 的私钥的 PEM 格式
  • authorized_keys服务器端的文件,
  • known_hosts客户端上的文件。

这就是为什么要连接到 dropbear 服务器,两者sshdbclient可以使用,但是/usr/lib/dropbear/dropbearconvert 必须使用转换公钥确保ssh与 dropbear 兼容,或者使其dbclient与兼容sshd

  1. Dropbear 比它小得多sshd,尽管它更基础,但在 Linux 启动过程的早期阶段,特别是当您使用 PXE 和/或 iPXE 等引导加载程序时,最好有一个仅使用 SSH 公钥的服务器。
    为此,必须将 dropbear 集成到 init 文件系统(映像initrd)。必须安装
    Ubuntu 软件包dropbear-initramfs(我在 Ubuntu 18.04 上使用版本 2017.75-3build1)。
    所有 dropbear 的设置都在/etc/dropbear-initramfs/文件夹中,包括配置文件(config),服务器私钥、rsa、dss、ecdsa(dropbear_*_host_key)和要接受的客户端公钥(authorized_keys)必须以正确的 dropbear 格式放在这里。
    然后,要更新目录initrd中的当前映像文件/boot/,您必须启动:

     sudo update-initramfs -u
    

此软件包附带了用于构建initrd图像的脚本/usr/share/initramfs-tools/hooks/dropbear,以及用于在启动过程早期阶段运行的脚本/usr/share/initramfs-tools/scripts/init-premount/dropbear,只有最后的脚本才会嵌入到initrd图像中。

  1. 某些发行版会authorized_keys在某些条件下删除以防止ssh早期连接。为了避免这种情况,您必须检查这一点并采取以下解决方法:

     $ cd /usr/share/initramfs-tools/scripts/
     $ grep -R authorized_keys *
     init-bottom/dropbear:# delete authorized_keys(5) file to forbid new SSH sessions
     init-bottom/dropbear:#rm -f ~root/.ssh/authorized_keys
     init-bottom/dropbear:    # just kill this script), so deleting root's authorized_keys(5) file
    

在解决方法中,我们减轻了删除的压力,authorized_keys以便在阶段出现问题时能够连接到机器initramfs

答案2

适用于 Debian,也适用于 Ubuntu:https://github.com/ceremcem/unlock-luks-partition

使用 SSH 解锁 LUKS 分区

以下说明如何使用您的客户端通过 SSH 连接并解锁加密分区来启动您的服务器:

警告:通过网络输入加密密钥可能是安全的(由于 SSH 连接的安全性)只要您完全确定 initramfs 尚未被征服,因此在您输入磁盘密码时不会发生 MITM 攻击。

1. 安装必需软件包(在服务器上)

apt-get install dropbear initramfs-tools busybox

检查 Dropbear 是否已自行禁用/etc/default/dropbear

NO_START=1

2. 将所需的公钥附加到服务器的authorized_keys文件中

只需将您的公钥复制并粘贴到/etc/dropbear-initramfs/authorized_keys服务器上

3.创建解锁脚本

创建以下脚本作为/etc/initramfs-tools/hooks/crypt_unlock.sh

#!/bin/sh

PREREQ="dropbear"

prereqs() {
  echo "$PREREQ"
}

case "$1" in
  prereqs)
    prereqs
    exit 0
  ;;
esac

. "${CONFDIR}/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions

if [ "${DROPBEAR}" != "n" ] && [ -r "/etc/crypttab" ] ; then
cat > "${DESTDIR}/bin/unlock" << EOF
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot; then
kill \`ps | grep cryptroot | grep -v "grep" | awk '{print \$1}'\`
# following lines will be executed after the passphrase has been correctly entered
# kill the remote shell
kill -9 \`ps | grep "\-sh" | grep -v "grep" | awk '{print \$1}'\`
exit 0
fi
exit 1
EOF

  chmod 755 "${DESTDIR}/bin/unlock"

  mkdir -p "${DESTDIR}/lib/unlock"
cat > "${DESTDIR}/lib/unlock/plymouth" << EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
/bin/plymouth "\$@"
EOF

  chmod 755 "${DESTDIR}/lib/unlock/plymouth"

  echo To unlock root-partition run "unlock" >> ${DESTDIR}/etc/motd

fi

使其可执行:

chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh

创建清理脚本如下/etc/initramfs-tools/scripts/init-bottom/cleanup.sh

#!/bin/sh
echo "Killing dropbear"
killall dropbear
exit 0

...并使其可执行:

chmod +x /etc/initramfs-tools/scripts/init-bottom/cleanup.sh

4. 创建静态 IP(或跳过此步骤以使用 DHCP)

编辑/etc/initramfs-tools/initramfs.conf以添加(或更改)以下行:

IP=192.168.1.254::192.168.1.1:255.255.255.0::eth0:off
format: 

    IP=${ip}::${gateway_ip}:${netmask}:[${hostname}]:${eth_device}:${autoconf}

([hostname] can be omitted)

在较新的内核中eth0被重命名为enp0s3(或类似名称)。使用以下方法检查ls /sys/class/net

5. 更新 initramfs

警告: 如果你直接地编辑/boot/grub/grub.cfg,因为它将是覆盖以下命令。您可能会得到一个损坏的启动顺序。请参阅重要提示

update-initramfs -u

6. 测试

  1. 重新启动服务器
  2. 通过连接到您的服务器ssh [email protected] [-i ~/.ssh/id_rsa]

高级配置

创建反向隧道

您可能希望您的服务器通过 SSH 连接您的链接服务器,创建到其 SSH 服务器的反向隧道,这样您就可以通过链接服务器连接您的服务器,从而无需上述过程通过防火墙转发。

(参见 reverse-tunnel-setup.md)

在其他端口上运行 Dropbear

(基于https://askubuntu.com/a/840067/371730

  1. 定义额外端口:

    --- /usr/share/initramfs-tools/scripts/init-premount/dropbear   2018-09-22 01:55:50.963967412 +0300
    +++ /usr/share/initramfs-tools/scripts/init-premount/dropbear   2018-09-22 01:56:04.091945164 +0300
    @@ -26,7 +26,7 @@
    -    exec /sbin/dropbear $DROPBEAR_OPTIONS -Fs
    +    exec /sbin/dropbear $DROPBEAR_OPTIONS -Fs -p 22 -p 80
    
  2. 更新 initramfs:

    update-initramfs -u
    

相关内容