Uma das melhores maneiras de fazer isso é usar um cartão inteligente com uma chave criptografada para desbloquear as chaves dos seus dispositivos de bloco criptografados. Você só precisará digitar a senha (chamada de "PIN" pelas ferramentas, mas é realmente uma frase secreta) uma vez, após a qual ela será armazenada em cache. Isso tem a vantagem adicional de proteger os dados criptografados com algo que você tem (o cartão inteligente em si, do qual a chave privada não pode ser extraída) e algo que você conhece (a frase secreta).
Formate seu /etc/crypttab
assim:
mapper-name /dev/disk/raw-device /var/lib/filename-containing-encrypted-key \
luks,keyscript=/lib/cryptsetup/scripts/decrypt_opensc
No Debian e derivados, o initramfs-tools irá notar o keycript e copiar todas as ferramentas e daemons necessários para acessar o smart card no initramfs automaticamente.
Informações sobre como configurar o cartão inteligente e criar (e criptografar) as chaves são encontradas em /usr/share/doc/cryptsetup/README.opensc.gz
.
Você pode usar um Yubikey 4 ou Yubikey NEO entre outros para este propósito.
Notas de implementação : Este recurso tem arestas e aparentemente não funciona fora da caixa, então YMMV. A última vez que consegui, tive que adicionar os seguintes hacks:
- Desative
systemd
porque ele desastrosamente tenta assumir todo o processo de configuração de dispositivos criptografados a partir de/etc/crypttab
, mas não sabe nada sobrekeyscript
, o que leva a uma grande FALHA. Felizmente, no Debian, você ainda pode optar por sair dosystemd
. -
Instale este script de fixador superior como
/etc/initramfs-tools/hooks/yubipin
porque o recurso interno não instalou suporte suficiente para obter o Yubikey a ser utilizável do initramfs. Você pode precisar ajustar isso.#!/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"
-
Instale outro script como
/etc/initramfs-tools/scripts/local-bottom/killpcscd
para limpar:#!/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