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和修改原始脚本的其他人。