Зимните празници бяха добро време за изпълнение на задачи, които бяха отлагани прекалено дълго. Една от тях беше активирането на пълно дисково криптиране на моя работен лаптоп.
Използвам Debian Linux, така че LUKS (Linux Unified Key Setup) беше очевидният избор.

Снимка предоставена от Linux.com
Най-лесният начин за включване на пълно дисково криптиране е (очевидно) по време на преинсталация на системата, но прекарах прекалено много време в изграждане на комфортна работна среда, затова опитах (и успях - предупреждение!) да криптирам съществуваща система.
Процесът беше предимно базиран на отличната публикация на Уилям Деспортес, но тъй като моят опит беше малко по-различен, реших да го публикувам тук.
Преди да продължите
- Не използвайте luksipc (LUKS в преобразуване на място) - това е остарял инструмент, и дори неговият автор препоръчва използването на cryptsetup (част от пакета със същото име) в последната версия на ръководството на пакета
- Архивирайте важните файлове преди да продължите (това е очевидно, но никога не вреди да се повтори)
Подготовка на целевата машина
Инсталирайте необходимите пакети:
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
# Разкоментирайте, за да видите/debug командите
#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 "Usage: $ /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)) # 16MB трябва да са достатъчни, но добавете резерв
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Сега стартирайте с помощта на подготвеното устройство, за да избегнете монтирането на основната ви файлова система(и)
Стъпки за изпълнение при стартиране в 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=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 - Обновете зареждащия loader с
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}Това трябва да е всичко. Трябва да сте готови за рестартиране в по-сигурна среда.
Наслаждавайте се!