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

hpy*_*hpy 69 boot ssh encryption headless lvm

当我安装 Ubuntu 10.04 和现在的 10.10 时,我可以选择为我的硬盘启用“加密 LVM”。选择该选项后,系统会在引导期间提示我输入密码以解密 LVM。

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

小智 30

对于较新版本的 ubuntu,例如 14.04,我发现 @dragly 和这篇博文答案的组合非常有帮助。转述:

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

    sudo apt-get install dropbear
    
    Run Code Online (Sandbox Code Playgroud)
  2. (在服务器上)复制和分配 root 公钥/私钥登录权限

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
    Run Code Online (Sandbox Code Playgroud)
  2. (在客户端)向 ssh 配置添加一个条目

    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.
    
    Run Code Online (Sandbox Code Playgroud)
  3. (在服务器上)创建该文件/etc/initramfs-tools/hooks/crypt_unlock.sh

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

    sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
    
    Run Code Online (Sandbox Code Playgroud)
  5. 更新 initramfs

    sudo update-initramfs -u
    
    Run Code Online (Sandbox Code Playgroud)
  6. 在启动时禁用 dropbear 服务,以便在分区解密后使用 openssh

    sudo update-rc.d dropbear disable
    
    Run Code Online (Sandbox Code Playgroud)

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


小智 24

此博客文章中显示了使用 BusyBox 和 Dropbear 进行此类设置的指南。early-ssh 对我不起作用,显然不再需要了。

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

  1. 在您的服务器上安装 BusyBox 和 Dropbear

    sudo apt-get install dropbear busybox
    
    Run Code Online (Sandbox Code Playgroud)
  2. 服务器上更新您的 initramfs

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

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    
    Run Code Online (Sandbox Code Playgroud)

    请记住用您的用户名替换用户。密码登录似乎不起作用。

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

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
    Run Code Online (Sandbox Code Playgroud)
  5. 设置客户端的 ~/.ssh/config 文件以便于登录。用文本编辑器打开它并添加以下内容:

    Host myremoteserver
        HostName my.remote.server
        User root
        UserKnownHostsFile ~/.ssh/known_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    
    Run Code Online (Sandbox Code Playgroud)

    将 Host 更改为您喜欢的任何内容,将 HostName 更改为您的服务器名称。让用户成为root。它似乎是 Dropbear 中唯一接受的用户。保存并关闭文件。

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

    ssh myremoteserver # or any name you chose
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    
    Run Code Online (Sandbox Code Playgroud)

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

  8. 通过键入关闭连接

    exit
    
    Run Code Online (Sandbox Code Playgroud)
  9. 您的服务器现在应该已解锁其加密硬盘驱动器并正常启动。

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

  • 我不太明白用私钥移动的原因。将您在客户端计算机上的公钥复制到服务器作为根服务器的授权密钥应该就足够了,对吗? (2认同)

wag*_*wag 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...
Run Code Online (Sandbox Code Playgroud)

已经有一个 .deb 包可用,所以你可能对 Ubuntu 没问题。

  • 你有一个好的教程或方法的链接吗?我在我的 debian 挤压盒上坚持使用 early-ssh。 (3认同)

ger*_*ijk 16

请查看/usr/share/doc/cryptsetup/README.remote.gz(Ubuntu 包cryptsetup)中的 cryptsetup 自述文件。里面有一个完整的指南来完成这个。它类似于Dragly 的 answer,但我认为这更优雅一些。(Dropbear 格式的密钥,通过 FIFO 而不是脆弱的 shell 脚本传递密码,等等)

通过 initramfs 中的 ssh 登录解锁 rootfs

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

设置

要使远程解锁工作,在构建 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
Run Code Online (Sandbox Code Playgroud)

由于 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
Run Code Online (Sandbox Code Playgroud)

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

/usr/lib/dropbear/dropbearconvert dropbear openssh \
    /etc/initramfs-tools/root/.ssh/id_rsa.dropbear \
    /etc/initramfs-tools/root/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

提取公钥:

dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear | \
    grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id_rsa.pub
Run Code Online (Sandbox Code Playgroud)

将公钥添加到 authorized_keys 文件:

cat /etc/initramfs-tools/root/.ssh/id_rsa.pub >> /etc/initramfs-tools/root/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

如果您希望使用 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"
Run Code Online (Sandbox Code Playgroud)

此示例假设您有一个额外的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在另一个频道上向我指出这一点。


Ted*_*ddy 6

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

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

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