Зимние каникулы были отличным временем, чтобы завершить дела, которые были отложены на слишком долгое время. Одним из них было включение полного шифрования диска на моем рабочем ноутбуке.
Я использую Debian Linux, поэтому LUKS (Linux Unified Key Setup) был очевидным выбором.

Изображение предоставлено Linux.com
Самый простой способ включить полное шифрование диска — (конечно) во время переустановки системы, но я потратил слишком много времени на создание комфортной рабочей среды, поэтому попробовал (и успешно - спойлер!) зашифровать существующую систему.
Процесс в значительной степени основывался на отличной статье Уильяма Деспортеса, но поскольку мой опыт был немного другим, я решил опубликовать его здесь.
Перед началом
- Не используйте luksipc (конвертер LUKS на месте) — это устаревший инструмент, и даже его автор рекомендует использовать cryptsetup (входит в пакет с таким же названием), как указано в последней версии README пакета.
- Сделайте резервные копии важных файлов перед началом (это очевидно, но никогда не помешает напомнить).
Подготовка целевого устройства
Установите необходимые пакеты:
sudo apt install cryptsetup cryptsetup-initramfsДобавьте следующую строку в /etc/default/grub:
GRUB_ENABLE_CRYPTODISK=yПодготовьте загрузочное устройство
Я взял версию Xfce из репозитория Debian Live, но вы можете взять любой другой современный образ Live CD (вы можете использовать Ubuntu Live CD для шифрования Debian или наоборот, а также использовать образ, основанный на RedHat)
Подготовьте скрипт шифрования
Сохраните следующий скрипт как encryptdrive.sh на другой USB-накопитель (образ Live обычно только для чтения), чтобы избежать необходимости набирать его в Debian Live:
#!/bin/bash
set -euo pipefail
# Раскомментируйте для отладки/проверки команды
#set -x
# Зашифруйте существующий раздел с LUKS2 на Debian 12
# ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК И ДЕЛАЙТЕ РЕЗЕРВНЫЕ КОПИИ
# Сделано для личного использования и практически без проверки ошибок!!
# Основано на инструкциях из:
# https://wiki.archlinux.org/index.php/dm-crypt/Device_encryption#Encrypt_an_existing_unencrypted_filesystem
DISK="${1:-}"
if [ -z "$DISK" ]; then
echo "Использование: $ /dev/sdXY"
exit 1
fi
# Проверьте файловую систему
e2fsck -f "$DISK"
# Сделайте файловую систему немного меньше, чтобы освободить место для заголовка LUKS
BLOCK_SIZE=`dumpe2fs -h $DISK | grep "Block size" | cut -d ':' -f 2 | tr -d ' '`
BLOCK_COUNT=`dumpe2fs -h $DISK | grep "Block count" | cut -d ':' -f 2 | tr -d ' '`
SPACE_TO_FREE=$((1024 * 1024 * 32)) # 16МБ должно хватить, но добавьте запас
NEW_BLOCK_COUNT=$(($BLOCK_COUNT - $SPACE_TO_FREE / $BLOCK_SIZE))
resize2fs -p "$DISK" "$NEW_BLOCK_COUNT"
# Запустите процесс шифрования
# MAN: https://man7.org/linux/man-pages/man8/cryptsetup-reencrypt.8.html
cryptsetup reencrypt --encrypt --reduce-device-size 16M "$DISK"
# Измените размер файловой системы, чтобы заполнить оставшееся пространство (т.е. удалите запас)
cryptsetup open "$DISK" recrypt
resize2fs /dev/mapper/recrypt
cryptsetup close recrypt
# Не забудьте обновить /etc/crypttab и /etc/fstab, если необходимо!
#
# Например:
# /etc/crypttab
# crypt_root UUID=xxx none luks
# /etc/fstab
# /dev/mapper/crypt_root / ext4 errors=remount-ro 1
#
# Не забудьте выполнить "update-initramfs -u -k all" после обновления rootfs crypttabТеперь загрузитесь, используя подготовленное устройство в live Debian, чтобы пропустить монтирование вашей основной файловой системы(й)
Шаги, которые нужно выполнить при загрузке в Debian Live
Найдите разделы, которые вы хотите зашифровать:
sudo fdisk -lНа более новых ноутбуках с SSD имена дисков будут чем-то вроде /dev/nvme, на более старых - /dev/sda, /dev/sdb и т.д.
Начните шифрование с encrypdrive.sh, сохраненного ранее
Для меня это был /dev/nvmen1p2 (/dev/nvmen1p1 зарезервирован для раздела EFI). С этого момента предположим, что это также ваш случай. Если ваш основной раздел другой, просто замените имя устройства соответствующим образом)
sudo /bin/bash encryptdrive.sh /dev/nvmen1p2Это займет некоторое время в зависимости от скорости вашей системы и размера диска
Важно: преобразовать диск в формат LUKS1
GRUB не поддерживает формат LUKS2 достаточно хорошо, поэтому лучше придерживаться более безопасной версии.
Эти операции намного быстрее самого шифрования, так как они изменяют только заголовок шифрования.
sudo cryptsetup luksConvertKey --pbkdf pbkdf2 /dev/nvmen1p2
sudo cryptsetup convert --type luks1 /dev/nvmen1p2Настройте параметры загрузки на зашифрованном диске:
export DEVICE_NAME="root_crypt"
cryptsetup open /dev/nvmen1p2 ${DEVICE_NAME}
mkdir /mnt/${DEVICE_NAME}
mount /dev/mapper/${DEVICE_NAME} /mnt/${DEVICE_NAME}
mount -t proc none /mnt/${DEVICE_NAME}/proc
mount -t sysfs none /mnt/${DEVIC-bind /dev /mnt/${DEVICE_NAME}/devChroot на зашифрованный диск
chroot /mnt/${DEVICE_NAME}Шаги, которые нужно выполнить в окружении chroot
- Если у вас есть раздел EFI (/boot/efi), смонтируйте его:
mount /dev/nvmen1p1 /boot/efi(проверьте имя устройства с помощьюsudo fdisk -l - выполните
blkid -o value -s UUID2 и сохраните значение/dev/nvmen1p - отредактируйте
/etc/crypttabи добавьте следующую строку:root_crypt UUID=<значение blkid> none luks- Пример:
root_crypt UUID=24bfb42b-007d-4777-9889-46d3e016e60b none luks
- Пример:
- Переустановите grub
sudo grub-install /dev/nvme(Как и Уильям, я не уверен, что этот шаг необходим) - Обновите initramfs:
sudo update-initramfs -k all -u - Обновите загрузчик с помощью
sudo update-grub - Выйдите из chroot с помощью
exit
Окончательная очистка
sudo umount /mnt/${DEVICE_NAME}/proc
sudo umount /mnt/${DEVICE_NAME}/sys
sudo umount /mnt/${DEVICE_NAME}/dev
sudo umount /mnt/${DEVICE_NAME}/boot/efi
sudo umount /mnt/${DEVICE_NAME}
sudo cryptsetup close ${DEVICE_NAME}
sudo rmdir -v /mnt/${DEVICE_NAME}На этом все. Вы должны быть готовы перезагрузиться в более безопасной среде.
Приятного использования!