当我安装Ubuntu 10.04和现在的10.10时,系统为我提供了为硬盘驱动器启用“加密LVM”的选项。选择该选项后,在启动过程中会提示我输入密码以解密LVM。
现在,我正在考虑建立一个运行Linux的无头服务器(不一定是Ubuntu),但是我担心由于该服务器是无头的,因此我无法在启动过程中对其进行解密。在启动过程中,我可以通过SSH输入密码来输入加密的LVM吗?如果是这样,我该如何设置?还是有其他解决方案?同样,此问题并非特定于Ubuntu。谢谢。
当我安装Ubuntu 10.04和现在的10.10时,系统为我提供了为硬盘驱动器启用“加密LVM”的选项。选择该选项后,在启动过程中会提示我输入密码以解密LVM。
现在,我正在考虑建立一个运行Linux的无头服务器(不一定是Ubuntu),但是我担心由于该服务器是无头的,因此我无法在启动过程中对其进行解密。在启动过程中,我可以通过SSH输入密码来输入加密的LVM吗?如果是这样,我该如何设置?还是有其他解决方案?同样,此问题并非特定于Ubuntu。谢谢。
Answers:
对于较新版本的ubuntu,例如14.04,我发现@dragly的组合,此博客文章的答案非常有帮助。释义:
(在服务器上)安装Dropbear
sudo apt-get install dropbear
(在服务器上)复制并分配用于根公用/专用密钥登录的权限
sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
sudo chown user:user ~/id_rsa
记住将用户更改为服务器上的用户名
(在客户端上)从服务器获取私钥
scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
(在客户端上)向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.
(在服务器上)创建该文件的/etc/initramfs-tools/hooks/crypt_unlock.sh
(在服务器上)使该文件可执行
sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
更新initramfs
sudo update-initramfs -u
在启动时禁用dropbear服务,以便在解密分区后使用openssh
sudo update-rc.d dropbear disable
你完成了。试试看。如果需要这样做,请查看上面链接的博客文章,以获取有关如何使用静态IP地址配置服务器的说明。
/etc/initramfs-tools/root/.ssh/authorized_keys
,即使该副本仍通过复制Dropbear的私钥进行,但人们完全可以忽略。遵循其余说明对我有用,这意味着这应该是可接受的答案(一旦它反映了该更改),因为它仅使用公共密钥。
此博客文章中显示了使用BusyBox和Dropbear进行此类设置的指南。早期的SSH不适用于我,显然不再需要了。
我在下面总结了您需要做的事情。有关更多详细信息,请参见上面的帖子:
在服务器上安装BusyBox和Dropbear
sudo apt-get install dropbear busybox
在服务器上更新您的initramfs
sudo update-initramfs -u
将dropbear生成的私钥复制到客户端计算机。您可能必须将此复制到新目录并更改所有权才能执行此操作。在您的服务器上执行以下操作:
sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
sudo chown user:user ~/id_rsa
请记住用您的用户名替换用户。密码登录似乎无效。
现在,您可以通过在客户端上调用以下命令来通过scp传输私钥:
scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
设置客户端的〜/ .ssh / config文件以便于登录。使用文本编辑器将其打开并添加以下内容:
Host myremoteserver
HostName my.remote.server
User root
UserKnownHostsFile ~/.ssh/known_hosts.initramfs
IdentityFile ~/.ssh/id_rsa_dropbear
将“主机”更改为任意名称,将“主机名”更改为服务器的名称。让用户成为root。它似乎是Dropbear中唯一接受的用户。保存并关闭文件。
重新启动服务器,并等待密码提示。给Dropbear几秒钟的时间来检测并建立其Internet连接。在客户端上使用以下命令连接到服务器:
ssh myremoteserver # or any name you chose
登录后,在服务器上发出以下命令。有关详细信息,请参见博客文章:
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秒)。出现提示时输入。
通过键入关闭连接
exit
您的服务器现在应该已经解锁了其加密的硬盘驱动器,并可以正常启动。
(非常感谢博客文章的原始作者!)
我认为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很好。
在/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_key
和dropbear_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在其他频道上向我指出了这一点。
read -s -p
。
无头服务器?如果具有串行端口,请使用它。
可以将GRUB配置为通过串行端口工作。您还可以使用串行端口配置内核,以输出初始引导消息,输入密码以解锁驱动器并登录。(如果服务器支持串行BIOS,也请启用它。这样,您就无需连接一台显示器监控器)。
采用“非网络”方式接入无头服务器始终是一个好主意。
在arch linux上,有一个AUR包dropbear_initrd_encrypt可以立即提供您想要的功能。适用于有线接口。为了无线,我不得不稍加修改。
不幸的是,以上答案都对我没有帮助。而且,从服务器复制私钥似乎很矛盾。
无论如何,请按照以下说明进行操作:
apt-get install dropbear initramfs-tools busybox
只需将您的公钥复制并粘贴到/etc/dropbear-initramfs/authorized_keys
SERVER上
在中创建以下脚本 /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
编辑/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
update-initramfs -u
sudo update-rc.d dropbear disable
ssh root@192.168.1.254 [-i ~/.ssh/id_rsa]
在debian 9(稳定版)上,此解决方案已过时。在安装过程中,我收到有关的警告dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!
,但找不到所需的密钥。顺便说一下,这种方法非常简单,并在出色的#debian频道上向我进行了解释(再次感谢您):
首先确认busybox
,dropbear
并dropbear-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
并输入您的密码。
请享用!
我写了一个Ansible角色,可以为您完成此任务。只需获得角色debops-contrib.dropbear_initramfs并运行它即可。有关详细信息,请参阅角色的文档。
我一直在使用此页面上其他人介绍的技术(initramfs中的SSH,带有IP
用于配置网络的内核参数)来远程解锁无头的Ubuntu Linux服务器(12.02、14.04、16.04和18.04)。
我什至甚至开发了一个Python程序(unlock-remote-system),它可以为我进行实际的解锁,因为手动执行此过程的过程有些脆弱,而且我开始担心重新启动服务器,因此本着这种精神我用Python😇对我的知识进行了编码(如果真的很痛苦,那值得进行自动化)(这确实使定期重新启动以应用安全更新变得容易得多)。
从那时起,我决定与世界分享有关远程根磁盘加密的个人笔记。链接的页面包含有关该过程的许多详细信息(还有此处未提及的一些提示),我打算使其保持最新状态。
zless /usr/share/doc/cryptsetup/README.remote.gz