Включение шифрования разделов в работающей системе

Материал из ALT Linux Wiki

Постановка задачи

Пусть у нас есть некоторая, заранее настроенная и эксплуатируемая система под управлением Alt Linux - рабочая станция, ноутбук или сервер, и мы приняли решение зашифровать некоторые разделы с данными. Схема применения - защита от утери компьютерного железа в выключенном состоянии, чтобы атакующий не смог считать критические данные, не зная ключа расшифрования. Это может быть актуально для ноутбуков.

Это достаточно просто реализовать! В Alt Linux p10 есть все необходимые компоненты, осталось грамотно их настроить. Другие версии нашей ОС пока не проверялись, но предполагаю, что также это будет работать на p9 и p8, поскольку схема применения достаточно древняя.

Схема решения

Live-система

Следует скачать систему в режиме Live-CD на флешку/DVD. Операции преобразования будут совершаться из этой системы. Желательно использовать флешку с той же версией ОС, что установлена на целевой системе.

Бекапим данные

Операции с дисковыми разделами требуют аккуратности. Если сомневаетесь в себе - лучше сделайте полный образ всех дисков системы, чтобы при ошибке восстановить систему обратно.

Решение на коленке

Загрузиться с Live-CD/USB Для каждого носителя в системе выполнить:

pv /dev/sdX > /run/media/altlinux/мой_большой_внешний_usb_HDD_на_пару_терабайт/image_sdX.bin

Это будет долго. Это сделает побайтовые снимки всех данных со всем мусором. По желанию образы можно сжать потоковым архиватором (gzip -1), но это будет ещё дольше. К тому же сырые образы можно монтировать, losetup с опцией -P позволяет сканировать таблицу разделов из образа диска.

Для восстановления данных следует загрузиться с Live-СD и выполнить для всех дисков обратную операцию:

pv /run/media/altlinux/мой_большой_внешний_usb_HDD_на_пару_терабайт/image_sdX.bin > /dev/sdX

Старая система загрузится. При этом однако же для всех разделов EXT4 на SSD выполнить fstrim, поскольку при копировании таким методом вычищенные страницы неотличимы от заполненных нулями. Вообще следует учитывать особенности контроллера SSD диска, возможно некоторые современные версии воспримут нули правильно, как пустые страницы.

Планируем схему применения

Загрузиться с Live-USB/DVD. Открыть редактор разделов - графический gparted / mate-disk-utility / gnome-disks или в командной строке fdisk -l. Посмотреть структуру разделов в системе и решить, что подлежит шифрованию.

В случае рабочей станции следует шифровать папку /home. В случае сервера возможно разумно шифровать папку /var. Также если используется раздел подкачки, он тоже подлежит шифрованию - чувствительные данные из памяти программы могут попасть в подкачку и остаться там при выключении системы. Будем описывать вынос /home на отдельный шифрованый раздел, с /var и другими папками можно поступить по тому же алгоритму.

Вынос /home в отдельный раздел

Папка "/home" во многих конфигурациях находится в общем разделе с корневой ФС "/". Следует скопировать её данные куда-то, например - на внешний носитель. Возможно целесообразно зашифровать временно сохраняемые данные спомощью gpg, используя команды:

cd /home
tar -cvv ./ | gzip -1 | gpg -c >  /run/media/altlinux/съёмный_носитель/home.gz.gpg

Также следует озаботиться судьбой данных, оставшихся после удаления исходной папки. См. раздел "удаление чувствительных данных".

Изменение разделов, копирование данных

В корневом разделе освободились данные - можно сократить его размер и создать дополнительный раздел "ehome", в котором будет храниться зашифрованная домашняя папка. Удобнее всего это сделать утилитой gnome-disks, в ней же есть опция создания зашифрованного раздела с файловой системой ext4. Можно воспользоваться утилитой gparted (текстовая версия parted), а после этого создать прослойку шифрования командой

cryptsetup luksFormat /dev/sdX\d.

и подключить раздел командой

cryptsetup luksOpen /dev/sdX\d ehome
mkdir /ehome
mount /dev/mapper/ehome /ehome

Следует скопировать обратно данные из резервной копии:

cd /ehome
cat /run/media/altlinux/съёмный_носитель/home.gz.gpg | gpg | zcat | tar -xvv

