cryptsetup
pode usar uma frase secreta do terminal e um arquivo. Eu tenho (não com o Debian, no entanto) um pequeno volume LUKS que contém um arquivo. Os outros volumes têm dois slots: um para a frase secreta e outro para o arquivo com conteúdo aleatório (que não precisa de iterações).
Eu tenho um script que desbloqueia o primeiro volume com uma frase secreta, desbloqueia os outros usando o arquivo e desmonta o volume e fecha o dispositivo crypt DM.
meu script (alemão)
#!/bin/bash
vg="storage2"
disk_id="scsi-SATA_WDC_WD5000BPVT-2_WD-WXF1A90J2616"
keyfile="/mnt/crypto-pw/keyfile"
program_name="mount_crypto"
yes_char=j
no_char=n
wait_seconds=3
_exit_ () {
if [ $# -eq 0 ]
then
ec=1
elif [ $# -eq 1 ]
then
ec=$1
if ! [[ $ec =~ ^[0-9]$ ]] || [[ $ec =~ ^[1-9][0-9]+$ ]]
then
echo "Fehler beim Aufruf von _exit_()" >&2
exit 100
fi
else # [ $# -gt 1 ]
message="$2"
fi
if [ -n "$message" ]
then
echo "$message" >&2
logger -t "$program_name" "$message"
fi
if grep -q /dev/mapper/cryptopw /proc/mounts
then
echo "Aushängen von /mnt/crypto-pw" >&2
if ! umount /mnt/crypto-pw &>/dev/null
then
echo "Fehler beim Aushängen"
cryptsetup luksClose cryptopw &>/dev/null
fi
fi
if [ -b /dev/mapper/cryptopw ]
then
echo "Löschen von /dev/mapper/cryptopw"
cryptsetup luksClose cryptopw || echo "Fehler"
fi
sleep "$wait_seconds"
exit $ec
}
if ! [ "/dev/sda" = "$(readlink -f /dev/disk/by-id/${disk_id})" ]; then
echo "Problem mit den Platten bzw. deren Erkennungsreihenfolge:"
echo "/dev/sda ist nicht scsi-SATA_WDC_WD5000BPVT-_WD-WXF1A90J2616; Abbruch."
exit 1
fi
echo "[${program_name}]"
echo -n "Sollen die Kryptolaufwerke eingebunden werden? (${yes_char}/${no_char}) "
read antwort
while [ "${no_char}" != "$antwort" -a "${yes_char}" != "$antwort" -a -n "$antwort" ] # leeres $antwort ist auch OK - Abbruch mit ^C
do
echo
echo
antwort=
echo "Falsche Antwort. Zulässig sind nur ${yes_char} und ${no_char}."
echo -n "Sollen die Kryptolaufwerke eingebunden werden? (${yes_char}/${no_char}) "
read antwort
done
if [ "${yes_char}" != "$antwort" ]
then
_exit_ 0 "${program_name} vom Benutzer abgebrochen."
fi
echo
echo "=== cryptopw öffnen und einbinden"
cryptsetup luksOpen /dev/${vg}/crypto-pw cryptopw || _exit_ 10 "cryptopw konnte nicht geöffnet werden"
mount -t ext4 -o ro,acl /dev/mapper/cryptopw /mnt/crypto-pw || _exit_ 11 "cryptopw konnte nicht eingebunden werden"
test -f "$keyfile" || _exit_ 12 "keyfile nicht vorhanden; Abbruch"
echo
echo "=== crypto öffnen und einbinden"
if ! [ -b /dev/mapper/crypto ]
then
cryptsetup --key-file "$keyfile" luksOpen /dev/${vg}/crypto crypto || _exit_ 13 "crypto konnte nicht geöffnet werden; Abbruch"
else
echo "crypto blockdev existiert bereits."
fi
if ! grep -q "^/dev/mapper/crypto " /proc/mounts
then
mount -t ext4 -o acl,user_xattr,mand,nosuid,nodev /dev/mapper/crypto /crypto || _exit_ 14 "crypto konnte nicht eingebunden werden"
else
echo "/crypto ist schon gemountet."
fi
echo
echo "=== backup öffnen und einbinden"
if ! [ -b /dev/mapper/backup ]
then
cryptsetup --key-file "$keyfile" luksOpen /dev/sda3 backup || _exit_ 15 "backup konnte nicht geöffnet werden; Abbruch"
else
echo "backup blockdev existiert bereits."
fi
if ! grep -q "^/dev/mapper/backup " /proc/mounts
then
mount -t ext4 -o acl,user_xattr,mand,nosuid,nodev /dev/mapper/backup /backup || _exit_ 16 "backup konnte nicht eingebunden werden"
else
echo "/backup ist schon gemountet."
fi
echo
echo "Diese Laufwerke sind im Moment gemountet (mit ext[234]):"
mount | grep ext[234]
echo
_exit_ 0