Задача – установить 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
):
Заголовок содержит используемый алгоритм шифрования (AES, Twofish), режим шифрования (ECB, CBC-plain), длину ключа, UUID и контрольную сумму мастер-ключа.
Сценарии шифрования разделов
Как описано>>> на Arch Wiki – имеется несколько сценариев создания шифрованных разделов:
- использование LUKS на стандартной разметке диска
- плюсы: простая разбивка диска
- минусы: размер разделов нельзя будет менять, они должны быть определены заранее
- LVM на зашифрованном LUKS разделе
- плюсы
- удобное управление разделами через LVM
- один ключ для всех разделов
- разбивка диска недоступна, когда рездел заблокирован
- простая настройка hibernate
- минусы: LVM добавляет дополнительный слой
- плюсы
- LUKS на LVM – использует
dm-crypt
после настройки LVM и создания его разделов- плюсы:
- LVM может использоваться для нескольких физических дисков
- простая группировка шифрованных и нешифрованных разделов
- минусы:
- усложнение системы: изменение разделов потребует изменения настроек шифрования
- для каждого раздела потребуетс яотдельный ключ шифрования
- таблица разделы видна, даже когда они заблокированы
- плюсы:
- чистый
dm-crypt
– без заголовков и ключей LUKS- плюсы:
- целостность данных в случаях, когда заголовки LUKS могут быть повреждены
- позволяет использовать полное шифрование диска
- решает некоторые проблемы с SSD
- минусы:
- необходимость в точной настройке системы шифрования
- единый ключ шифрования без возможности изменить его
- плюсы:
Кроме всего – очень хорошее обсуждение 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 с хост-машины, что бы упростить копи-паст:
[simterm]
# passwd root # systemctl start sshd.socket # ip a s
[/simterm]
Подключаемся:
[simterm]
$ ssh [email protected] ... Last login: Sat May 12 04:41:35 2018 root@archiso ~ #
[/simterm]
Диск
Создание разделов
Диск 20 GB, на котором будет два раздела – под /boot
и под LVM, LVM в свою очередь будет содержать разделы для root
и /home
:
[simterm]
[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
[/simterm]
Создаём разделы:
[simterm]
[root@archiso ~]# fdisk /dev/sda
[/simterm]
/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>
// последний сектор, всё оставшееся место
Проверяем:
[simterm]
... 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
[/simterm]
Записываем изменения – w
:
[simterm]
... Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.
[/simterm]
Шифрование раздела
Оставляем /dev/sda1
незашифрованным, что бы система могла загрузится.
Используя cryptsetup
– шифруем /dev/sda2
:
[simterm]
[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:
[/simterm]
Тут:
-y
: запросить подтверждение пароляluksFormat
: использовать LUKS--type
: тип – plain, luks, luks2, tcrypt
Открываем контейнер с именем cryptlvm
, который содержит данные из /dev/sda2
:
[simterm]
[root@archiso ~]# cryptsetup open /dev/sda2 cryptlvm Enter passphrase for /dev/sda2:
[/simterm]
Проверяем:
[simterm]
[root@archiso ~]# ls -l /dev/mapper/cryptlvm lrwxrwxrwx 1 root root 7 May 12 08:38 /dev/mapper/cryptlvm -> ../dm-0
[/simterm]
На этом с шифрованием всё – переходим к созданию LVM разделов и установке системы.
Создание LVM разделов
Создаём Phisical Volume на /dev/mapper/cryptlvm
:
[simterm]
[root@archiso ~]# pvcreate /dev/mapper/cryptlvm Physical volume "/dev/mapper/cryptlvm" successfully created.
[/simterm]
Volume Group:
[simterm]
[root@archiso ~]# vgcreate vg_arch /dev/mapper/cryptlvm Volume group "vg_arch" successfully created
[/simterm]
Три Logical Volume в группе томов vg_arch
– swap
:
[simterm]
[root@archiso ~]# lvcreate -L 1G -n swap vg_arch
Logical volume “swap” created.
[/simterm]
root
, 6 гиг:
[simterm]
[root@archiso ~]# lvcreate -L 6G -n root vg_arch
Logical volume “root” created.
[/simterm]
И home
, на всё оставшееся место:
[simterm]
[root@archiso ~]# lvcreate -l 100%FREE -n home vg_arch
Logical volume “home” created.
[/simterm]
Создаём файловые системы:
[simterm]
[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
[/simterm]
Подключаем swap
:
[simterm]
[root@archiso ~]# swapon /dev/vg_arch/swap
[/simterm]
Монтируем разделы – root
в корень /mnt
:
[simterm]
[root@archiso ~]# mount /dev/vg_arch/root /mnt/
[/simterm]
Для /home
– в /mnt
создаём каталог home
, и монтируем в него:
[simterm]
[root@archiso ~]# mkdir /mnt/home
[root@archiso ~]# mount /dev/vg_arch/home /mnt/home/
[/simterm]
Аналогично для /boot
:
[simterm]
[root@archiso ~]# mkdir /mnt/boot
[root@archiso ~]# mount /dev/sda1 /mnt/boot/
[/simterm]
Проверяем:
[simterm]
[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
[/simterm]
Установка системы
Устанавливаем саму систему и openssh
:
[simterm]
[root@archiso ~]# pacstrap -i /mnt base base-devel openssh
[/simterm]
Если на машине несколько систем – имеет смысл сразу добавить os-prober
.
Создаём /etc/fstab
:
[simterm]
[root@archiso ~]# genfstab -pU /mnt >> /mnt/etc/fstab
[/simterm]
Проверяем его:
[simterm]
[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
[/simterm]
Меняем окружение – переходим в установленную систему:
[simterm]
[root@archiso ~]# arch-chroot /mnt /bin/bash
[/simterm]
Настройка 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
и создаём загрузочный образ:
[simterm]
[root@archiso /]# cd /boot/ && mkinitcpio -p linux
[/simterm]
Настройка GRUB
Устанавливаем GRUB2:
[simterm]
[root@archiso boot]# pacman -S grub
[/simterm]
Устанавливаем загрузчик на /dev/sda
:
[simterm]
[root@archiso boot]# grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.
[/simterm]
Редактируем /etc/default/grub
, указываем GRUB на необходимость разблокировать диск (см. Encryption).
Получаем UUID диска:
[simterm]
[root@archiso ~]# blkid /dev/sda2
/dev/sda2: UUID=”f8327d4b-7949-49a3-b955-0c4814f6ee53″ TYPE=”crypto_LUKS” PARTUUID=”c26e076b-02″
[/simterm]
Добавляем в /etc/default/grub
:
GRUB_CMDLINE_LINUX="cryptdevice=UUID=f8327d4b-7949-49a3-b955-0c4814f6ee53:cryptlvm root=/dev/vg_arch/root"
Генерируем конфиг:
[simterm]
[root@archiso boot]# grub-mkconfig -o /boot/grub/grub.cfg
[/simterm]
Перезагружаемся:
[simterm]
... [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.