Arch Linux: установка с LVM и LUKS шифрованием диска

By | 05/12/2018
 

Задача – установить Arch Linux, установить root и home разделы на LVM, и зашифровать их.

Что такое LUKS

LUKS является стандартом для шифрования дисков в Linux, а аббревиатура расшифровавается как “Linux Unified Key Setup“.

Последняя спецификация LUKS доступна тут>>>.

Утилита, используемая для реализации LUKS – cryptsetup, однако она поддерживает и прямую работу с подсистемой ядра dm-crypt.

При использовании LUKS – на диск добавляется LUKS partition header (phdr), key material (KM) и зашифрованные мастер-ключём данные (bulk-data):

Заголовок содержит используемый алгоритм шифрования (AESTwofish), режим шифрования (ECBCBC-plain), длину ключа, UUID и контрольную сумму мастер-ключа.

Сценарии шифрования разделов

Как описано>>> на Arch Wiki – имеется несколько сценариев создания шифрованных разделов:

  1. использование LUKS на стандартной разметке диска
    • плюсы: простая разбивка диска
    • минусы: размер разделов нельзя будет менять, они должны быть определены заранее
  2. LVM на зашифрованном LUKS разделе
    • плюсы
      • удобное управление разделами через LVM
      • один ключ для всех разделов
      • разбивка диска недоступна, когда рездел заблокирован
      • простая настройка hibernate
    • минусы: LVM добавляет дополнительный слой
  3. LUKS на LVM – использует dm-crypt после настройки LVM и создания его разделов
    • плюсы:
      • LVM может использоваться для нескольких физических дисков
      • простая группировка шифрованных и нешифрованных разделов
    • минусы:
      • усложнение системы: изменение разделов потребует изменения настроек шифрования
      • для каждого раздела потребуетс яотдельный ключ шифрования
      • таблица разделы видна, даже когда они заблокированы
  4. чистый dm-crypt – без заголовков и ключей LUKS
    • плюсы:
    • минусы:
      • необходимость в точной настройке системы шифрования
      • единый ключ шифрования без возможности изменить его

Кроме всего – очень хорошее обсуждение plain dm-crypt vs LUKS есть на SF, в вопросе “Why is plain dm-crypt only recommended for experts?“, и принятый ответ на него.

Собственно, выбор тут – либо LVM на LUKS разделе, либо LUKS на LVM разделе.

В этом посте описывается пример использования LVM на LUKS, т.е. – сначала раздел диска шифруется, потом на нём создаются разделы LVM, на которые будут записываться данные:

+-----------------------------------------------------------------------+ +----------------+
| Logical volume 1      | Logical volume 2      | Logical volume 3      | | Boot partition |
|                       |                       |                       | |                |
| [SWAP]                | /                     | /home                 | | /boot          |
|                       |                       |                       | |                |
| /dev/vg_arch/swap     |  /dev/vg_arch/root    | /dev/vg_arch/home     | |                |
|_ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _| | (may be on     |
|                                                                       | | other device)  |
|                         LUKS encrypted partition                      | |                |
|                           /dev/sda2                                   | | /dev/sda1      |
+-----------------------------------------------------------------------+ +----------------+

Установка далее выполняется на виртуальную машину в Virtualbox, потом надо будет повторить на рабочей машине (снести Ubuntu, поставить Arch).

Примечание: во избежание комментариев “я делал всё по вашему мануалу, и потерял все данные на production-сервере”, где-то у меня был такой – делайте сначала на виртуалке с вдумчивым чтением документации и пониманием того, что делаете. И вообще – не воспринимайте запись в блоге как официальную документацию, ссылки на документацию есть выше и дальше по тексту.

Загружаемся с ISO, задаём пароль root, запускаем openssh, и получаем IP – дальнейшая установка будет выполняться по SSH с хост-машины, что бы упростить копи-паст:

passwd root
systemctl start sshd.socket
ip a s

Подключаемся:

ssh root@192.168.1.103
...
Last login: Sat May 12 04:41:35 2018
root@archiso ~ #

Диск

Создание разделов

Диск 20 GB, на котором будет два раздела – под /boot и под LVM, LVM в свою очередь будет содержать разделы для root и /home:

[root@archiso ~]# fdisk -l /dev/sda
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Создаём разделы:

[root@archiso ~]# fdisk /dev/sda

/boot:

(fdisk) n // new раздел
(fdisk) p // или <Enter>, primary раздел
(fdisk) 1 // или <Enter>, первый раздел
(fdisk) <Enter> // первый сектор, по умолчанию
(fdisk) +256M // последний сектор, под /boot тут хватит 256МБ
(fdisk) a // устанавливаем boot флаг на этот раздел

LVM:

(fdisk) n // new раздел
(fdisk) p // или <Enter>, primary раздел
(fdisk) 2 // или <Enter>, второй раздел
(fdisk) <Enter> // первый сектор, по умолчанию
(fdisk) <Enter> // последний сектор, всё оставшееся место

Проверяем:

...
Command (m for help): p
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc26e076b
Device     Boot  Start      End  Sectors  Size Id Type
/dev/sda1  *      2048   526335   524288  256M 83 Linux
/dev/sda2       526336 41943039 41416704 19.8G 83 Linux

Записываем изменения – w:

...
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Шифрование раздела

Оставляем /dev/sda1 незашифрованным, что бы система могла загрузится.

Используя cryptsetup – шифруем /dev/sda2:

[root@archiso ~]# cryptsetup -y luksFormat --type luks2 /dev/sda2
WARNING!
========
This will overwrite data on /dev/sda2 irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/sda2:
Verify passphrase:

Тут:

  • -y: запросить подтверждение пароля
  • luksFormat: использовать LUKS
  • --type: тип – plain, luks, luks2tcrypt

