我想设置一台具有全磁盘加密功能的无头 Linux (Debian Wheezy) PC,能够使用 USB 驱动器或通过键盘输入密码来解锁磁盘。我的起点是使用 Debian 安装程序中基本的整个磁盘加密选项进行全新安装,该安装程序将 /boot 之外的所有内容作为 LUKS 加密的逻辑卷组进行管理,并为我提供了键盘选项。我将在答案中描述我当前的解决方案,希望它有用并且其他人可以对其进行改进。
以下是我遇到的一些问题:
我将接受具有重大改进的答案,并对提供贡献的答案进行投票。
我的很多解决方案都来自于这篇文章,使用 USB 密钥作为 LUKS 密码 http://web.archive.org/web/20140212153345/https://binblog.info/2008/12/04/using-a-usb-key-for-the-luks-passphrase/.
-
创建一个随机密码:
dd if=/dev/urandom bs=1 count=256 > passphrase
-
插入 USB 驱动器。dmesg
输出将显示设备名称;认为/dev/sdd
。算出它的大小:
blockdev --getsize64 /dev/sdd
-
我决定在原始设备的末尾安装密码,认为它可以在 USB 驱动器的意外使用中幸存下来。
dd if=passphrase of=/dev/sdd bs=1 seek=<size-256>
-
将密码添加到 LUKS 卷:
cryptsetup luksAddKey /dev/sda5 passphrase
这不会影响安装程序现有的手动输入的密码。可以删除密码文件:
rm passphrase
-
为 USB 记忆棒找到一个唯一的名称,以便我们可以在存在时识别它:
ls -l /dev/disk/by-id | grep -w sdd
您应该看到一个符号链接。我会称之为/dev/disk/by-id/<ID>
.
-
Edit /etc/crypttab
。您应该看到类似这样的行:
sdc5_crypt UUID=b9570e0f-3bd3-40b0-801f-ee20ac460207 none luks
将其修改为:
sdc5_crypt UUID=b9570e0f-3bd3-40b0-801f-ee20ac460207 /dev/disk/by-id/<ID> luks,keyscript=/bin/passphrase-from-usb
-
The keyscript
上面提到的需要从USB设备读取密码。然而,它需要做的还不止这些。要了解如何使用它,请检查/usr/share/initramfs-tools/scripts/local-top/cryptroot
,在启动时运行以解锁根设备的脚本。请注意,当keyscript
设置后,只需运行它并将输出通过管道传输到luksOpen
没有其他检查。无法发出错误信号(USB 驱动器不存在)或退回到键盘输入。如果密码失败,则密钥脚本将再次循环运行,最多运行一定次数;然而我们不知道我们正在进行哪一次迭代。此外,我们无法控制 keyscript 的运行时间,因此我们无法确定 Linux 是否已识别 USB 驱动器。
我用一些技巧解决了这个问题:
-
轮询 USB 驱动器并等待 3 秒钟以使其出现。这对我有用,但我很想知道更好的方法。
-
创建一个虚拟文件/passphrase-from-usb-tried
第一次运行时表明我们至少运行过一次。
-
如果我们至少运行过一次,或者找不到 USB 驱动器,请运行askpass
程序使用者cryptroot
用于键盘输入。
最终脚本:
#!/bin/sh
set -e
if ! [ -e /passphrase-from-usb-tried ]; then
touch /passphrase-from-usb-tried
if ! [ -e "$CRYPTTAB_KEY" ]; then
echo "Waiting for USB stick to be recognized..." >&2
sleep 3
fi
if [ -e "$CRYPTTAB_KEY" ]; then
echo "Unlocking the disk $CRYPTTAB_SOURCE ($CRYPTTAB_NAME) from USB key" >&2
dd if="$CRYPTTAB_KEY" bs=1 skip=129498880 count=256 2>/dev/null
exit
else
echo "Can't find $CRYPTTAB_KEY; USB stick not present?" >&2
fi
fi
/lib/cryptsetup/askpass "Unlocking the disk $CRYPTTAB_SOURCE ($CRYPTTAB_NAME)\nEnter passphrase: "
最后,我们需要确保该脚本在 initramfs 中可用。创造/etc/initramfs-tools/hooks/passphrase-from-usb
包含:
#!/bin/sh
PREREQ=""
prereqs() {
echo "$PREREQ"
}
case "$1" in
prereqs)
prereqs
exit 0
;;
esac
. "${CONFDIR}/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions
copy_exec /bin/passphrase-from-usb /bin
-
我的 initramfs 中不存在 USB 驱动程序。 (看起来它们在 Debian 的更高版本中是默认的。)我必须通过添加来添加它们/etc/initramfs-tools/modules
:
uhci_hcd
ehci_hcd
usb_storage
-
一切完成后,更新 initramfs:
update-initramfs -u
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)