В большинстве случаев шифрование диска является излишним или даже вредным. Однако, когда дело касается ноутбука, паранойя не помешает. Получив в руки новый ноутбук, именно шифрованием диска я первым делом и озаботился.
На данный момент во многих дистрибутивах уже из коробки предоставляется возможность создавать шифрованные разделы. Однако, все те варианты, что мне попадались, предусматривают не шифрованный /boot. Не критичное, но неприятное упущение. Информация о том, как сделать полностью шифрованный диск, ищется в интернете достаточно легко, но подавляющая её часть на английском языке и некоторые подводные камни всё же не описаны. Я постараюсь наиболее кратко, понятно и по шагам объединить эту информацию в одном тексте.
Что будем использовать
Дистрибутив: Slackware Linux 14.2 (но думаю, всё легко адаптировать под любой дистрибутив Linux)
Шифрование: Luks
Разметка: LVM
Загрузчик: Grub2
Разметка и шифрование диска
Начинаем с разметки диска. Так, как мы планируем шифровать весь диск, нам необходимо создать только один раздел (я не использую UEFI).
parted /dev/sda mklabel msdos
parted -a optimal /dev/sda mkpart primary 0% 100%
Теперь форматируем данный раздел под Luks и подключаем его.
cryptsetup luksFormat /dev/sda1
cryptsetup luksOpen /dev/sda1 lda
После выполнения luksOpen у нас появилось блочное устройство lda, которое мы уже можем разметить с использованием LVM.
pvcreate /dev/mapper/lda
vgcreate vga /dev/mapper/lda
lvcreate -L4G -n swap vga
lvcreate -L32G -n root vga
lvcreate -l100%FREE -n home vga
Создаём swap-раздел.
mkswap /dev/vga/swap
Далее можно начинать установку системы на созданные LVM-разделы. После завершения установки не перезагружаемся, а выходим в терминал и продолжаем заниматься магией.
Загрузка
Первым делом, нам необходимо создать initrd/initramfs так, как ядро не в состоянии самостоятельно получить доступ к шифрованному диску. Тут следует отметить, что большинство коробочных дистрибутивов рассчитаны на загрузку с раздела /boot без шифрования и на то, что пароль для доступа к шифрованному диску надо будет вводить во время загрузки (инициализации системы). Для нас это означает то, что мы должны будем вводить пароль дважды, что не слишком удобно. Решить эту проблему можно создав luks-ключ и разместив его в initrd.
dd bs=512 count=4 if=/dev/urandom od=/root/boot.key
cryptsetup luksAddKey /dev/sda1 /root/boot.key
Настоятельно рекомендую обратиться к документации на утилиту для создания initrd/initramfs вашего дистрибутива. Она может поддерживать добавление luks-ключей. В Slackware я столкнулся с тем, что работа с такими ключами поддерживается, но ключ должен быть размещён на незашифрованном носителе (к примеру, на флешке). Пришлось схитрить следующим образом:
# создаём initrd
mkinitrd -c -k 4.4.14 -m ext4 -f ext4 -r /dev/vga/root -C /dev/sda1 -L
# копируем ключ
install -D -m 0600 /root/boot.key /boot/initrd-tree/mountkey/boot.key
# пересоздаём initrd
mkinitrd -c -k 4.4.14 -m ext4 -f ext4 -r /dev/vga/root -C /dev/sda1 -L -K :/boot.key
Grub
Я не особо долго искал, но из того, что попалось под руку, загрузку с шифрованного диска поддерживает только Grub2.
Для того, чтобы загрузчик смог получить доступ к файлам на диске, нам необходимо в /etc/default/grub добавить соответствующий ключ:
GRUB_ENABLE_CRYPTODISK=y
GRUB_CRYPTODISK_ENABLE=y
Как можно видеть, я указал и GRUB_ENABLE_CRYPTODISK и GRUB_CRYPTODISK_ENABLE. Это первый подводный камень, на который я наткнулся. В природу этого явления я не вникал, но по документации надо использовать первый, а grub-mkconfig проверяет на «y» именно второй.
Устанавливаем загрузчик.
grub-mkconfig -o /boot/grub/grub.cfg
grub-install /dev/sda
На этом, можно считать установку завершённой. В резкльтате мы должны получить систему, которая полностью живёт на шифрованном диске и при загрузке только один раз просить пароль — на этапе старта Grub-а.
Материалы по теме и источники
Full disk encryption with LUKS (including /boot) — Pavel Kogan
Installing Slackware on encrypted volumes — Eric Hameleers
Автор: Innominatus