cryptsetup короткая памятка

2018-12-10

Создание крипто-тома с двумя ключами. В первом слоте используется ключевой файл, а в пятом парольная фраза:

# cryptsetup luksFormat /dev/md11 pv11.key
# cryptsetup -d pv11.key luksOpen /dev/md11 pv11
# cryptsetup luksAddKey --key-slot 5 /dev/md11
Enter password: ххххххххххххххх

После применения cryptsetup, для указанного тома (/dev/md11) UUID изменится на новый, а TYPE станет "crypto_LUKS". Например, был том:

# blkid /dev/md11
/dev/md11: UUID="394d0e20-fbbf-11e8-b8b2-272ad0095723" TYPE="ext4"

После применения cryptsetup:

# blkid /dev/md11
/dev/md11: UUID="2c326492-fbbf-11e8-83e1-db657904e51b" TYPE="crypto_LUKS"

поэтому, при необходимости, необходимо поправить те скрипты, где используется том по ссылке /dev/disk/by-uuid/.

Зачистить определённый слот хранения пароля в заголовке:

# cryptsetup -d /etc/cryptsetup-keys/pv11.key luksKillSlot /dev/md11 1

Бэкап заголовка зашифрованного тома:

# cryptsetup luksHeaderBackup --header-backup-file \
md11_$(date +%Y%m%d)_$(blkid -o value | head -n1).header.backup /dev/md11

или бэкап заголовка в ramfs, шифрованием и подписыванием бэкапа ключом gpg, сохранением зашифрованного бэкапа в текущую директорию:

# mkdir ramfs && mount -t ramfs ramfs ramfs && \
cryptsetup luksHeaderBackup --header-backup-file ramfs/tmp.header.backup \
/dev/md11 && gpg -e -s -r srv0_backup_2018 \
-o md11_$(date +%Y%m%d)_$(blkid -o value | head -n1).header.backup.gpg \
ramfs/tmp.header.backup && shred -u ramfs/tmp.header.backup && \
umount ramfs && rmdir ramfs

В заголовке тома хранится информация о параметрах шифрования тома, мастер-ключ (128, 256 или 512 бит), которым шифруются сектора тома, и восемь слотов по 256 байт, для хранения хэшей паролей к мастер-ключу.

Размер заголовка luks тома примерно один мегабайт при длине ключа шифрования 256 бит и около двух мегабайтов при длине ключа 512 бит. Для надёжного уничтожения заголовка, а значит и мастер-ключа, достаточно зачистить первые три мегабайта тома:

# dd if=/dev/urandom of=/dev/md11 bs=1M count=3; sync

или

# head -c 3M /dev/urandom > /dev/md11; sync

Если ранее был сделан бэкап заголовка, то с его помощью можно восстановить всю или часть информации из тома. В этом случае, для надёжной зачистки, нужно применить более продолжительное по времени перезапись всего пространства тома.

Обычно, перед окончанием аренды сервера, я запускаю сервер через rescue-образ, и выполняю для каждого диска:

# dd if=/dev/urandom of=/dev/sda bs=1M status=progress; sync

При недостатке времени на перезапись всех дисков, зачищаю только заголовки зашифрованных томов и всё пространство незашифрованных разделов.