HOWTO:通过SSH在Ubuntu上解锁LUKS加密的根分区

HOWTO:通过SSH在Ubuntu上解锁LUKS加密的根分区

作者:Stephan Jau
修订:v1.0
最后更改:2008年6月15日

介绍

完全加密的系统可防止其他人从物理访问中获取数据。 完整系统加密背后的理由是,您不必担心加密什么,什么不加密,因为除了/ boot分区之外的所有东西都将被加密。

但是到目前为止我遇到的问题是,如何从远方重启电脑? 我将被要求在电脑前面并输入密码。 我想知道如何远程重启计算机。

在Debian Administrator上,我发现了Wulf(Wolfram Coulmann)撰写的一篇文章 ,他用dropbear作为轻量级的ssh服务器和一个解锁脚本创建了一个initrd。 然而,该脚本仍然有一些错误,不适合Ubuntu。 然而,在评论中,有一些修改(特别是#31和#29),这将使它也可以在ubuntu上工作。

剧本

那么这里是脚本:dropbear

#!/bin/bash
# We add dropbear to the initrd to be able
# mount crypted partitions from remote
# copyright Wulf Coulmann
# GNU GPL
# http://www.gnu.org/licenses/gpl.html
#
# Download me here: http://gpl.coulmann.de/dropbear
# get infos about this script here:
# http://gpl.coulmann.de/ssh_luks_unlock.html
# Modified by Anonymous 2008
# Modified By Geoffroy RABOUIN 26/05/2008
# Modified by hyper_ch 15/06/2008
### INSTRUCTIONS FOR UBUNTU ###
# 0. Enable root login
# 1. Install killall, busybox and dropbear:
#    ~# sudo apt-get install psmisc busybox dropbear
# 2. Edit network configuration below and copy contents
#    of this file to /etc/initramfs-tools/hooks/dropbear
# 3. Save the script and make it executable:
#    ~# sudo chmod +x /etc/initramfs-tools/hooks/dropbear
# 4. Create new initrd:
#    ~# sudo mkinitramfs -o /boot/netboot
# 5. Edit /boot/grub/menu.lst and add your new initrd as the first entry
# 6. Delete the dropbear script the hooks folder
#    ~# sudo rm /etc/initramfs-tools/hooks/dropbear
# 7. Profit!
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
# Begin real processing below this line
# load the prepared functions of debians initramfs enviroment
source /usr/share/initramfs-tools/hook-functions
# build the directories
DIRS='/lib /bin /usr/bin /usr/sbin/ /proc/ /root/.ssh/ /var/ /var/run/ /etc/dropbear/'
for now in $DIRS ; do
if [ ! -e ${DESTDIR}$now ]
then
mkdir -p ${DESTDIR}$now
fi
done
# copy the ssh-daemon and librarys
copy_exec /usr/sbin/dropbear /usr/sbin/
copy_exec /usr/bin/passwd /usr/bin/
copy_exec /bin/login /bin/
copy_exec /usr/bin/killall /usr/bin/
copy_exec /sbin/route /sbin/
copy_exec /usr/bin/awk /usr/bin/
#copy_exec /usr/bin/strace /usr/bin/
#copy_exec /bin/nc /bin/
copy_exec /usr/bin/wc /usr/bin/
# some librarys are not autoincluded by copy_exec
copy_exec /lib/libnss_compat.so.2 /lib/
copy_exec /usr/lib/libz.so.1 /usr/lib/
copy_exec /etc/ld.so.cache /etc/
copy_exec /lib/libutil.so.1 /lib/
# we copy config and key files
cp -pr /etc/dropbear/dropbear_dss_host_key ${DESTDIR}/etc/dropbear/
cp -pr /etc/dropbear/dropbear_rsa_host_key ${DESTDIR}/etc/dropbear/
cp -pr /etc/passwd ${DESTDIR}/etc/
cp -pr /etc/shadow ${DESTDIR}/etc/
cp -pr /etc/group ${DESTDIR}/etc/
if [ -e /root/.ssh/authorized_keys ]
then
cp -pr /root/.ssh/authorized_keys ${DESTDIR}/root/.ssh/
fi
cp -pr /etc/nsswitch.conf ${DESTDIR}/etc/
cp -pr /etc/localtime ${DESTDIR}/etc/
cp -pr /lib/tls ${DESTDIR}/lib/
# we don't have bash in our initrd
# also we only add the root account
cat /etc/passwd | grep root | sed s/\\/bash/\\/sh/ > ${DESTDIR}/etc/passwd
cat /etc/shadow | grep root > ${DESTDIR}/etc/shadow
cat /etc/group | grep root > ${DESTDIR}/etc/group
cat >${DESTDIR}/scripts/local-top/network_ssh << 'EOF'
#!/bin/sh
# we start the network and ssh-server
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
# Begin real processing below this line
# build up helpful environment
[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir --mode=0700 /root
[ -d /tmp ] || mkdir /tmp
[ -d /sys ] || {
mkdir /sys
mount -t sysfs -o nodev,noexec,nosuid none /sys
}
[ -d /proc ] || {
mkdir /proc
mount -t proc -o nodev,noexec,nosuid none /proc
}
mkdir -p /var/lock
mkdir -p /var/log
touch /var/log/lastlog
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
/bin/sleep 5
################# CHANGE THE LINES BELOW #################
# The network setup: edit ip address and gateway to match your needs
ifconfig eth0 172.16.2.128 netmask 255.255.255.0
route add default gw 172.16.2.2
################# CHANGE THE LINES ABOVE #################
# display the network settings for double check
ifconfig
# If you like to use dhcp make sure you include dhclient or pump in
# /etc/initramfs-tools/hooks/dropbear via
# copy_exec /sbin/dhclient
# for debugging ssh-server you may run it in forgound
# /usr/sbin/dropbear -E -F
# for more debugging you may run it with strace
# therfor you have to include strace and nc at top of
# /etc/initramfs-tools/hooks/dropbear via
# copy_exec /usr/bin/strace
# copy_exec /usr/bin/nc
# then start nc on an other host and run
# /usr/sbin/dropbear -E -F 2>&1 | /bin/nc -vv <ip of="" other="" host=""> <nc port="" of="" other="" host="">
# e.g.:
# /usr/sbin/dropbear -E -F 2>&1 | /bin/nc -vv 192.168.1.2 8888
# We will use /dev/urandom because /dev/random gets easily blocked
mv /dev/random /dev/random.old
ln -s /dev/urandom /dev/random
# /usr/sbin/dropbear -E -F -b /etc/dropbear/banner -d /etc/dropbear/dropbear_dss_host_key -r /etc/dropbear/dropbear_rsa_host_key -p 22
/usr/sbin/dropbear -b /etc/dropbear/banner -d /etc/dropbear/dropbear_dss_host_key -r /etc/dropbear/dropbear_rsa_host_key -p 22
#ls -al
rm -f /dev/random
mv /dev/random.old /dev/random
EOF
chmod 700 ${DESTDIR}/scripts/local-top/network_ssh
cat >${DESTDIR}/etc/dropbear/banner << 'EOF'
To unlock root-partition run
unlock
EOF
# script to unlock luks via ssh
# dirty but effektive
cat >${DESTDIR}/usr/bin/unlock << 'EOF'
#!/bin/sh
/bin/sh /scripts/local-top/cryptroot
# Kill processes locking boot process
[ `ls /dev/mapper/ | grep -v control| wc -l | awk '{print $1}'` -gt 0 ] && {
for i in `ps | grep -E "cryptroot|cryptsetup" | awk '{ print $1 }'`
do
kill $i
done
}
/bin/sh /scripts/local-bottom/rm_dropbear
EOF
chmod 700 ${DESTDIR}/usr/bin/unlock
# make sure we exit dropbear at the end of the startup process
cat >${DESTDIR}/scripts/local-bottom/rm_dropbear << 'EOF'
#!/bin/sh
PREREQ=""
prereqs()
{
echo ""
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
# Begin real processing below this line
# we kill dropbear ssh-server
/usr/bin/killall dropbear
EOF
chmod 700 ${DESTDIR}/scripts/local-bottom/rm_dropbear

步骤0:启用root登录

首先,您必须启用root帐户。

sudo passwd root

为什么我说root必须启用的原因是因为我无法弄清楚如何将整个sudo许可的东西存入initrd。 我相信一定有办法,如果有人愿意接受挑战,请继续。 但是,只能在创建initrd时启用root登录。 一旦它被创建,那么相关的东西被保存在那里,你可以再次从实际安装中删除root登录。 根登录只需要登录dropbear,然后运行unlock脚本。 它不用于别的东西

第1步:安装所需的软件包

安装这些软件包:

sudo apt-get install psmisc busybox dropbear

第2步:配置网络

在脚本中将网络配置更改为您的需要。 我有sofar只使用静态ips。 脚本本身也提供了dhcp的选项 - 但是我没有尝试这些。

################# CHANGE THE LINES BELOW #################
# The network setup: edit ip address and gateway to match your needs
ifconfig eth0 172.16.2.128 netmask 255.255.255.0
route add default gw 172.16.2.2
################# CHANGE THE LINES ABOVE #################

以上设置只是我的vmware机器上测试的值。

第3步:保存脚本并使其可执行:

将修改的脚本保存到[I] / etc / initramfs-tools / hooks / dropbear [/ I]中,然后使其可执行:

sudo chmod +x /etc/initramfs-tools/hooks/dropbear

第4步:创建新的initrd

运行此命令创建一个名为“netboot”的新initrd。 当然,您可以将“netboot”重命名为任何您喜欢的内容。

sudo mkinitramfs -o /boot/netboot

第5步:编辑/boot/grub/menu.lst并添加新的initrd作为第一个条目

现在你必须编辑grub的菜单列表来添加新的init.rd.

跑:

sudo nano /boot/grub/menu.lst

在nano中编辑menu.lst。

转到最后(或几乎)并复制现有的内核条目,例如

title           Ubuntu 8.04.1, kernel 2.6.24-19-generic
root            (hd0,1)
kernel          /vmlinuz-2.6.24-19-generic root=/dev/mapper/sda4_crypt ro quiet splash
initrd          /initrd.img-2.6.24-19-generic

将其更改为:

title           Netboot
root            (hd0,1)
kernel          /vmlinuz-2.6.24-19-generic root=/dev/mapper/sda4_crypt ro quiet splash
initrd          /netboot

不要直接复制我的例子,但使用你的。 这样,根目录条目和映射程序名称是正确的。

最后,在menu.lst的顶部也会相应地更改默认的启动条目。 如果你有7个内核条目,那么你会把一个“6”放在那里,因为它以0开头,你最后添加一个netboot。

第6步:删除hooks文件夹中的dropbear脚本

当我在我的机器上尝试时,内核升级后会出现一些问题(这可能是由于我早期尝试使用错误的脚本)。 只需确保,从文件夹中删除dropbear脚本。

sudo rm /etc/initramfs-tools/hooks/dropbear

第7步:利润!

这就是它现在应该工作了。

一些事情要提到

- 那么在脚本中,我现在在网络配置后调用一个ifconfig 。 我做错了跟踪。 你可以从脚本中删除它。

- 现在创建netboot initrd后,您可以再次更改root密码,也可以禁用根登录。 由于initrd未加密,因此可以获取root密码的哈希值,因此您希望使用远程解锁加密驱动器的其他密码。 我强烈建议您更改密码或禁用实际机器中的根登录。

更改root密码

sudo passwd root

或删除root密码(禁用root)

sudo passwd -l root

- 虽然系统是完全加密的,但仍然有两种可能的攻击可以访问数据:

(1)ColdBoot攻击通过从ram块中读取加密密码(对于没有特殊硬件的安全密码,不要太多,请参阅这里

(2)可以操作创建的initrd,以便在某个地方记录加密密码。 由于/ boot没有被加密,所以攻击者可以以这种方式获得LUKS设备的密码。 你可以防止这样做,使用相应的内核和initrd进行可启动的cd,并实现某种哈希检查...也许还有其他方法...反馈在这里受到欢迎。

- 本教程大部分不是来自我的,只是一些适应和解释。 感谢Wolfram Coulmann和修改原始脚本的其他人。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