Открываем контейнер с именем cryptlvm, который содержит данные из /dev/sda2:

[root@archiso ~]# cryptsetup open /dev/sda2 cryptlvm
Enter passphrase for /dev/sda2:

Проверяем:

[root@archiso ~]# ls -l /dev/mapper/cryptlvm
lrwxrwxrwx 1 root root 7 May 12 08:38 /dev/mapper/cryptlvm -> ../dm-0

На этом с шифрованием всё – переходим к созданию LVM разделов и установке системы.

Создание LVM разделов

Создаём Phisical Volume на /dev/mapper/cryptlvm:

[root@archiso ~]# pvcreate /dev/mapper/cryptlvm
Physical volume "/dev/mapper/cryptlvm" successfully created.

Volume Group:

[root@archiso ~]# vgcreate vg_arch /dev/mapper/cryptlvm
Volume group "vg_arch" successfully created

Три Logical Volume в группе томов vg_archswap:

[root@archiso ~]# lvcreate -L 1G -n swap vg_arch
Logical volume “swap” created.

root, 6 гиг:

[root@archiso ~]# lvcreate -L 6G -n root vg_arch
Logical volume “root” created.

И home, на всё оставшееся место:

[root@archiso ~]# lvcreate -l 100%FREE -n home vg_arch
Logical volume “home” created.

Создаём файловые системы:

[root@archiso ~]# mkfs.ext2 /dev/sda1
[root@archiso ~]# mkfs.ext4 /dev/vg_arch/root
[root@archiso ~]# mkfs.ext4 /dev/vg_arch/home
[root@archiso ~]# mkswap /dev/vg_arch/swap

Подключаем swap:

[root@archiso ~]# swapon /dev/vg_arch/swap

Монтируем разделы – root в корень /mnt:

[root@archiso ~]# mount /dev/vg_arch/root /mnt/

Для /home – в /mnt создаём каталог home, и монтируем в него:

[root@archiso ~]# mkdir /mnt/home
[root@archiso ~]# mount /dev/vg_arch/home /mnt/home/

Аналогично для /boot:

[root@archiso ~]# mkdir /mnt/boot
[root@archiso ~]# mount /dev/sda1 /mnt/boot/

Проверяем:

[root@archiso ~]# ls -l /mnt/
total 21
drwxr-xr-x 3 root root  1024 May 12 08:43 boot
drwxr-xr-x 3 root root  4096 May 12 08:49 home
drwx------ 2 root root 16384 May 12 08:48 lost+found

Установка системы

Устанавливаем саму систему и openssh:

[root@archiso ~]# pacstrap -i /mnt base base-devel openssh

Если на машине несколько систем – имеет смысл сразу добавить os-prober.

Создаём /etc/fstab:

[root@archiso ~]# genfstab -pU /mnt >> /mnt/etc/fstab

Проверяем его:

[root@archiso ~]# cat /mnt/etc/fstab
Static information about the filesystems.
See fstab(5) for details.
<file system> <dir> <type> <options> <dump> <pass>
/dev/mapper/vg_arch-root
UUID=f5022682-266e-4031-9bb3-4ba1912236b1       /               ext4            rw,relatime,data=ordered        0 1
/dev/mapper/vg_arch-home
UUID=a50b7158-09dd-474d-a3c5-8ba8ecc627f8       /home           ext4            rw,relatime,data=ordered        0 2
/dev/sda1
UUID=a091cbf6-391f-4801-be53-6712486aad7b       /boot           ext2            rw,relatime,block_validity,barrier,user_xattr,acl       0 2
/dev/mapper/vg_arch-swap
UUID=26f8061c-bd03-4bd3-b75a-9978af7d7f87       none            swap            defaults,pri=-2 0 0

Меняем окружение – переходим в установленную систему:

[root@archiso ~]# arch-chroot /mnt /bin/bash

Настройка mkinitcpio

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

Модули определяются в файле /etc/mkinitcpio.conf, т.к. мы используем шифрование и LVM – в HOOKS перед (порядок имеет значение, см. комментарии и примеры в самом файле) modconf добавляем keyboard и keymap, а перед filesystem добавляем encrypt и lvm2:

...
HOOKS=(base udev autodetect keyboard keymap modconf block encrypt lvm2 filesystems fsck)
...

Переходим в /boot и создаём загрузочный образ:

[root@archiso /]# cd /boot/ && mkinitcpio -p linux

Настройка GRUB

Устанавливаем GRUB2:

[root@archiso boot]# pacman -S grub

Устанавливаем загрузчик на /dev/sda:

[root@archiso boot]# grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

Редактируем /etc/default/grub, указываем GRUB на необходимость разблокировать диск (см. Encryption).

Получаем UUID диска:

[root@archiso ~]# blkid /dev/sda2
/dev/sda2: UUID=”f8327d4b-7949-49a3-b955-0c4814f6ee53″ TYPE=”crypto_LUKS” PARTUUID=”c26e076b-02″

Добавляем в /etc/default/grub:

GRUB_CMDLINE_LINUX="cryptdevice=UUID=f8327d4b-7949-49a3-b955-0c4814f6ee53:cryptlvm root=/dev/vg_arch/root"

Генерируем конфиг:

[root@archiso boot]# grub-mkconfig -o /boot/grub/grub.cfg

Перезагружаемся:

...
[root@archiso boot]# exit
[root@archiso ~]# exit
bash  109.73s user 50.01s system 4% cpu 1:06:00.60 total
127 root@archiso ~ # reboot
Connection to 192.168.1.138 closed by remote host.
Connection to 192.168.1.138 closed.

Вводим пароль:

Готово.

Дальше устанавливаем xorg-server и прочее, см. Arch: установка с LVM + Openbox + Tint2.