我正在尝试解锁运行加密版 Ubuntu 14.04 的无头服务器。这是一个干净的 14.04.2 安装,包含截至撰写本文时的所有更新。
dropbear
我经历了和的标准恶作剧busybox
,即:
# INSTALL
sudo apt-get install dropbear busybox # on server
# ENABLE AND CONFIGURE IP
sudo sed -i 's/NO_START=1/NO_START=0/g' /etc/default/dropber
sudo sed -i 's/BUSYBOX=y/BUSYBOX=y\nDROPBEAR=y\n/g' \
/etc/iniramfs/iniramfs.conf
sudo sed -i 's/DEVICE=.+/DEVICE=etho0/g' \
/etc/iniramfs/initramfs.conf
sudo sed -i 's/IP=.+/IP=IP=192.168.0.11:::255.255.255.0::eth1:off' \
/etc/initramfs/initramfs.conf
sudo update-initramfs
# COPY DROPBEAR SSH KEY
# WRONG: sudo cp /etc/dropbear/dropbear_*_host_key /tmp
sudo cp /etc/initramfs-tools/root/.ssh/id_rsa /tmp # BETTER!
sudo chown $USER:$USER /tmp/id_rsa
scp server:/tmp/id_rsa ~/.ssh/id_rsa_dropbear_server # on client
sudo reboot # on server
# CONNECT TO SERVER
ssh -vv -i ~/.ssh/id_rsa_dropbear_server \
-o 'UserKnownHostsFile=~/.ssh/known_hosts.initramfs' \
[email protected] # on client
于是我复制了自动生成的 ssh-key,并对 dropbear 进行了最小配置。令我惊讶的是,有两三件事出现了故障:
- 系统忽略了 IP 设置。我在路由器的“已连接设备”站点中发现,
192.168.0.27
尽管我进行了配置,但服务器还是有 IP。因此,我尝试使用列出的错误 IP:。这连接到 dropbear,但是:ssh -vv -i ~/.ssh/dropbear_dss_host_key -o 'UserKnownHostsFile=~/.ssh/known_hosts.initramfs' [email protected]
- Dropbear 忽略了除其自身之外的所有公钥
/etc/initramfs-tools/root/.ssh/authorized_keys
(已使用 dss 测试 - 可能还有 rsa)。
已解决:Dropbear 需要密钥的密码,但我没有。所以我尝试了一个空密码。这样 dropbear 就转到密码验证并需要 root 密码,但该密码未设置。 - 自定义钩子脚本似乎部分被忽略了。这些是在旧安装中工作的脚本!
以下是全部内容ssh 会话。
我将常用的公钥文件添加到服务器中 dropbear 的已知主机/etc/initramfs-tools/root/.ssh/authorized_keys
,并尝试使用常用密钥进行 ssh 连接。但没用。
我将该行添加GRUB_CMDLINE_LINUX_DEFAULT="ip=192.168.0.11::192.168.0.1:255.255.255.0::eth0:none"
到服务器/etc/default/grup
并更新了组。这是为了修复 IP 问题。但这也没有用。
我现在彻底恼火了,忍无可忍。我哪里做错了?另外,IP 设置的语法是否正确,因为一个指南说::eth0:off
,另一个指南说::etho:none
?
编辑
有人似乎同样的问题于 15.04。
编辑2
我现在可以连接到服务器了。结果发现,我复制了错误的私钥来与 dropbear 一起使用。上面的脚本中已经更正了错误。但添加密钥仍然不起作用(即添加到 dropbear 的authorized_keys
文件)。有一句话是您需要将要添加的公钥转换为/etc/initramfs-tools/root/.ssh/authorized_keys
dropbear 的格式,但我不想花时间搜索如何操作。我只尝试了dss
公钥。也许 dropbearrsa
更好?
我还注意到,自定义钩子脚本似乎不起作用。它们不包含在 initramfs 目录中,但lsinitramfs -l /boot/initrd.img-3.16.0-43-generic
将它们列为映像的一部分。IP 设置也仍然被忽略。即使我将其添加GRUB_CMDLINE_LINUX_DEFAULT="ip=192.168.0.11::192.168.0.1:255.255.255.0::eth0:none"
到 grubconfig 中/etc/default/grub
并更新所有内容。
编辑3
因此,这似乎/usr/lib/dropbear/dropbearconvert INPUTFORMAT OUTPUTFORMAT INFILE OUTFILE
是转换密钥的程序。 FORMAT 参数可以是openssh
或dropbear
。但这似乎不是如何将密钥添加到服务器的答案/etc/initramfs-tools/root/.ssh/authorized_keys
。那里的现有密钥已经是 openssh 的公钥文件格式。因此,添加其他 openssh 格式的密钥应该不是问题。但事实并非如此。
答案1
不清楚哪些 known_hosts 会困扰你 - 在服务器上还是在客户端。我使用了以下说明http://blog.neutrino.es/2011/unlocking-a-luks-encrypted-root-partition-remotely-via-ssh/ 在 Debian 上。我将解释该页面并添加一些我认为有用的调整。当代 Debian dropbox 软件包在安装时在服务器上创建所有需要的密钥,但引用的教程太旧了,以至于它提到了需要手动创建密钥的情况。YMMV。
A. 在服务器上。正如您正确提到的,dropbear 和 OpenSSH 密钥不同,但据说可以相互转换。教程说您可以在服务器上使用以下命令创建主机密钥:
dropbearkey -t rsa -f /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key
事实上,这比这要难一些。对于我来说,在 Debian Jessie 上,步骤如下:
创建一个 OpenSSH 密钥。
ssh-keygen -t rsa -b 4096 -m PEM -f bootkey_rsa
将其复制到服务器上,也就是您最有可能安装 dropbearconvert 的计算机。在那里,将其转换为 dropbear 格式:
/usr/lib/dropbear/dropbearconvert openssh dropbear bootkey_rsa bootkey_dropbear_rsa
仍然在服务器上,登录到 root 身份,并从 Dropbear 密钥中提取公共部分到启动 dropbear 查找它的文件中:
dropbearkey -y -f bootkey_dropbear_rsa | grep "^ssh-rsa" > /etc/dropbear-initramfs/authorized_keys
更新 initramfs:
更新-initramfs -u -k 全部
清理:从服务器中删除 bootkey_dropbear_rsa 和 bootkey_rsa。
请注意,update-initramfs 所需的 known_hosts 位置(如上所示)/etc/dropbear-initramfs/authorized_keys
是灵活的,并且可能因发行版而异。为确保将其放在正确的位置,请阅读 中的源文件/usr/share/initramfs-tools/hooks/dropbear
。
另一个所需的密钥是通过以下方式创建的:
dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear
B. 在客户端上,您需要两种密钥,因此还有另一个known_hosts
。在参考的教程中,连接的命令是:
ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" \
-i "~/id_rsa.initramfs" [email protected] \
"echo -ne \"MyS3cr3tK3y\" >/lib/cryptsetup/passfifo"
其中一个键id_rsa.initramfs
是文件/etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key
或bootkey_rsa
来自服务器部分。
在客户端上known_hosts
,您已拥有的 OpenSSH 服务器密钥和您刚刚安装的 dropbear 服务器密钥之间可能存在冲突。我暂时从known_hosts
常规 OpenSSH 服务的密钥中删除了密钥,使用上面的命令(省略参数-o
)进行连接,系统提示我是否信任主机密钥,我回答是,然后将其附加到我的known hosts
。从那里开始,您需要将最后一行移动到其自己的 known_hosts(~/.ssh/known_hosts.initramfs
在上面的示例中)。
答案2
以下是如何转换 dropbear 的密钥。启动脚本对我来说也有点奇怪...
答案3
通过您的客户端连接并解锁加密分区来启动您的服务器
安装必需软件包(在服务器上)
apt-get install dropbear initramfs-tools busybox
将所需的公钥附加到服务器的 authorized_keys 文件中
只需将您的公钥复制并粘贴到/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 "\$@"
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
以添加(或更改)以下行:
IP=192.168.1.254::192.168.1.1:255.255.255.0::eth0:off
format [host ip]::[gateway ip]:[netmask]:[hostname]:[device]:[autoconf]
([hostname] can be omitted)
更新 initialramfs
update-initramfs -u
在启动时禁用 dropbear 服务,以便在分区解密后使用 openssh
sudo update-rc.d dropbear disable
测试
- 重新启动服务器
- 通过连接到您的服务器
ssh [email protected] [-i ~/.ssh/id_rsa]
答案4
好了,各位,以防万一您没有找到解决方案,并且对于其他按照在线教程进行操作的人来说......
我在网上找到的所有教程都说/暗示该文件
authorized_keys
进入
/etc/initramfs-tools/root/.ssh/
但实际上它应该进入
/etc/dropbear-initramfs/
+1@ceremcem 也展示了这一点。