SSH在无头服务器启动期间解密加密的LVM?


59

当我安装Ubuntu 10.04和现在的10.10时,系统为我提供了为硬盘驱动器启用“加密LVM”的选项。选择该选项后,在启动过程中会提示我输入密码以解密LVM。

现在,我正在考虑建立一个运行Linux的无头服务器(不一定是Ubuntu),但是我担心由于该服务器是无头的,因此我无法在启动过程中对其进行解密。在启动过程中,我可以通过SSH输入密码来输入加密的LVM吗?如果是这样,我该如何设置?还是有其他解决方案?同样,此问题并非特定于Ubuntu。谢谢。


4
另请参见:zless /usr/share/doc/cryptsetup/README.remote.gz
0xC0000022L 2014年

我认为@Nate的答案应该是被接受的答案:(基本上,因为需要进行编辑才能反映链接的博客中的更改,所以)使用整个公共密钥而不是私有密钥。
乔纳森·Y.2015年

Answers:


25

对于较新版本的ubuntu,例如14.04,我发现@dragly的组合,此博客文章的答案非常有帮助。释义:

  1. (在服务器上)安装Dropbear

    sudo apt-get install dropbear
    
  2. (在服务器上)复制并分配用于根公用/专用密钥登录的权限

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

记住将用户更改为服务器上的用户名

  1. (在客户端上)从服务器获取私钥

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  2. (在客户端上)向ssh config添加一个条目

    Host parkia
        Hostname 192.168.11.111
        User root
        UserKnownHostsFile ~/.ssh/know_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    Remember to change _parkia_ to whatever you'd like to type `ssh my-box` to be.
    
  3. (在服务器上)创建该文件/etc/initramfs-tools/hooks/crypt_unlock.sh

  4. (在服务器上)使该文件可执行

    sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
    
  5. 更新initramfs

    sudo update-initramfs -u
    
  6. 在启动时禁用dropbear服务,以便在解密分区后使用openssh

    sudo update-rc.d dropbear disable
    

你完成了。试试看。如果需要这样做,请查看上面链接的博客文章,以获取有关如何使用静态IP地址配置服务器的说明。


链接的博客添加了将客户端的公钥附加到服务器的引用/etc/initramfs-tools/root/.ssh/authorized_keys,即使该副本仍通过复制Dropbear的私钥进行,但人们完全可以忽略。遵循其余说明对我有用,这意味着这应该是可接受的答案(一旦它反映了该更改),因为它仅使用公共密钥。
Jonathan Y.

23

此博客文章中显示了使用BusyBox和Dropbear进行此类设置的指南。早期的SSH不适用于我,显然不再需要了。

我在下面总结了您需要做的事情。有关更多详细信息,请参见上面的帖子:

  1. 服务器上安装BusyBox和Dropbear

    sudo apt-get install dropbear busybox
    
  2. 服务器上更新您的initramfs

    sudo update-initramfs -u
    
  3. 将dropbear生成的私钥复制到客户端计算机。您可能必须将此复制到新目录并更改所有权才能执行此操作。在您的服务器上执行以下操作:

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

    请记住用您的用户名替换用户。密码登录似乎无效。

  4. 现在,您可以通过在客户端上调用以下命令来通过scp传输私钥:

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. 设置客户端的〜/ .ssh / config文件以便于登录。使用文本编辑器将其打开并添加以下内容:

    Host myremoteserver
        HostName my.remote.server
        User root
        UserKnownHostsFile ~/.ssh/known_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    

    将“主机”更改为任意名称,将“主机名”更改为服务器的名称。让用户成为root。它似乎是Dropbear中唯一接受的用户。保存并关闭文件。

  6. 重新启动服务器,并等待密码提示。给Dropbear几秒钟的时间来检测并建立其Internet连接。在客户端上使用以下命令连接到服务器:

    ssh myremoteserver # or any name you chose
    
  7. 登录后,在服务器上发出以下命令。有关详细信息,请参见博客文章:

    pid=`ps | grep "/scripts/local-top/cryptroot" | cut -d " " -f 3`
    kill -9 $pid
    sleep 35
    /scripts/local-top/cryptroot
    pid=`ps | grep "/bin/sh" | cut -d " " -f 3`
    kill -9 $pid;
    

    键入密码短语需要一些时间(30秒)。出现提示时输入。

  8. 通过键入关闭连接

    exit
    
  9. 您的服务器现在应该已经解锁了其加密的硬盘驱动器,并可以正常启动。

(非常感谢博客文章的原始作者!)


2
我不太了解使用私钥的原因。将您在客户端计算机上的公钥作为根服务器的授权密钥复制到服务器上就足够了,对吗?
gertvdijk 2012年

我确信可以在客户端计算机上创建密钥对,并将公钥仅从那里移动到服务器,但是如果我没记错的话,我认为在发现BusyBox可以接受的格式时会遇到一些问题。因此,重用服务器上已经存在的密钥是我工作的唯一选择。
2012年

1
知道我应该怎么做才能在Arch Linux上工作吗?
Gerharddc 2014年

