Задать вопрос

Как зашифровать диск с установленной Ubuntu 16.04?

Здравствуйте!

Возникла у меня такая мысль - перенести с декстопа ubuntu на нетбук и зашифровать диск во избежании.
С переносом и запуском системы проблем не возникло - работает.
Но вот с шифрованием я немного растерялся. Нашел пару статей, но то ли я не до конца понимаю процесс, то ли это не совсем то что мне нужно.
Статьи:
Мечта параноика или Еще раз о шифровании
Шифрование дисков в Linux
Там описан примерно такой процесс:
Отформатировать диск->зашифровать диск->перенести систему->настроить загрузку с флешки

Из недостатков описанного - загрузка и ключи на отдельной флешке.
Я же хочу чтобы результат был как при установки из коробки с шифрованием - включил нетбук, ввел пароль, система загрузилась, залогинился и вперед.
Как добиться такого результата?
Возможно ли зашифровать диск с установленной системой не форматируя его?
Буду очень благодарен если у вас завалялась ссылка на подобную инструкция или просто подробное описание
  • Вопрос задан
  • 6843 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
nazarpc
@nazarpc
Open Source enthusiast
Внимание: данная инструкция актуальна для Ubuntu 17.04 x64 на UEFI системе.
Внимание №2: если это покажется вам слишком сложным, вы всегда можете переустановить систему, выбрав опцию шифрованной инсталляции в установщике Ubuntu, хотя конфигурация там будет менее "чистой" чем здесь.
Внимание №3: настоятельно рекомендую сначала поставить аналогичную систему в виртуальной машине и провести все нужные операции там, и только убедившись что всё получилось делать что-то с живой системой.
Внимание №4: всегда имейте под рукой загрузочную флэшку с Ubuntu на всякий случай, с её помощью можно творить чудеса:)

У меня всё зашифровано кроме загрузочной флэшки, где grub2, несколько модулей и конфиг что указывает как найти диск что нужно расшифровать.
Не форматируя можно перенести, имея рядом второй диск, иначе я бы сказал что нет, имея второй диск и файловую систему btrfs можно вообще прямо из рабочей системы всё переносить туда/сюда.

В общем и целом я делал так (с BTRFS, ибо намного проще, так же предполагается что у вас UEFI, иначе всё ещё сложнее):
1) sudo cryptsetup -s 512 luksFormat /dev/nvme0n1 - это для nvme SSD, заменяете на свой диск
2) Открываете криптоконтейнер, создаете файловую систему, дальше либо монтируете и переносите файлы, либо просто добавляете к существующей файловой системе этот новый раздел и удаляете старый (команды не привожу, читайте https://wiki.archlinux.org/index.php/Dm-crypt/Encr..., там много примеров, и https://btrfs.wiki.kernel.org/index.php/Main_Page, там тоже всё с примерами есть)
3) Правите /etc/crypttab (создаете если нет), мой пример вот:
system UUID=739967f1-9770-470a-a031-8d8b8bcdb350 none luks,discard,keyscript=/etc/cryptroot/system.64.sh
и /etc/fstab примерно так:
proc                /proc     proc  nodev,noexec,nosuid                   0 0
tmpfs               /tmp      tmpfs defaults                              0 0
/dev/mapper/system  /         btrfs compress=lzo,noatime,ssd,subvol=/root 0 1
UUID=E495-1F0C      /boot/efi vfat  defaults,discard                      0 0

4) Поскольку указать просто файл с ключем для автоматического открытия luks контейнера нельзя ибо он не попадет в образ initramfs и нужно будет вводить пароль дважды (раз в grub для начала загрузки и раз после начала загрузки чтобы разблокировать корневую файловую систему), то нужно писать shell скрипт (/etc/cryptroot/system.64.sh в примере выше), который выведет этот ключ. Для этого генерируем сырые данные для ключа, превращаем данные в base64 чтобы легко было работать с ним в shell скрипте и создаем shell скрипт, потом корректируем права:
sudo mkdir /etc/cryptroot
sudo dd bs=1024 count=4 if=/dev/urandom of=/etc/cryptroot/system
sudo cat /etc/cryptroot/system | base64 | sudo tee /etc/cryptroot/system.64
echo "echo '" | sudo tee /etc/cryptroot/system.64.sh
sudo cat /etc/cryptroot/system.64 | sudo tee --append /etc/cryptroot/system.64.sh
echo "'" | sudo tee --apppend /etc/cryptroot/system.64.sh
sudo chmod 400 /etc/cryptroot/system
sudo chmod 400 /etc/cryptroot/system.64
sudo chmod 500 /etc/cryptroot/system.64.sh

5) Добавляем этот ключ в слот luks контейнера
sudo cryptsetup luksAddKey /dev/nvme0n1 /etc/cryptroot/system.64

6) Помещаем на загрузочную флэшку (gpt таблица, FAT32 раздел с esp флагом) в EFI/ubuntu grubx64.efi, (должен уже там быть), создаем папку x86_64-efi для модулей, ложим туда модули, которые необходимы для открытия luks контейнера (взять их можно в /boot/grub/x86_64-efi):
cryptodisk.mod
gcry_sha256.mod
luks.mod
procfs.mod

7) Конфигурируем grub (копирование модулей и ручное конфигурирование является следствием бага https://bugs.launchpad.net/ubuntu/+source/grub2/+b...). Во-первых добавляем GRUB_ENABLE_CRYPTODISK=y в /etc/default/grub (где-то сразу после GRUB_CMDLINE_LINUX), создаем/правим /boot/efi/EFI/ubuntu/grub со следующим содержимым:
search.fs_uuid E495-1F0C boot
set prefix=($boot)'/EFI/ubuntu'
insmod luks
insmod gcry_sha256
cryptomount -u 739967f19770470aa0318d8b8bcdb350
search.fs_uuid 5170aca4-061a-4c6c-ab00-bd7fc8ae6030 root cryptouuid/739967f19770470aa0318d8b8bcdb350 
set prefix=($root)'/root/boot/grub'
configfile $prefix/grub.cfg

Тут E495-1F0C это ваш ESP раздел на флэшке, 739967f19770470aa0318d8b8bcdb350 это ваш криптоконтейнер, а 5170aca4-061a-4c6c-ab00-bd7fc8ae6030 это корневая файловая система. Данный конфиг использует скопированные ранее модули, пытается открыть luks контейнер и взять оттуда основной конфиг grub для отображения меню и последующей загрузки. Я бы посоветовал сделать копию конфига рядом на всякий случай, если Ubuntu решит перезаписать его нерабочей версией сверху.
8) Делаем chroot в корневую систему из пункта 2) и обновляем grub sudo dpkg-reconfigure grub-efi-amd64 (убедитесь что созданный нами конфиг не был затерт), initramfs sudo update-initramfs -u -k all

Если я ничего не забыл по ходу написания, то после этого можно будет загрузиться в полностью зашифрованную систему. На флэшке будет несколько файлов суммарным размером в 255КиБ, перед отображением меню grub у вас система спросит пароль от luks контейнера, без которого кроме нескольких не конфиденциальных файлов на флэшке всё полностью зашифровано.

P.S. Сорян что получился не краткий ответ, а целая статья, просто у меня были особые требования (та же btrfs), а в интернете куча устаревшего материала, вот и пришлось собирать систему, которая нигде из найденных мною мест целиком описана не была, более того, обнаружились некоторые баги в Ubuntu/grub, обход которых я тоже описал в инструкции.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы