crypttab, udev: Автомонтуєм Шифровані Диски

Насправді це відео. Але в мене були деякі нотатки, а також я подумав, що буде чотко поділитись текстом скриптів, тому тримайте цю сторінку як бонус.

Звісно, для цього нам потрібен зашифрований диск. Зробити такий дуже просто:

cryptsetup luksFormat /dev/sdx

Після цього ми можемо “відкрити” наш новозашифрований диск і створити на ньому файлову систему:

cryptsetup open /dev/sdx dock
mkfs.ext4 /dev/mapper/dock

Детальніше відео про базове шифрування дисків: https://videos.lukesmith.xyz/w/qxMiq53aTieALZwumuxG6G

Pro tip: Перед шифруванням запишіть весь диск потоком з /dev/random, щоб неможливо було зрознути, скільки місця зайнято зашифрованими даними (якщо це звісно не SSD, на SSD такого роду маніпуляції безрезультатні). Також можна створити файл на вже зашифрованому диску, і в цей файл записати /dev/null . Це може бути швидше і матиме приблизно той же результат, бо так весь диск запишеться шифрованими даними.

Монтаж при старті

Відкривши наш шифрований диск та ввівши lsblk -f, побачимо його UUID в зашифрованому та розшифрованому вигляді.

sdx           crypto_LUKS                   22f56a84-1f23-49ef-9be4-29da93630e5b
└─dock        ext4                          7f717c18-72b1-4163-9a79-c3c7443b3bfb    1.2T    26% /media/dock

Перший UUID (самого диску) вставляємо в crypttab у другу колонку:

dock            UUID=22f56a84-1f23-49ef-9be4-29da93630e5b       /etc/dockdrive.key      nofail

Третя колонка—пароль або в нашому випадку ключфайл, яким ми будем відмикати цей диск. Четверта—різні опції, тут вписана nofail, щоб запуск системи не припинявся, якщо цей диск не буде виявлений чи розшифрований. Перша колонка—ім’я, яке буде дане диску після розшифрування.

Ключфайл може бути будь-яким файлом. Я люблю генерувати їх таким чином:

dd if=/dev/random of=/etc/dockdrive.key bs=512 count=4 iflag=fullblock
sudo chmod 600 /etc/dockdrive.key
cryptsetup luksAddKey /dev/sdx /etc/dockdrive.key

Але простіше просто ввести в /etc/crypttab пароль до диску замість шляху до файлу.

Якщо ключфайл/пароль зберігається на незашифрованому диску, то в такому шифруванні нема змісту! Щоб зашифрувати свій системний диск можете керуватись цією інструкцією (а для повного шифрування диску—цією) або глянути відео.

Коли наш crypttab спрацьовує, з’являється мапування /dev/mapper/dock з UUID 7f717c18-72b1-4163-9a79-c3c7443b3bfb, і вже за цим UUID ми можем монтувати диск у /etc/fstab:

UUID=7f717c18-72b1-4163-9a79-c3c7443b3bfb	/media/dock	ext4	auto,nofail,noatime,rw,user	0 0

Udev

Для автомонтажу при під’єднанні можна прописати такі правила:

/etc/udev/rules.d/luksmount.rules:

ACTION=="add", ENV{ID_FS_TYPE}=="crypto_LUKS", ENV{ID_FS_UUID}=="22f56a84-1f23-49ef-9be4-29da93630e5b", RUN+="/home/sasha/.local/bin/cryptmount %E{ID_FS_UUID} dock"

/home/sasha/.local/bin/cryptmount:

#!/bin/sh

uuid="$1"
cryptid="$2"
cryptpath="/dev/mapper/$cryptid"
mountpoint="/media/$cryptid"
keyfile="/etc/dockdrive.key"

if [ -e "$cryptpath" ]; then
    echo "$cryptpath already exists, skipping unlock."
else
    sudo cryptsetup open "/dev/disk/by-uuid/$uuid" --key-file "$keyfile" "$cryptid"
fi

if [ -e "$cryptpath" ]; then
	sudo mount "$cryptpath" "$mountpoint" && exit 0
fi

echo "Failed to mount $cryptpath" >&2
exit 1

/etc/udev/rules.d/luksumount.rules:

ACTION=="remove", ENV{ID_FS_TYPE}=="crypto_LUKS", ENV{ID_FS_UUID}=="22f56a84-1f23-49ef-9be4-29da93630e5b", RUN+="/home/sasha/.local/bin/cryptumount dock"

/home/sasha/.local/bin/cryptumount:

#!/bin/sh

mountpoint="/media/dock"

lsblkoutput="$(lsblk -nrpo "name,type,size,mountpoint")"
cryptid="$(echo "$lsblkoutput" | grep "/${mountpoint#*/}$")"
cryptid="${cryptid%% *}"
cryptid="dock"
cryptpath="/dev/mapper/$cryptid"

sudo umount "$mountpoint"

if [ -e "$cryptpath" ]; then
	sudo cryptsetup close "$cryptid"
fi