1
@Gerhman签出AUR中的dropbear_initrd_encrypt软件包,以获取Archlinux上的早期支持。
卡莱布

1
@Gerhman archwiki页面:根或其他分区的远程解锁尚未完成,但看起来很有趣。将不得不检查出来:)
hanetzer

18

我认为Early-ssh可提供您要搜索的内容:

Early-ssh is a simple initramfs hook, which installs Dropbear SSH server into  
your initramfs, and starts it at boottime, so you will be able to do a lot of  
things remotely over SSH, before your root partition gets mounted, for example:

* unlocking LUKS encrypted crypto devices - 
  even your root can be an encrypted filesystem
* assembling/altering RAID arrays (mdadm)
* checking the root filesystem in read-write mode, 
  taking action in case of errors
* and so on...

已经有一个.deb软件包,因此您可以使用Ubuntu很好。


看起来这正是我要的东西,谢谢!
hpy 2010年

3
您是否有指向好的教程或指南的链接?我在我的debian压缩盒中迷上了早SSH。

1
是的,教程会很棒。
hpy 2011年


16

/usr/share/doc/cryptsetup/README.remote.gz(Ubuntu包cryptsetup)中查看有关此内容的cryptsetup自述文件。在其中有完成此操作的完整指南。这类似于Dragly的答案,但我认为这有点优雅。(Dropbear格式化的密钥,通过FIFO而不是易碎的shell脚本传递密码),等等。

通过initramfs中的ssh登录解锁rootfs

您可以在从远程启动时解锁rootfs,使用ssh在安装了initramfs的系统上运行时使用ssh登录到引导系统。

设定

为了使远程解锁起作用,在构建initramfs之前必须安装以下软件包: dropbear busybox

该文件/etc/initramfs-tools/initramfs.conf包含构建initramfs时使用的配置选项。它应包含BUSYBOX=y (在安装busybox软件包时将其设置为默认值)以将busybox安装到initramfs中,并且不应包含 DROPBEAR=n,这将禁止将dropbear安装到initramfs。如果设置为DROPBEAR=y,则无论如何都将安装dropbear;如果 DROPBEAR根本没有设置,那么仅在现有cryptroot设置的情况下才安装dropbear。

用于initramfs的主机密钥是dropbear_dss_host_keydropbear_rsa_host_key,都位于中/etc/initramfs-tools/etc/dropbear/。如果在编译initramfs时不存在它们,则会自动创建它们。以下是手动创建它们的命令:

dropbearkey -t dss -f /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key
dropbearkey -t rsa -f /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key

由于不会对initramfs进行加密,因此假定使用了公钥身份验证。用于此的密钥将从中获取 /etc/initramfs-tools/root/.ssh/authorized_keys。如果在编译initramfs时此文件不存在,则会创建该文件 /etc/initramfs-tools/root/.ssh/id_rsa.pub并将其添加到该文件中。如果后一个文件也不存在,它将自动生成-您将找到匹配的私钥,以后将需要使用该私钥登录到initramfs下/etc/initramfs-tools/root/.ssh/id_rsa (或者id_rsa.dropbear如果您需要dropbear格式的文件)。以下是手动执行各个步骤的命令:

要创建密钥(dropbear格式):

dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear

要将密钥从dropbear格式转换为openssh格式:

/usr/lib/dropbear/dropbearconvert dropbear openssh \
    /etc/initramfs-tools/root/.ssh/id_rsa.dropbear \
    /etc/initramfs-tools/root/.ssh/id_rsa

提取公钥:

dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear | \
    grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id_rsa.pub

要将公钥添加到authorized_keys文件中:

cat /etc/initramfs-tools/root/.ssh/id_rsa.pub >> /etc/initramfs-tools/root/.ssh/authorized_keys

如果希望使用dhcp配置某些接口,则设置 DEVICE=in /etc/initramfs-tools/initramfs.conf就足够了。initramfs还应遵守ip=内核参数。如果您使用grub,则可能需要将其设置为/boot/grub/menu.lst,或者在' # kopt='行中或附加到特定的' kernel'行中。该ip=内核参数记录在Documentation/nfsroot.txt内核源代码树。

问题

update-initramfs更改配置以使其生效时,请不要忘记运行它!

有时为ssh守护程序收集足够的熵似乎是一个问题。ssh守护程序的启动可能会延迟,直到检索到足够的熵为止。这对于启动过程是非阻塞的,因此,当您在控制台上时,不必等待sshd完成启动。

解锁程序

要从远程解锁,您可以执行以下操作:

ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" \
    -i "~/id_rsa.initramfs" root@initramfshost.example.com \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

本示例假定您有一个额外的known_hosts文件“ ~/.ssh/known_hosts.initramfs”,其中包含cryptroot系统的主机密钥,您有一个文件“ ~/id_rsa.initramfs”,其中包含cryptroot系统的授权密钥,并且cryptroot系统的名称为“ initramfshost.example.com”,并且cryptroot密码为“ secret

-< debian@x.ray.net>,2009年9月30日,星期三

