Skip to main content

Пълно криптиране на диска в Debian Linux с LUKS

Потребител от

5 месеца
Написано от valery на

Зимните празници бяха добро време за изпълнение на задачи, които бяха отлагани прекалено дълго. Една от тях беше активирането на пълно дисково криптиране на моя работен лаптоп.

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

Linux Unified Key Setup (linux.com)

Снимка предоставена от 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}/dev

Chroot до криптирания диск

chroot /mnt/${DEVICE_NAME}

Стъпки за изпълнение в chroot-ната среда

  • Ако имате EFI партиция (/boot/efi), монтирайте я: mount /dev/nvmen1p1 /boot/efi (проверете името на устройството с sudo fdisk -l)
  • изпълнете blkid -o value -s UUID /dev/nvmen1p2 и запазете стойността
  • редактирайте /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}

Това трябва да е всичко. Трябва да сте готови за рестартиране в по-сигурна среда.
Наслаждавайте се!