1. Резервное копирование

1. Резервное копирование

Моя компания работает над внедрением некоторых систем Ubuntu в несколько своих новых тестовых проектов, и мне поручили разработать для них решение по шифрованию. Так как я был в основном пользователем Windows с лишь практическими знаниями Ubuntu и Linux/Unix в целом, это было немного сложно, но интригующе. Я знаю, что многие службы шифрования на месте работают с Windows, но заметил отсутствие таковых для Ubuntu и, прочитав более 20 сообщений об этом здесь, решил, что новая установка с полным шифрованием диска — единственный реалистичный вариант. При этом некоторые системы уже использовались и не могли быть просто стерты и заново установлены с шифрованием. Мне нужно было бы скопировать/сделать резервную копию ВСЕХ настроек и изменений, а также существующих файлов. Поэтому это не так просто, как копирование в /home. Мне было интересно, какой курс действий будет для меня лучшим, у меня есть полная копия раздела (использовал gparted для быстрого копирования на внешний диск) для моей тестовой машины и новая установка Ubuntu с LUKS. Я знаком с основами Clonezilla, но, насколько я понимаю, не думаю, что это мне поможет.

tldr: Мне нужно перенести полную установку Ubuntu 16.04 на зашифрованный диск. На некоторых машинах будет включен TPM, а на некоторых — нет, мне нужно знать наилучший план действий для каждого из них. Спасибо за помощь новому администратору.

БОНУС, если вы сможете описать способ, который не требует внешнего сетевого доступа, но и не является обязательным. То есть, если нужен пакет, я могу загрузить его на тестовый ПК на USB/CD/DVD и установить пакет офлайн.

решение1

Ниже описана процедура, которую я успешно использовал несколько раз. Она работает для Ubuntu 16.04 и 18.04. В отличие от решения, предложенного @Arno в их ответе, она не требует ручного редактирования параметров загрузки ядра. Вместо этого она полагается на update-grubгенерацию правильной конфигурации на основе /etc/crypttab- более канонического (каламбур непреднамеренный) решения, которое также используется Ubuntu при установке с его шифрованием по умолчанию на основе LVM. (это решение не использует LVM и не шифрует /boot)

Я не несу ответственности за потерю данных или другие возможные неприятные последствия следования этому руководству. Убедитесь, что у вас есть надежные резервные копии, прежде чем что-либо делать.

Я не тестирую это руководство, пока печатаю это. Оно основано на (проверенном)запись в блоге от меняпо похожему случаю и некоторые детали я помню.

В этом руководстве предполагается, что:

  • Ubuntu уже установлен
  • Система загружается с (U)EFI, а не с BIOS/CSM
  • /bootнаходится на отдельном разделе 1
  • Вы можете загрузить Live-носитель Ubuntu 16.04/18.04 или Pop!_OS 18.04 (с USB, PXE, DVD и т. д.) 2

Если ваш /bootраздел не находится на отдельном разделе, извлечь его довольно просто: создайте раздел размером 200–500 МБ в любом месте, отформатируйте его в ext4, скопируйте текущий /bootконтент, добавьте /etc/fstabзапись update-grub, перезагрузите компьютер.


1. Резервное копирование

Вам необходимо сделать резервную копию текущего системного раздела(ов). Самый простой способ сделать это — использовать Clonezilla. Это безопасно для пользователя, не требуется руководство — просто следуйте инструкциям.

2. Уменьшение перегородок

Заголовки LUKS занимают часть места на разделе. Clonezilla/partclone не может восстанавливать образы на устройствах меньше исходных, поэтому вы не сможете восстановить образ незашифрованного раздела в зашифрованный контейнер, потому что он немного меньше.

Затем нам нужно немного сжать раздел(ы), чтобы зашифровать их. Сократите их на 10 МБ или больше, просто для надежности. Самый простой способ сделать это — использовать GParted. Он доступен на Ubuntu live media.

3. Создание образов сжатых разделов