感谢jap在其他频道上向我指出了这一点。


1
这似乎比骇客的ps-grepping更好(在官方文档和所有内容中都有描述)。作为提供的解锁过程的补充说明,您可能需要谨慎在命令行上直接输入密码,因为它很可能会出现在某个shell历史记录文件中。一种可能的解决方案是使用创建一个小的包装器脚本,提示输入密码短语read -s -p
joelpet

1
请注意,在最近的Ubuntu版本中,这种方法存在问题,例如bugs.launchpad.net/ubuntu/+source/cryptsetup/+bug/595648
Frederick Nord

6

如果您希望能够在无人值守的情况下以及远程启动,则还应该查看Mandos(我和其他人已经写过):

Mandos是一个允许具有加密根文件系统的服务器无人值守和/或远程重启的系统。有关更多信息,包括常见问题列表,请参见简介手册页文件。

简而言之,引导服务器以一种安全的方式通过网络获取密码。有关详细信息,请参见自述文件。


感谢您的贡献,但请注意,几乎100%提及您的产品的帖子都是边缘行为,并且冒着被视为垃圾邮件的风险(如果Mandos不是免费软件,我会标记您的帖子)或您在其他网站上没有非Mandos帖子的历史记录)。
Gilles

@吉尔斯:现在完成。
泰迪

2

无头服务器?如果具有串行端口,请使用它。

可以将GRUB配置为通过串行端口工作。您还可以使用串行端口配置内核,以输出初始引导消息,输入密码以解锁驱动器并登录。(如果服务器支持串行BIOS,也请启用它。这样,您就无需连接一台显示器监控器)。

采用“非网络”方式接入无头服务器始终是一个好主意。


好点!虽然“ 非网络的无头服务器获取的”方式大多是()相关的,如果客户机/服务器之间的物理接近接近; 除非我忽略了串行连接的其他可能性/功能。
ILMostro_7 '16


2

不幸的是,以上答案都对我没有帮助。而且,从服务器复制私钥似乎很矛盾。

无论如何,请按照以下说明进行操作:

通过CLIENT连接和解锁加密分区来启动SERVER

安装强制性软件包(在SERVER上)

apt-get install dropbear initramfs-tools busybox

将所需的公共密钥附加到SERVER的authorized_keys文件中

只需将您的公钥复制并粘贴到/etc/dropbear-initramfs/authorized_keysSERVER上

创建解锁脚本

在中创建以下脚本 /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 line kill the remote shell right after the passphrase has
# been entered.
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

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

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

#format [host ip]::[gateway ip]:[netmask]:[hostname]:[device]:[autoconf]
#([hostname] can be omitted)
IP=192.168.1.254::192.168.1.1:255.255.255.0::eth0:off

更新initialramfs

update-initramfs -u

在启动时禁用dropbear服务,以便在解密分区后使用openssh

sudo update-rc.d dropbear disable

测试中

  • 重新启动服务器
  • 通过连接到服务器 ssh root@192.168.1.254 [-i ~/.ssh/id_rsa]

2

在debian 9(稳定版)上,此解决方案已过时。在安装过程中,我收到有关的警告dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!,但找不到所需的密钥。顺便说一下,这种方法非常简单,并在出色的#debian频道上向我进行了解释(再次感谢您):

首先确认busyboxdropbeardropbear-initramfs安装

sudo apt install busybox dropbear*

然后(在大多数情况下~/.ssh/id_rsa.pub)在文件中添加您的公钥/etc/dropbear-initramfs/authorized_keys

然后initramfs进行更新以考虑更改::update-initramfs -u

就这样!

请注意,如果要避免在dropbear和之间的键之间发生冲突openssh(它们共享相同的ip,但使用不同的键),则可能需要在客户端~/.ssh/config中输入以下内容:

Host myserver_luks_unlock
     User root
     Hostname <myserver>
     # The next line is useful to avoid ssh conflict with IP
     HostKeyAlias <myserver>_luks_unlock
     Port 22
     PreferredAuthentications publickey
     IdentityFile ~/.ssh/id_rsa

然后,您只需使用以下命令进行连接:

ssh myserver_luks_unlock

并在出现提示后,按busybox提示提示输入:

cryptroot-unlock

并输入您的密码。

请享用!



0

我一直在使用此页面上其他人介绍的技术(initramfs中的SSH,带有IP用于配置网络的内核参数)来远程解锁无头的Ubuntu Linux服务器(12.02、14.04、16.04和18.04)。

我什至甚至开发了一个Python程序(unlock-remote-system),它可以为我进行实际的解锁,因为手动执行此过程的过程有些脆弱,而且我开始担心重新启动服务器,因此本着这种精神我用Python😇对我的知识进行了编码(如果真的很痛苦,那值得进行自动化)(这确实使定期重新启动以应用安全更新变得容易得多)。

从那时起,我决定与世界分享有关远程根磁盘加密的个人笔记。链接的页面包含有关该过程的许多详细信息(还有此处未提及的一些提示),我打算使其保持最新状态。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.