Eu estou executando o Debian Jessie. Eu tenho 2 discos rígidos com minhas várias partições espalhadas por ambos (não RAID). Ambos são criptografados separadamente pelo LUKS, e os LVMs se baseiam em ambos. Minha partição /boot
é a única partição não incluída nos dois discos rígidos; em vez disso, ele está localizado em um pendrive não criptografado. Na partição /boot
está myKeyfile.key
, que deve desbloquear ambos os discos rígidos [mas não]. Meu objetivo é ter discos totalmente inacessíveis / inúteis sempre que o sistema inicializar sem o pendrive.
Aqui está o que eu fiz para conseguir isso. Eu usei esta resposta no StackOverflow como um guia.
/etc/default/cryptdisks
# Mountpoints to mount, before cryptsetup is invoked at initscripts. Takes
# mountpoints which are configured in /etc/fstab/ as arguments. Separate
# mountpoints by space.
# original: CRYPTDISKS_MOUNT=""
CRYPTDISKS_MOUNT=/boot
De acordo com o comentário, eu só tenho que ter certeza de que tenho o nome apropriado do ponto de montagem, conforme descrito em fstab
. Para completar, aqui está a linha relevante:
/etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=<usb uuid> /boot ext4 defaults 0 2
/etc/crypttab
sda1_crypt UUID=<disk uuid> /boot/myKeyfile.key luks,keyscript=/bin/passphrase-from-usb
sda2_crypt UUID=<disk uuid> /boot/myKeyfile.key luks,keyscript=/bin/passphrase-from-usb
Eu poderia especificar o UUID da unidade USB (em vez de /boot/myKeyfile.key
), mas não sei como especificaria que myKeyfile.key
é o arquivo em que estou interessado.
/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
/bin/passphrase-from-usb
#!/bin/sh
set -e
if ! [ -e "$CRYPTTAB_KEY" ]; then
echo "Waiting for USB stick to be recognized..." >&2
sleep 5
fi
if [ -e "$CRYPTTAB_KEY" ]; then
echo "Unlocking the disk $CRYPTTAB_SOURCE ($CRYPTTAB_NAME) from USB key" >&2
echo "Using $CRYPTTAB_KEY as the key source" >&2
dd if="$CRYPTTAB_KEY" bs=1 count=256 2>/dev/null
exit
else
echo "Can't find $CRYPTTAB_KEY; USB stick not present." >&2
fi
/lib/cryptsetup/askpass "Manually unlock the disk ($CRYPTTAB_NAME)\nEnter passphrase: "
É com isso que sou saudado na inicialização:
Loading, please wait...
Volume group "vg-root" not found
Skipping volume group vg-root
Unable to find LVM volume vg-root/lv-root
Volume group "vg-other" not found
Skipping volume group vg-other
Unable to find LVM volume vg-other/lv-swap
Waiting for USB stick to be recognized...
[ 3.159979] sd 7:0:0:0: [sdd] No Caching mode page found
[ 3.160152] sd 7:0:0:0: [sdd] Assuming drive cache: write through
Can't find /boot/myKeyfile.key; USB stick not present.
Manually unlock the disk (sda1_crypt)
Enter passphrase:
Depois de inserir a frase secreta, a mesma troca acontece para o segundo disco, sdb1_crypt
.
Estou fazendo algo errado, mas não tenho certeza do que. Como CRYPTDISKS_MOUNT
"especifica os pontos de montagem montados antes de os cryptdisks serem invocados", achei que adicionar /boot
a ele tornaria /boot
disponível antes do início do procedimento de desbloqueio. No entanto, ele não parece estar montado quando /bin/passphrase-from-usb
é executado.
Tenho certeza de que myKeyfile.key
é adicionado como uma chave LUKS às duas unidades e atualizei o initramfs
via update-initramfs -u
.