Либо сделайте это снова с Clonezilla, либо уже ознакомьтесь счастьклона, который Clonezilla использует по умолчанию. Позже мы вручную восстановим образы с помощью partclone.

Клонирование в изображение с помощью partclone:

sudo partclone.ext4 -c -s /dev/sda2 | pigz -0 > /mnt/backup/sda2.ext4.ptcl.gz
  1. partclone.ext4один из двоичных файлов partclone, предназначенный для работы с ext4. Каждая поддерживаемая файловая система получает свой собственный двоичный файл partclone.

  2. /dev/sda2очевидно, раздел, который вы хотите клонировать. Я предпочитаю ссылаться на разделы по их метке части, например. /dev/disk/by-partlabel/os- намного чище, ИМХО. /dev/sda2хотя и более узнаваемо.

  3. пигзэто многоядерный gzip. -0сообщает ему о приоритете скорости над эффективным сжатием.

  4. /mnt/backupздесь представляет некоторое внешнее расположение, где вы хотите сохранить изображение. Если вы только что использовали Clonezilla, его все еще можно смонтировать под /home/partimag. Если вы хотите смонтировать общий ресурс SMB: sudo mount -t cifs -o username=gronostaj //192.168.1.90/Backup /mnt/backup(запрашивает пароль в интерактивном режиме)

4. Увеличить раздел(ы) до исходного размера

Мы хотим вернуть это дополнительное место для заголовков LUKS, не так ли? Измените размеры разделов до исходных.

5. Форматирование в LUKS

Это тот момент, когда вы теряете свои оригинальные данные. Убедитесь, что ваши резервные копии в порядке.

Отформатируйте системный раздел(ы) (кроме /boot) в LUKS:

sudo cryptsetup luksFormat --type luks2 /dev/sda2

Открыть созданный контейнер(ы):

sudo cryptsetup open /dev/sda2 os

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

sudo dd if=/dev/zero of=/dev/mapper/os bs=1M

(это перезапишет расшифрованное содержимое контейнера нулями, но зашифрованное содержимое будет выглядеть как случайный мусор)

6. Восстановление изображений

Запустите partclone вручную для восстановления образов:

cat /mnt/backup/sda2.ext4.ptcl.gz | pigz -d | sudo partclone.ext4 -r -o /dev/mapper/os

Если вы выбрали легкий путь и сделали "сжатые" резервные копии с помощью Clonezilla, посмотрите в ее выходные файлы, вы легко поймете, какие из них являются источниками partclone. Если вы не установите огромный размер куска, они будут фрагментированы, вам придется catобъединить их перед отправкой в ​​pigz.

Вам также следует настроить геометрию файловой системы так, чтобы она соответствовала всему разделу:

sudo resize2fs /dev/mapper/os

7. Включение поддержки шифрования

Сначала выполните chroot в только что восстановленную ОС:

mkdir /mnt/os
sudo mount /dev/mapper/os /mnt/os
cd /mnt/os
mount --bind /etc/resolv.conf etc/resolv.conf
mount --bind /dev dev
mount -t tmpfs tmpfs tmp
mount -t sysfs sys sys
mount -t proc proc proc
sudo chroot .
mount -a

Этот терминал теперь работает на установленном экземпляре Ubuntu, а не на работающем.

Установитькриптонастройка:

apt update
apt install cryptsetup -y

Он должен создать файл /etc/crypttab. Если этого не произошло, не волнуйтесь, создайте его вручную. Отредактируйте этот файл и добавьте записи для раздела(ов):

os /dev/sda2 none luks

Сохраните и выйдите из редактора. Пересоберите initramfs:

update-initramfs -u -k all

Обновите записи GRUB:

update-grub

8. Удаление дополнительных запросов на ввод пароля

Если у вас более одного зашифрованного раздела, то вам придется вводить пароль для каждого из них при загрузке. Однако LUKS позволяет вам добавлять дополнительные ключевые файлы, которые можно использовать для разблокировки разделов вместо пароля. Вы можете хранить эти ключевые файлы в зашифрованном /разделе и использовать его для разблокировки последующих.

