Один из лучших способов сделать это - использовать смарт-карту с криптографическим ключом на ней, чтобы разблокировать ключи для ваших зашифрованных блочных устройств. Вам нужно будет только один раз ввести кодовую фразу (называемую инструментами «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
, но он ничего не знает о keycript
, что приводит к большой FAIL. К счастью, в Debian вы все еще можете отказаться от systemd
. Установите этот верхний скрипт исправления как / etc / initramfs-tools / hooks / yubipin
, потому что встроенная функция не установила достаточно поддержки, чтобы Yubikey можно было использовать из initramfs. Возможно, вам придется отрегулировать это.
#! / Bin / sh
PREREQ = cryptroot
prereqs ()
{
echo "$ PREREQ "
}
case $ 1 in
prereqs)
prereqs
exit 0
;; {{1 }} esac
# / scripts / local-top / cryptopensc вызывает pcscd с неправильным путем
ln -s ../usr/sbin/pcscd $ {DESTDIR} / sbin / pcscd
mkdir -p "$ {DESTDIR} / usr / lib / x86_64-linux-gnu"
# opensc-tool требует это динамически, copy_exec не знает, что
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 "
# без этого pcscd прерывается с ошибкой pthread_cancel
cp -pL /lib/x86_64-linux-gnu/libgcc_s.so.1 "$ {DESTDIR} /lib/x86_64-linux-gnu/libgcc_s.so.1"
# это копируется как висящая символическая ссылка, исправьте это
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 "
# p cscd это необходимо, чтобы открыть программу чтения, как только она ее обнаружит
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 {1 }}
set -e
PREREQ = cryptopensc
prereqs ()
{
echo "$ PREREQ "
}
case $ 1 in
prereqs)
prereqs
exit 0
;; {{ 1}} esac
# потому что cryptopensc не делает это должным образом
killall pcscd