Answers:
最好的方法之一是使用带有加密密钥的智能卡来解锁加密块设备的密钥。您只需输入一次密码(在工具中称为“ PIN”,但这实际上是密码),之后将被缓存。这样具有的额外优势是,您可以使用自己拥有的东西(智能卡本身无法从中提取私钥)和您自己知道的东西(密码)来保护加密的数据。
/etc/crypttab
像这样格式化您的:
mapper-name /dev/disk/raw-device /var/lib/filename-containing-encrypted-key \
luks,keyscript=/lib/cryptsetup/scripts/decrypt_opensc
在Debian和衍生产品中,initramfs-tools将注意到关键字,并将用于访问智能卡的所有必要工具和守护程序自动复制到initramfs。
有关设置智能卡和创建(和加密)密钥的信息,请参见/usr/share/doc/cryptsetup/README.opensc.gz
。
为此,您可以使用Yubikey 4或Yubikey NEO。
实施注意事项:此功能具有粗糙的边缘,显然不能立即使用,因此YMMV。上一次成功实现此目标时,我不得不添加以下技巧:
systemd
因为它灾难性地尝试从中接管设置加密设备的整个过程,/etc/crypttab
但不知道是什么keyscript
导致了很大的失败。幸运的是,在Debian中,您仍然可以选择退出systemd
。安装此fixer-upper脚本是/etc/initramfs-tools/hooks/yubipin
因为内置功能未安装足够的支持,无法从initramfs中使Yubikey可用。您可能需要对此进行调整。
#!/bin/sh
PREREQ=cryptroot
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
# /scripts/local-top/cryptopensc calls pcscd with the wrong path
ln -s ../usr/sbin/pcscd ${DESTDIR}/sbin/pcscd
mkdir -p "${DESTDIR}/usr/lib/x86_64-linux-gnu"
# opensc-tool wants this dynamically, copy_exec doesn't know that
cp -pL /usr/lib/x86_64-linux-gnu/libpcsclite.so.1 "${DESTDIR}/usr/lib/x86_64-linux-gnu/libpcsclite.so.1"
mkdir -p "${DESTDIR}/lib/x86_64-linux-gnu"
# without this, pcscd aborts with a pthread_cancel error
cp -pL /lib/x86_64-linux-gnu/libgcc_s.so.1 "${DESTDIR}/lib/x86_64-linux-gnu/libgcc_s.so.1"
# this gets copied as a dangling symlink, fix it
rm "${DESTDIR}/usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist"
cp -pL /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist "${DESTDIR}/usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist"
# pcscd needs this to open the reader once it has found it
cp -pL /lib/x86_64-linux-gnu/libusb-1.0.so.0 "${DESTDIR}/lib/x86_64-linux-gnu/libusb-1.0.so.0"
安装另一个脚本/etc/initramfs-tools/scripts/local-bottom/killpcscd
进行清理:
#!/bin/sh
set -e
PREREQ=cryptopensc
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
# because cryptopensc does not do it properly
killall pcscd
可以将luks密码简单地存储在文件中。
我在家用计算机上使用它;根文件系统位于常规的luks卷上,该卷在启动时用密码解锁。另一个驱动器包含带有生成密码的luks卷。
此附加卷由位于加密的根文件系统上的密码文件解锁。如果根文件系统已解锁,则它将在引导过程中自动解锁。
我的/etc/crypttab
样子是这样的:
crypt-root UUID=c5a2cf25-0aae-457e-874f-fca7ea3d5742 none luks
crypt-data UUID=96d79323-246d-49e0-9149-ec3a4cfc1c1e /etc/crypt-data.key luks
第三个字段是密钥none
文件,/etc/crypt-data.key
用于根文件系统,但用于数据文件系统。/etc/crypt-data.key
包含luks密码:
Tm90IHJlYWxseSBteSBwYXNzd29yZC4K
注意,换行符或任何其他空格将作为密码的一部分!注意生成此文件时不要尾随换行符。另外,请确保它具有严格的权限:
-rw------- 1 root root 59 Sep 14 23:57 /etc/crypt-data.key
您应该能够对多个卷重复此方法(您可以选择使用不同的密码或一个共享密码)。
/etc/crypttab
。我添加了一些额外的文字,使内容更清晰。