Создайте случайный ключевой файл:

dd if=/dev/urandom of=/luks.key bs=4096 count=1

Добавьте его в некорневой раздел(ы):

cryptsetup luksAddKey /dev/sda3 /luks.key

Добавить crypttabзаписи:

home /dev/sda3 /luks.key luks

Пересобрать initramfs:

update-initramfs -u -k all

1 Почему я использую раздельные /boot:

  • Так проще ;)
  • GRUB пока не поддерживает LUKS2, поэтому /bootне должен находиться на зашифрованном разделе LUKS2.
  • Если вы хотите использовать LUKS-шифрование /bootи LUKS2-шифрование /, то вам придется ввести пароль дважды иливстроить ключевой файл в initramfs- слишком много хлопот, по моему мнению, потому что...
  • Одно лишь шифрование /bootне делает вас менее уязвимыми, потому что даже если ваш /bootраздел зашифрован, ваш системный раздел EFI не может быть зашифрован, поэтому злоумышленник может вмешаться в него и, например, использовать свое вредоносное ядро/initramfs вместо вашего из /boot. (чтобы исправить это, вам нужносоздайте самоконтейнерный двоичный файл GRUB и подпишите его своим закрытым ключом, затем используйте UEFI Secure Boot для проверки)

Определите собственную модель угроз и решите, какой уровень безопасности (и от чего) вам нужен.

2 Вы можете попытать счастья с другими версиями Ubuntu или загрузочными компакт-дисками, такими какГРМЛ, но ваш пробег может отличаться. Я столкнулся с тем, что эта процедура не срабатывала просто потому, что живые медиа не соответствовали системе.

решение2

Вы можете создать образ корневого раздела, отформатировать его с помощью LUKS, смонтировать его и перезаписать его образом. Затем потребуется внести несколько изменений в GRUB, чтобы он расшифровал его при загрузке.Я не проверял шаги, указанные ниже., они всего лишь зацепка.

Я предположил, что /bootэто на sdb1, корневой раздел включен sdb2и /media/hddявляется внешним диском. Мы находимся на Live USB в командной строке администратора.

Зашифровать корневой раздел

dd if=/dev/sdb2 of=/media/hdd/diskimg bs=1M
cryptsetup luksFormat /dev/sdb2
cryptsetup luksOpen /dev/sdb2 enc_root
dd if=/media/hdd/diskimg of=/dev/mapper/enc_root

Смонтировать перегородки

mount /dev/sdb2 /mnt
mount /dev/sdb1 /mnt/boot

Настроить GRUB

Запишите UUID раздела, выполнив:

blkid /dev/sdb2

Измените /mnt/etc/default/grub, найдите строку, в которой написано GRUB_CMDLINE_LINUX_DEFAULT="quiet splash". Измените ее на следующую, заменив device-UUIDна UUID, который вы записали на предыдущем шаге.

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash cryptdevice=UUID=device-UUID:enc_root root=/dev/mapper/enc_root"

Затем обновите конфигурацию GRUB:

mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount --bind /proc /mnt/proc
chroot /mnt
update-grub
exit

И размонтируем все:

umount /mnt/dev
umount /mnt/sys
umount /mnt/proc
umount /mnt/boot
umount /mnt

И перезагрузитесь. Несколько подводных камней:

  • Я ничего из этого не тестировал и давно не игрался с разделами Linux, так что почти уверен, что забыл или напутал что-то. Подождите, пока люди вычитают и исправят.
  • Это предполагает, что все /bootнаходится на отдельном разделе. Это не сработало бы, если бы все находилось на одном разделе.
  • В системе UEFI не забудьте также смонтировать раздел EFI туда, где ему положено быть.
  • ddскопируювсевключая свободное пространство, более быстрым методом будет копирование только файлов в разделе.

Удачи!

Связанный контент