it-swarm.cn

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

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

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

62
hpy

对于较新版本的ubuntu,例如14.04,我发现@dragly和 this blogposts' 答案的组合非常有用。释义:

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

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

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

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

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

    scp [email protected]:~/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地址配置服务器的说明(如果您需要这样做)。

26
nsg

此博客文章 中显示了使用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 [email protected]:~/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. 您的服务器现在应该已经解锁了其加密的硬盘驱动器,并可以正常启动。

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

23
dragly

我认为 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。

18
wag

看看/usr/share/doc/cryptsetup/README.remote.gz(Ubuntu软件包cryptsetup)中的cryptsetup自述文件。在其中有完成此操作的完整指南。它类似于 草率回答 ,但我认为这有点优雅。 (Dropbear格式的键,通过FIFO)而不是易碎的Shell脚本等)传递密码。)

通过initramfs中的ssh登录解锁rootfs

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

设定

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

/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。如果后一个文件也不存在,它将自动生成-您将找到匹配的私钥,以后需要在/etc/initramfs-tools/root/.ssh/id_rsa(或id_rsa.dropbear)下登录initramfs需要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=中设置/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" [email protected] \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

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

-<[email protected]>,2009年9月30日,星期三

感谢 jap 在另一个频道上向我指出这一点。

16
gertvdijk

如果您希望能够无人值守地引导,也应该查看 Mandos (我和其他人已经写了):

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

简而言之,引导服务器以一种安全的方式通过网络获取密码。请参阅README了解详细信息。

6
Teddy

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

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

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

2
LawrenceC

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

无论如何, 遵循说明 已解决:

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

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

apt-get install dropbear initramfs-tools busybox

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

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

创建解锁脚本

/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 "\[email protected]"
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 [email protected] [-i ~/.ssh/id_rsa]连接到您的服务器
2
ceremcem

在Arch Linux上,有一个AUR软件包 dropbear_initrd_encrypt 可以完成您想要的工作。适用于有线接口。为了无线,我不得不稍加修改。

2
user3188445

在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

就这样!

请注意,如果要避免dropbearopenssh之间的键之间发生冲突(它们共享相同的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

并输入您的密码。

请享用!

2
tobiasBora

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

我什至还开发了一个Python程序( nlock-remote-system )),该程序可以为我进行实际的解锁,因为手动完成此过程有点脆弱,我开始害怕重新启动服务器,因此本着“如果有麻烦,值得自动化”的精神,我用Python ????(这确实是使其更容易进行定期重新启动以应用安全更新)。

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

1
xolox

我写了一个Ansible角色来为您完成此任务。只需获得 debops-contrib.dropbear_initramfs 角色并运行它即可。有关详细信息,请参阅 角色的文档

0
ypid