Теперь следует отключить и закрыть новый шифрованый раздел

umount /ehome
sync
cryptsetup close ehome
sync

Настройка монтирования

Подключить корень целевой системы в /system. Перейти в режим chroot.

mkdir /system
mount /dev/sdX<кореневой раздел> /system
cd /system
for n in proc sys dev
do
mount -o bind /$n ./$n
done
chroot .

Отредактировать (создать заново) /etc/crypttab. Добавить туда строки:

ehome /dev/disk/by-id/ata-{МОДЕЛЬ}_{СЕРИЙНЫЙ НОМЕР}-partX none
eswap /dev/disk/by-id/ata-{МОДЕЛЬ}_{СЕРИЙНЫЙ НОМЕР}-partY /dev/random swap

Отредактировать /etc/fstab. Удалить (закомментировать через #) старую запись для swap. Создать новую запись:

/dev/mapper/eswap	swap swap defaults 0 0
/dev/mapper/ehome	/home	ext4	relatime,nosuid	1	2

Но если сейчас перезагрузиться, система не запустится.

Особенности настройки swap

"Из коробки" ОС Alt Linux настроена на гибернацию и восстановление из образа, записываемого в swap-раздел. То, как мы только что настроили swap в /etc/crypttab, предполагает шифрование случайным ключом при каждой загрузке. После выключения питания ключ теряется, и данные в swap становятся недоступными.

Эта конфигурация несовместима с гибернацией. Следует её отключить. Для этого следует отредактировать файл /etc/default/grub: В строке

GRUB_CMDLINE_LINUX_DEFAULT='resume=/dev/disk/by-uuid/xxxxxxxx-yyyy-zzzz-wwww-qqqqqqqqqqqq panic=30 usbcore.autosuspend=-1 quiet splash'

Удалить resume= запись, тем самым отключив восстановление после гибернации. Должно получиться:

GRUB_CMDLINE_LINUX_DEFAULT='panic=30 usbcore.autosuspend=-1 quiet splash'

Теперь достаточно вызвать

update-grub

Также следует на всякий случай почистить swap-раздел, перезаписав его случайными данными:

pv /dev/urandom > /dev/disk/by-id/ata-{МОДЕЛЬ}_{СЕРИЙНЫЙ НОМЕР}-partY
blkdiscard /dev/disk/by-id/ata-{МОДЕЛЬ}_{СЕРИЙНЫЙ НОМЕР}-partY

Перезагрузка

Всё настроено - целевая система должна загрузиться. Если система графическая - при запуске перед входом в систему (перед запуском lightdm) будет возникать окно ввода пароля для расшифровки раздела /home. В случае сервера - приглашение ввести пароль будет выведено в текстовом режиме на основном терминале.


Удаление чувствительных данных

Шифрование бессмысленно, если исходные чувствительные данные останутся в секторах файловой системы, откуда они были взяты. На классических HDD данные остаются в секторах после удаления файлов. При удалении данных на SSD страницы помечаются как очищенные (expunged), при обращении к ним возвращаются нули. Сами данные при этом остаются на микросхеме, недоступные при использовании стандартного API контроллера. Что с ними происходит на самом деле - неизвестно и явно сильно зависит от модели контроллера и типа памяти.


Первый, самый простой вариант - использовать утилиту shred. Она перезаписывает содержимое файла несколько раз и удаляет его после. Есть проблема - насколько мне известно, полностью это работает только в очень простых файловых системах семейства fat. Насколько мне известно, к файловой системе ext4 со стандартными параметрами монтирования это тоже применимо. Есть бесконечное число тонкостей, связанное с тем, что в сложных файловых системах (в том же ext4 с дополнительными настройками журналирования, в f2fs) новые данные могут быть записаны в другое место, а старые данные где-то останутся.

Второй вариант - удалить все файлы и исполнить в подлежащей очистке в файловой системе с правами пользователя root команду:

pv /dev/urandom > random.bin; sync; rm random.bin; sync

Это запишет всё доступное пространство случайными данными. Даже у SSD будет меньше шансов сохранить в себе информацию - требование сохрянять сигнал, неотличимый от шума, вынуждает очищать все доступные ресурсы и записывать наши случайные данные. Можно повторить эту операцию несколько раз. Теоретически какие-то данные при этом могут остаться, но на это гораздо меньше шансов.