dm-crypt (Русский)/Encrypting an entire system (Русский) - ArchWiki

Jump to content

# dm-crypt (Русский)/Encrypting an entire system (Русский)

From ArchWiki
< Dm-crypt (Русский)

Шифрование всей системы при помощи dm-crypt. Следующие примеры демонстрируют общие сценарии полного шифрования системы с dm-crypt. Они объясняют все дополнительные действия, которыми необходимо дополнить обычную процедуру установки. Все необходимые инструменты доступны на установочном образе.

Если вы хотите зашифровать уже существующую незашифрованную файловую систему, смотрите dm-crypt/Device encryption#Encrypt an existing unencrypted file system.

## Обзор

Обеспечение безопасности корневой файловой системы — это то, в чем dm-crypt особенно силён, как по функциональности, так и по производительности. В отличие от выборочного шифрования некорневых файловых систем, зашифрованная корневая файловая система может скрыть такую информацию, как установленные программы, имена пользователей всех учетных записей и типичные источники утечки данных, такие как locate и `/var/log/`. Кроме того, зашифрованная корневая файловая система значительно усложняет вмешательство в систему, поскольку всё, кроме загрузчика и (обычно) ядра, зашифровано.

Все сценарии, проиллюстрированные ниже, обладают этими преимуществами. Различные плюсы и минусы того или иного способа приведены в таблице ниже:

Сценарии | Преимущества | Недостатки
--- | --- | ---
#LUKS на разделе демонстрирует базовую и прямолинейную настройку полностью зашифрованного корня с LUKS. | Простое разбиение на разделы и настройка На диске с разметкой GPT systemd может автоматически смонтировать корневой раздел. | Негибкость: объём зашифрованного пространства нужно выделять заранее
#LUKS на разделе с TPM2 и Secure Boot Аналогично примеру выше, с Secure Boot и TPM2, обеспечивающими дополнительные уровни безопасности. | Те же преимущества, что и выше, и Secure Boot позволяет защититься от атак злой горничной TPM2 предотвращает разблокировку системы, если Secure Boot отключён или изменён | Те же недостатки, что и выше.
#LVM внутри LUKS Физический том (PV) LVM размещён внутри крипто-контейнера LUKS. | Простое разбиение при умении работать с LVM Можно как угодно переразмечать структуру LVM без дополнительных настроек шифрования Только один ключ требуется для разблокировки всех томов (например, удобно для настройки возобновления из спящего режима т.е. выхода из гибернации (resume-from-disk)) Структура томов не видна при блокировке Простейший способ реализовать гибернацию (suspend-to-disk) | LVM добавляет дополнительный слой mapping'а и хук Менее практично и оправдано, если нужно зашифровать какой либо отдельный том отдельно от остальных томов. Если у вас несколько физических томов LVM (PV) в группе томов (volume group), которая должна быть внутри LUKS, то каждый физический том должен быть зашифрован отдельно с помощью LUKS. Для их использования все крипто-контейнеры должны быть расшифрованы по отдельности до активации данной группы томов при загрузке системы.
#LUKS внутри LVM Крипто-контейнеры LUKS, внутри которых находятся файловые системы распольжены внутри логических томов LVM. | LVM может использоваться для распределения зашифрованных виртуальных логических томов (одного или несколько) на несколько реальных физических носителей информации В одной и той же группе томов можно иcпользовать как зашифрованные и так и не зашифрованные логические тома | При изменении томов (например при увеличенни размера) нужно также менять и крипто-контейнеры. Требуются собственный отдельный ключ для каждого зашифрованного логического тома. Структура LVM видна до разблокировки. Более медленное время загрузки; каждый зашифрованный LV должен быть разблокирован отдельно.
#LUKS внутри программного RAID Использует dm-crypt после настройки RAID. | Аналогично «LUKS внутри LVM» | Аналогично «LUKS внутри LVM» и зашифрованному /boot (GRUB)
#Простой dm-crypt использует простой режим dm-crypt, т.е. без заголовка LUKS и его опций для нескольких ключей. В этом сценарии также описывается использование USB-устройства для `/boot` и хранения ключей, что может быть применено и в других описаных здесь сценариях. | Устойчивость данных для случаев, когда заголовок LUKS может быть поврежден Позволяет использовать отрицаемое шифрование Помогает решить проблемы с SSD | Требуется вручную прописывать большое количество параметров шифрования Единственный ключ шифрования и нет возможности его изменить Слишком сложная настройка для не узкоспециализированного использования
#Зашифрованный загрузочный раздел (GRUB) показывает, как зашифровать `/boot` для расшифровки напрямую GRUB'ом. В этом сценарии также испрользуется системный раздел EFI, что применимо и в других сценариях. | Те же преимущества, что и у сценария, на котором основана установка (LVM внутри LUKS для этого конкретного примера) Меньше данных остается незашифрованными: только загрузчик и системный раздел EFI, если он есть | Те же недостатки, что и у сценария, на котором основана установка (LVM внутри LUKS для этого конкретного примера) Более сложная конфигурация Не поддерживается другими загрузчиками GRUB долго расшифровывает LUKS, что увеличивает общее время загрузки операционной системы
#Корневой раздел на ZFS | В случае зашифрованного `zpool` все наборы данных содержатся в одной и той же криптографической среде, что упрощает dual boot и обмен данными между установленными системами. Резервное копирование возможно на пул ZFS без активного шифрования: передаваемые снимки будут храниться в зашифрованном виде благодаря нативной поддержке шифрования ZFS. | ZFS не будет шифровать метаданные, связанные со структурой пула, включая имена наборов данных и снимков, иерархию наборов данных, свойства, размер файлов, дыры в файлах (участки с нулевыми байтами) и таблицы дедупликации (хотя сами дедуплицированные данные зашифрованы). Создание пула требует от пользователя более глубокого знания геометрии дисков и даже установки размера блока (`ashift`) для лучшей производительности. ZFS имеет некоторые особенности со своей собственной реализацией `aes` и некоторые алгоритмы шифрования могут работать плохо. Swap на `zvol` или файле внутри набора данных — это старая и хорошо известная проблема без обходного пути, кроме размещения swap в другом разделе или lv и отключения гибернации (suspend-to-disk) (смотрите ниже).

Хотя все вышеперечисленные сценарии обеспечивают гораздо бо́льшую защиту от внешних угроз, чем зашифрованные вторичные (не корневые) файловые системы, они также имеют общий недостаток: не возможность шифровать данные для каждового пользоваля отдельно. Если в системе несколько пользователей, то любой из них, при получении доступа к ключу шифрования, может расшифровать весь диск и, следовательно, получить доступ к данным всего диска. Если это критично, возможно использовать комбинацию шифрования блочных устройств и шифрования засчёт стековой файловой системы, чтобы получить преимущества обоих методов. Смотрите Data-at-rest encryption (Русский).

Смотрите dm-crypt/Drive preparation#Partitioning для общего обзора стратегий разбиения, используемых в сценариях.

Еще одна область для рассмотрения — нужно ли настраивать зашифрованный раздел (или файл) подкачки и какого типа. См. dm-crypt/Шифрование подкачки.

Если вы планируете защитить данные системы не только от физической кражи, но также имеете требования к мерам предосторожности против логического вмешательства, см. dm-crypt/Specialties#Securing the unencrypted boot partition для дополнительных возможностей после следования по одному из описанных сценариев.

Для твердотельных накопителей вы можете захотеть рассмотреть включение поддержки TRIM, но будьте осторожны, есть потенциальные последствия для безопасности. См. dm-crypt/Specialties#Discard/TRIM support for solid state drives (SSD) для получения дополнительной информации.

Важно

- В любом сценарии никогда не используйте программы восстановления файловой системы, такие как fsck, непосредственно на зашифрованном томе, иначе это уничтожит любые средства восстановления ключа, используемого для расшифровки ваших файлов. Такие инструменты должны использоваться на расшифрованном (открытом) устройстве.
- Функция формирования ключа Argon2 имеет высокое использование ОЗУ в качестве своей особенности для усложнения взлома ключа, по умолчанию 1 ГиБ на зашифрованный маппер. Машины с малым объемом ОЗУ и/или несколькими разделами LUKS2, при разблокировки параллельно, могут выдать ошибку при загрузке. Смотрите опцию `--pbkdf-memory` для контроля использования памяти.[1]
- Выход из гибернации на ZFS может повредить ваш пул, поэтому будьте особенно осторожны при настройке гибернации, даже если swap размещен вне zvol. Подробности здесь.

## LUKS на разделе

Этот пример описывает полное шифрование системы с dm-crypt + LUKS на схеме наиболее простой разбивки разделов:

    +-----------------------+------------------------+-----------------------+
    | Загрузочный раздел    | Зашифрованный корневой | Дополнительное        |
    |                       | раздел LUKS            | свободное место для   |
    |                       |                        | дополнительных        |
    | /boot                 | /                      | разделов, которые     |
    |                       |                        | будут настроены позже |
    |                       | /dev/mapper/root       |                       |
    |                       |------------------------|                       |
    | /dev/sda1             | /dev/sda2              |                       |
    +-----------------------+------------------------+-----------------------+

Первые шаги можно выполнить непосредственно после загрузки установочного образа Arch Linux.

### Подготовка диска

Перед созданием любых разделов вы должны узнать о важности безопасного стирания диска и его методах, описанных в dm-crypt/Drive preparation.

Затем создайте необходимые разделы, как минимум для `/` (например, `/dev/sda2`) и для `/boot` (`/dev/sda1`). См. Partitioning.

### Подготовка не загрузочных разделов

Этот и следующий разделы заменяют инструкции из Installation guide (Русский)#Форматирование разделов.

Следующие команды создают и монтируют зашифрованный корневой раздел. Они соответствуют процедуре, описанной подробно в dm-crypt/Device encryption#Encrypting devices with LUKS mode. Если вы хотите использовать определенные нестандартные параметры шифрования (например, метод шифрования, длину ключа, размер сектора), см. encryption options перед выполнением первой команды.

    # cryptsetup -v luksFormat /dev/sda2
    # cryptsetup open /dev/sda2 root

Создайте файловую систему на разблокированном LUKS устройстве. Например, чтобы создать файловую систему Ext4, выполните:

    # mkfs.ext4 /dev/mapper/root

Смонтируйте корневой том в `/mnt`:

    # mount /dev/mapper/root /mnt

Проверьте, работает ли маппинг как надо:

    # umount /mnt
    # cryptsetup close root
    # cryptsetup open /dev/sda2 root
    # mount /dev/mapper/root /mnt

Если вы создали отдельные разделы (например, `/home`), эти шаги необходимо адаптировать и повторить для всех из них, кроме `/boot` (И `/efi` если EFI-раздел монтируется не в `/boot`, а туда). См. dm-crypt/Encrypting a non-root file system#Automated unlocking and mounting о том, как обрабатывать дополнительные разделы при загрузке.

Обратите внимание, что каждое блочное устройство потребует своего пароля. Это может быть неудобно, так как это приводёт к необходимости ввода нескольких паролей при загрузке. Альтернативой является использование файла ключа, хранящегося в корневом разделе, для разблокировки всех остальных разделов через `crypttab` уже без ввода паролей. См. dm-crypt/Device encryption#Using LUKS to format partitions with a keyfile для дополнительных инструкций.

### Подготовка загрузочного раздела

Важно Форматируйте системный раздел EFI только в том случае, если он был только что создан на этапе разметки. Если на диске уже есть системный раздел EFI, его переформатирование удалит загрузчики других ранее установленных операционных систем.
Совет При наличиии других установленных систем использующих `/boot` лучше создавать отдельные разделы для `/boot` каждой системы, при этом EFI-раздел, в каждой системе можно монтировать в `/efi`

Нужно выполнить настройку незашифрованного раздела `/boot`, который необходим для зашифрованного корня. Для EFI system partition на системах UEFI выполните:

    # mkfs.fat -F32 /dev/sda1

или на более старом оборудовании для обычного загрузочного раздела на системах BIOS:

    # mkfs.ext4 /dev/sda1

После этого создайте каталог для точки монтирования и смонтируйте раздел:

    # mount --mkdir /dev/sda1 /mnt/boot

### Монтирование устройств

На шаге Installation guide (Русский)#Монтирование разделов вы должны будете монтировать устройства `/dev/mapper/*` (содержимое крипто-контейнеров), а не фактические разделы. Конечно раздел для `/boot`, который не зашифрован, все равно должен быть смонтирован напрямую. Во время установки должен быть смонтирован в `/mnt/boot` (Если устройство для корневой файловой системы во время установки монтируется в `/mnt`).

### Настройка mkinitcpio

Если используется стандартный initramfs на основе busybox, добавьте хуки `keyboard` и `encrypt` в mkinitcpio.conf. Если на этапе загрузки системы вы хотите использовать неамериканскую (не US) консольную карту клавиш или нестандартный шрифт консоли, дополнительно добавьте хуки `keymap` и `consolefont` соответственно.

    HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt filesystems fsck)

Если используется initramfs на основе systemd, вместо этого добавьте хуки `keyboard` и `sd-encrypt`. Если на этапе загрузки системы вы хотите использовать неамериканскую (не US) консольную карту клавиш или нестандартный шрифт консоли, дополнительно добавьте хук `sd-vconsole`.

    HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt filesystems fsck)

Пересоберите initramfs после сохранения изменений. Смотрите dm-crypt/System configuration#mkinitcpio для дополнительных подробностей и других хуков, которые вам могут понадобиться.

### Настройка загрузчика

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

    cryptdevice=UUID=device-UUID:root root=/dev/mapper/root

Если используется sd-encrypt хук, вместо этого нужно установить:

    rd.luks.name=device-UUID=root root=/dev/mapper/root

`device-UUID` нужно заменить на UUID суперблока LUKS, в этом примере это UUID `/dev/sda2`. Подробности в Persistent block device naming.

Также смотрите dm-crypt/System configuration#Kernel parameters для дополнительных деталей.

Совет Если корневой раздел находится на том же диске, что и `/boot` раздел, и ваш UEFI загрузчик поддерживает автомонтирование GPT-раздела, вы можете настроить идентификаторы GUID для типов разделов (тип должен быть "Root partition", а не "LUKS partition") и полагаться на systemd-gpt-auto-generator(8) вместо использования параметров ядра.

## LUKS на разделе с TPM2 и Secure Boot

Этот пример аналогичен #LUKS на разделе, но интегрирует использование Secure Boot и Trusted Platform Module (TPM), повышая общую безопасность процесса загрузки.

В этой конфигурации остается незашифрованным только системный раздел EFI, в котором размещается унифицированный образ ядра и systemd-boot, оба подписаны для использования с Secure Boot. Если Secure Boot отключен или его базы данных ключей изменены, TPM не выдаст ключ для разблокировки зашифрованного раздела. Этот подход аналогичен BitLocker на Windows или FileVault на macOS. Ключ восстановления также будет создан, чтобы обеспечить доступ к данным в случае проблем с разблокировкой TPM (неподписанный загрузчик или обновление ядра, обновление прошивки и т.д.). По желанию, TPM может быть настроен для требования PIN при загрузке, чтобы предотвратить автоматическое разблокирование.

Убедитесь, что внимательно прочитали обсуждение и предупреждения в Trusted Platform Module#LUKS encryption.

В этом примере разделы создаются с учетом systemd (Русский)#Автомонтирование GPT-раздела, нет необходимости в файле fstab или crypttab.

    +-----------------------+---------------------------------+
    | EFI system partition  | LUKS encrypted root partition   |
    |                       |                                 |
    |                       |                                 |
    | /boot                 | /                               |
    |                       |                                 |
    |                       | /dev/mapper/root                |
    |                       |---------------------------------|
    | /dev/sda1             | /dev/sda2                       |
    +-----------------------+---------------------------------+

Следуйте Installation guide (Русский) до шага Installation guide (Русский)#Разметка дисков.

### Подготовка диска

Перед созданием любых разделов вы должны узнать о важности безопасного стирания диска и его методах, описанных в dm-crypt/Drive preparation.

Диск должен бытьразмечен с использованием Таблицы разделов GUID (GPT). Создайте на нём необходимые разделы.

Создайте системный раздел EFI (`/dev/sda1` в этом примере) с подходящим размером. Он будет позже смонтирован в `/boot`.

В оставшемся пространстве на диске создайте корневой раздел (`/dev/sda2` в этом примере), который будет зашифрован и позже смонтирован в `/`. Установите его GUID типа раздела на `4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709` ("Linux root (x86-64)" в fdisk, `8304` в gdisk).

### Подготовка корневого раздела

Следующие команды создают и монтируют зашифрованный корневой раздел. Они соответствуют процедуре, описанной подробно в dm-crypt/Device encryption#Encrypting devices with LUKS mode.

Если вы хотите использовать определенные нестандартные параметры шифрования (например, особый шифр, или нестандартную длину ключа), или если вы не хотите использовать дешифровку на основе TPM, посмотрите настройки шифрования перед выполнением первой команды.

Создайте том LUKS (вы можете просто использовать пустой пароль, так как он будет удален позже) и смонтируйте его:

    # cryptsetup luksFormat /dev/sda2
    # cryptsetup open /dev/sda2 root

Создайте файловую систему на разблокированном устройстве LUKS. Например, чтобы создать файловую систему Ext4, выполните:

    # mkfs.ext4 /dev/mapper/root

Смонтируйте том root в `/mnt`:

    # mount /dev/mapper/root /mnt

### Подготовка системного раздела EFI

Важно Форматируйте системный раздел EFI только в том случае, если он был только что создан на этапе разметки. Если на диске уже есть системный раздел EFI, его переформатирование удалит загрузчики других ранее установленных операционных систем.
Совет При наличиии других установленных систем использующих `/boot` лучше создавать отдельные разделы для `/boot` каждой системы, при этом EFI-раздел, в каждой системе можно монтировать в `/efi`

Если системный раздел EFI был только что создан, отформатируйте его как указано в EFI system partition (Русский)#Форматирование раздела, и смонтируйте его после этого.

    # mount --mkdir /dev/sda1 /mnt/boot

Продолжите процесс установки до Installation guide (Русский)#Initramfs. Вы можете пропустить Installation guide (Русский)#Fstab.

### Настройка mkinitcpio

Чтобы создать рабочий initramfs на основе systemd, измените строку `HOOKS=` в mkinitcpio.conf следующим образом:

    HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt filesystems fsck)

Далее см. Unified kernel image#mkinitcpio для настройки mkinitcpio для унифицированных образов ядра.

Не пересобирайте initramfs пока, так как каталог `/boot/EFI/Linux` должен сначала быть создан установщиком загрузчика.

### Установка загрузчика

Вы можете настроить свою систему для прямой загрузки UEFI образа без какого-либо загрузчика, см. Unified kernel image#Directly from UEFI.

Если нужен загрузчик, продолжите установку systemd-boot с помощью

    # bootctl install

Унифицированный образ ядра, генерируемый mkinitcpio, будет автоматически распознан и не требует записи в `/boot/loader/entries/`.

Смотрите systemd-boot#Updating the UEFI boot manager и systemd-boot#Loader configuration для дальнейшей настройки.

### Финальная установка

Сначала пересоберите initramfs и убедитесь, что генерация образа прошла успешно.

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

### Secure Boot

Теперь вы можете подписать исполняемые файлы загрузчика и бинарный файл EFI, чтобы включить Secure Boot. Для быстрого и простого способа смотрите Unified Extensible Firmware Interface/Secure Boot#Assisted process with sbctl.

### Регистрация TPM

После подписания исполняемых файлов загрузчика и включения Secure Boot, вы сможете зарегистрировать TPM, чтобы использовать его для разблокировки тома LUKS. Следующие команды удалят пустой пароль, созданный во время процесса форматирования LUKS, создадут ключ, привязанный к TPM PCR 7 (состояние Secure Boot и зарегистрированные сертификаты) и создадут резервный ключ восстановления для использования на случай возникновения каких-либо проблем. Если проблем нет, TPM автоматически выдаёт ключ, если считает, что цепочка зарузки системы не скомпроментирована на любом из её этапов. Смотрите systemd-cryptenroll#Trusted Platform Module и systemd-cryptenroll(1).

    # systemd-cryptenroll /dev/sda2 --recovery-key
    # systemd-cryptenroll /dev/sda2 --wipe-slot=empty --tpm2-device=auto --tpm2-pcrs=7

Совет Добавьте `--tpm2-with-pin=yes` для требования дополнительного PIN при разблокировке во время загрузки.
Важно

- Убедитесь, что Secure Boot активен и находится в пользовательском режиме при привязке к PCR 7, иначе неавторизованные загрузочные устройства могут разблокировать зашифрованный том.
- Состояние PCR 7 может измениться, если изменятся сертификаты прошивки, что может привести к блокировке пользователя. Это может быть сделано неявно fwupd[2] или явно путем ротации ключей Secure Boot.

## LVM внутри LUKS

Технически LVM настраивается внутри одного большого зашифрованного блочного устройства. Поэтому LVM не виден до тех пор, пока блочное устройство не разблокировано и структура базового тома не сканируется и не смонтирована во время загрузки.

Схема диска в этом примере выглядит так:

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

Примечание При использовании хука `encrypt` этот метод не позволяет распределить логические тома на несколько дисков; либо используйте sd-encrypt, либо смотрите dm-crypt/Specialties#Modifying the encrypt hook for multiple partitions.
Совет Две дополнительные опции этой настройки:

- Инструкции в dm-crypt/Specialties#Encrypted system using a detached LUKS header используют эту настройку с отделенным заголовком LUKS на USB-устройстве для достижения двухфакторной аутентификации.
- Инструкции в dm-crypt/Specialties#Encrypted /boot and a detached LUKS header on USB используют эту настройку с отделенным заголовком LUKS, зашифрованным разделом `/boot` и зашифрованным файлом ключа, все на USB-устройстве.

### Подготовка диска

Перед созданием любых разделов вы должны узнать о важности безопасного стирания диска и его методах, описанных в dm-crypt/Drive preparation.

Совет При использовании загрузчика GRUB для загрузки BIOS с диска GPT смотрите GRUB#GUID Partition Table (GPT) specific instructions

Создайте раздел для монтирования в `/boot` размером 1 ГиБ или больше.

Совет Системы UEFI могут использовать EFI system partition для `/boot`.

Создайте раздел, который позже будет содержать крипто-контейнер.

Создайте крипто-контейнер LUKS на назначенном разделе. Введите новый пароль дважды.

    # cryptsetup luksFormat /dev/sda1

Для получения дополнительной информации о доступных параметрах cryptsetup смотрите варианты шифрования LUKS перед выполнением вышеуказанной команды.

Откройте контейнер:

    # cryptsetup open /dev/sda1 cryptlvm

введите придуманный ранее пароль в третий раз

Расшифрованный контейнер теперь доступен в `/dev/mapper/cryptlvm`.

### Подготовка логических томов

Создайте физический том внутри открытого контейнера LUKS:

    # pvcreate /dev/mapper/cryptlvm

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

    # vgcreate MyVolGroup /dev/mapper/cryptlvm

Создайте все ваши логические тома в группе томов:

Совет Если логический том будет отформатирован с ext4, оставьте не менее 256 МиБ свободного места в группе томов, чтобы разрешить использование e2scrub(8). После создания последнего тома с `-l 100%FREE` это можно выполнить, уменьшив его размер с помощью `lvreduce -L -256M MyVolGroup/home`.

    # lvcreate -L 4G -n swap MyVolGroup
    # lvcreate -L 32G -n root MyVolGroup
    # lvcreate -l 100%FREE -n home MyVolGroup

Отформатируйте ваши файловые системы на каждом логическом томе. Например, используя Ext4 для корневого тома и тома home:

    # mkfs.ext4 /dev/MyVolGroup/root
    # mkfs.ext4 /dev/MyVolGroup/home
    # mkswap /dev/MyVolGroup/swap

Смонтируйте ваши файловые системы:

    # mount /dev/MyVolGroup/root /mnt
    # mount --mkdir /dev/MyVolGroup/home /mnt/home
    # swapon /dev/MyVolGroup/swap

### Подготовка загрузочного раздела

Важно Форматируйте системный раздел EFI только в том случае, если он был только что создан на этапе разметки. Если на диске уже есть системный раздел EFI, его переформатирование удалит загрузчики других ранее установленных операционных систем.
Совет При наличиии других установленных систем использующих `/boot` лучше создавать отдельные разделы для `/boot` каждой системы, при этом EFI-раздел, в каждой системе можно монтировать в `/efi`

Загрузчик загружает ядро, initramfs и свои собственные конфигурационные файлы из каталога `/boot`. Подходит любая файловая система на диске, которая может быть прочитана загрузчиком.

Создайте файловую систему на разделе, предназначенном для `/boot`. Для EFI system partition на системах с UEFI выполните:

    # mkfs.fat -F32 /dev/sdb1

или для обычного загрузочного раздела на системах с BIOS:

    # mkfs.ext4 /dev/sdb1

Смонтируйте раздел в `/mnt/boot`:

    # mount --mkdir /dev/sdb1 /mnt/boot

В этот момент возобновите общие шаги из Installation guide (Русский)#Установка. Вернитесь на эту страницу, чтобы настроить шаги Installation guide (Русский)#Initramfs и Installation guide (Русский)#Загрузчик.

### Настройка mkinitcpio

Убедитесь, что пакет lvm2 установлен.

Если используется стандартный initramfs на основе busybox, добавьте хуки `keyboard`, `encrypt` и `lvm2` в mkinitcpio.conf. Если на этапе загрузки системы вы хотите использовать неамериканскую (не US) консольную карту клавиш или нестандартный шрифт консоли, дополнительно добавьте хуки `keymap` и `consolefont` соответственно.

Примечание Обратите внимание, что в отличие от сценария #LUKS внутри LVM хук `lvm2` расположен после `encrypt`

    HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt lvm2 filesystems fsck)

Если используется initramfs на основе systemd, вместо этого добавьте хуки `keyboard`, `sd-encrypt` и `lvm2`. Если на этапе загрузки системы вы хотите использовать неамериканскую (не US) консольную карту клавиш или нестандартный шрифт консоли, дополнительно добавьте хук `sd-vconsole`.

    HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt lvm2 filesystems fsck)

Пересоберите initramfs после сохранения изменений. Смотрите dm-crypt/System configuration#mkinitcpio для деталей и других хуков, которые вам могут понадобиться.

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

### Настройка загрузчика

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

    cryptdevice=UUID=device-UUID:cryptlvm root=/dev/MyVolGroup/root

Если используется хук sd-encrypt, вместо этого нужно установить следующее:

    rd.luks.name=device-UUID=cryptlvm root=/dev/MyVolGroup/root

`device-UUID` нужно заменить на UUID суперблока LUKS, в этом примере это UUID `/dev/sda1`. Подробнее смотрите Persistent block device naming (Русский).

Если используется dracut, известно, что эти параметры работают:

    rd.luks.uuid=device-UUID root=/dev/MyVolGroup/root

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

    rd.luks.uuid=luks-deviceUUID rd.lvm.lv=MyVolGroup/root  rd.lvm.lv=MyVolGroup/swap  root=/dev/mapper/MyVolGroup-root rootfstype=ext4 rootflags=rw,relatime

Смотрите dm-crypt/System configuration#Kernel parameters если нужны подробности.

## LUKS внутри LVM

Чтобы использовать шифрование внутри структуры LVM (шифрование его логических томов, а не физических), сначала настраивается LVM (физические тома, группы томов, логические тома), а затем на определённых логических томах LVM создаются не сразу файловые системы, а крипто-контейнеры LUKS, для размещения файловых систем внутри них. Таким образом, возможно сочетание зашифрованных и незашифрованных томов/разделов.

Примечание В отличие от #LVM внутри LUKS, этот метод позволяет легче распределить логические тома на несколько физических дисков.

Следующий короткий пример создает LUKS внутри LVM и сочетает использование файла ключа для раздела `/home`. А также тома для подкачки, который после каждой перезагрузки использует автоматически созданый новый временный ключ. Это правильно продумано с точки зрения безопасности, так как никакие потенциально чувствительные данные не сохраняются после перезагрузки в открытом виде в подкачке, они остаются зашифрованы старым ключём, который более не доступен т.к. шифрование подкачки переинициализируется с каждый раз новым временным ключём после перезагрузки. Если вы знакомы с LVM, вы можете настроить под себя различные специфические детали в соответствии с вашими потребностями.

Если вы хотите расширить логический том на несколько дисков, которые уже настроены, или увеличить логический том для `/home` (или любого другого тома), описание процедуры для этого описано в dm-crypt/Specialties#Expanding LVM on multiple disks. Важно отметить, что зашифрованный контейнер LUKS тогда также должен быть увеличен.

### Подготовка диска

Схема разбиения:

    +----------------+-------------------------------------------------------------------------------------------------+
    | Boot partition | dm-crypt plain encrypted volume | LUKS encrypted volume         | LUKS encrypted volume         |
    |                |                                 |                               |                               |
    | /boot          | [SWAP]                          | /                             | /home                         |
    |                |                                 |                               |                               |
    |                | /dev/mapper/swap                | /dev/mapper/root              | /dev/mapper/home              |
    |                |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
    |                | Logical volume 1                | Logical volume 2              | Logical volume 3              |
    |                | /dev/MyVolGroup/cryptswap       | /dev/MyVolGroup/cryptroot     | /dev/MyVolGroup/crypthome     |
    |                |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
    |                |                                                                                                 |
    |   /dev/sda1    |                                   /dev/sda2                                                     |
    +----------------+-------------------------------------------------------------------------------------------------+

Перед использованием `/dev/sda2` можно рандомизировать данные как описано в dm-crypt/Drive preparation#dm-crypt wipe on an empty device or partition.

### Подготовка логических томов

    # pvcreate /dev/sda2
    # vgcreate MyVolGroup /dev/sda2
    # lvcreate -L 4G -n cryptswap MyVolGroup
    # lvcreate -L 32G -n cryptroot MyVolGroup
    # lvcreate -l 100%FREE -n crypthome MyVolGroup

    # cryptsetup luksFormat /dev/MyVolGroup/cryptroot
    # cryptsetup open /dev/MyVolGroup/cryptroot root

Создайте файловую систему на разблокированном устройстве LUKS и смонтируйте его. Например, чтобы создать файловую систему Ext4, выполните:

    # mkfs.ext4 /dev/mapper/root
    # mount /dev/mapper/root /mnt

Дополнительную информацию о параметрах шифрования можно найти в dm-crypt/Device encryption#Encryption options for LUKS mode. Обратите внимание, что `/home` будет зашифрован в #Шифрование логического тома /home.

Совет Если вам когда-либо понадобится получить доступ к зашифрованному корню из Arch-ISO или из другой операционной системы, вышеуказанное действие `open` позволит вам открыть крипто-контейнер при условии что логический том LVM c данным контейнером активен.

### Подготовка загрузочного раздела

Важно Форматируйте системный раздел EFI только в том случае, если он был только что создан на этапе разметки. Если на диске уже есть системный раздел EFI, его переформатирование удалит загрузчики других ранее установленных операционных систем.
Совет При наличиии других установленных систем использующих `/boot` лучше создавать отдельные разделы для `/boot` каждой системы, при этом EFI-раздел, в каждой системе можно монтировать в `/efi`

Создайте файловую систему на разделе, предназначенном для `/boot`. Для EFI system partition на системах c UEFI выполните:

    # mkfs.fat -F32 /dev/sda1

или для обычного загрузочного раздела на системах c BIOS:

    # mkfs.ext4 /dev/sda1

После этого создайте каталог для точки монтирования и смонтируйте раздел:

    # mount --mkdir /dev/sda1 /mnt/boot

### Настройка mkinitcpio

Убедитесь, что пакет lvm2 установлен.

Если используется стандартный initramfs на основе busybox, добавьте хуки `keyboard`, `encrypt` и `lvm2` в mkinitcpio.conf. Если на этапе загрузки системы вы хотите использовать неамериканскую (не US) консольную карту клавиш или нестандартный шрифт консоли, дополнительно добавьте хуки `keymap` и `consolefont` соответственно.

Примечание Обратите внимание, что в отличие от сценария #LVM внутри LUKS хук `lvm2` расположен перед `encrypt`

    HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block lvm2 encrypt filesystems fsck)

Если используется initramfs на основе systemd, вместо этого добавьте хуки `keyboard`, `sd-encrypt` и `lvm2`. Если на этапе загрузки системы вы хотите использовать неамериканскую (не US) консольную карту клавиш или нестандартный шрифт консоли, дополнительно добавьте хук `sd-vconsole`.

    HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt lvm2 filesystems fsck)

Пересоберите initramfs после сохранения изменений. Смотрите dm-crypt/System configuration#mkinitcpio для деталей и других хуков, которые вам могут понадобиться.

### Настройка загрузчика

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

    cryptdevice=UUID=device-UUID:root root=/dev/mapper/root

Если используется хук sd-encrypt, вместо этого нужно установить следующее:

    rd.luks.name=device-UUID=root root=/dev/mapper/root

`device-UUID` нужно заменить на UUID суперблока LUKS, в этом примере это UUID `/dev/MyVolGroup/cryptroot`. Смотрите Persistent block device naming (Русский) для деталей.

Смотрите dm-crypt/System configuration#Kernel parameters для деталей.

### Настройка fstab и crypttab

Требуются записи как в crypttab, так и в fstab для разблокировки устройства и монтирования файловых систем соответственно. Следующие строки будут повторно шифровать том подкачки при каждой перезагрузке:

    /etc/crypttab

    swap	/dev/MyVolGroup/cryptswap	/dev/urandom	swap,cipher=aes-xts-plain64,size=256,sector-size=4096

    /etc/fstab

    /dev/mapper/root                          /     ext4   defaults  0 1
    UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /boot ext4   defaults  0 2
    /dev/mapper/swap                          none  swap   defaults  0 0

### Шифрование логического тома /home

Поскольку этот сценарий использует LVM в качестве основного маппера, а dm-crypt в качестве вторичного, каждый зашифрованный логический том требует собственного шифрования. Однако, в отличие от временных файловых систем, настроенных с изменчивым шифрованием выше, логический том для `/home` должен, конечно, быть постоянным. Следующее предполагает, что вы перезагрузились в установленную систему, иначе вам нужно отрегулировать пути. Чтобы избежать ввода второго пароля при загрузке, создается файл ключа:

    # dd bs=512 count=4 if=/dev/random iflag=fullblock | install -m 0600 /dev/stdin /etc/cryptsetup-keys.d/home.key

Логический том шифруется с его помощью:

    # cryptsetup luksFormat -v /dev/MyVolGroup/crypthome /etc/cryptsetup-keys.d/home.key
    # cryptsetup -d /etc/cryptsetup-keys.d/home.key open /dev/MyVolGroup/crypthome home

Создайте файловую систему на разблокированном устройстве LUKS и смонтируйте его. Например, чтобы создать файловую систему Ext4, выполните:

    # mkfs.ext4 /dev/mapper/home
    # mount /dev/mapper/home /home

Зашифрованное монтирование настраивается как в crypttab, так и в fstab:

    /etc/crypttab

    home	/dev/MyVolGroup/crypthome   none

    /etc/fstab

    /dev/mapper/home        /home   ext4        defaults        0       2

## LUKS внутри программного RAID

Этот пример основан на реальной настройке ноутбука класса рабочей станции, оснащенного двумя SSD, равных по размеру, и дополнительным HDD под файловое хранилище. Конечный результат — полное шифрование (включая `/boot`) для всех дисков, с SSD в массиве RAID0, файлы-ключи используются для разблокировки после того как GRUB получает правильный пароль при загрузке.

Этот способ использует очень простую схему разбиения: содержимое RAID монтируется в `/` (без использования отдельного `/boot` раздела), а расшифрованный HDD монтируется в `/data`.

Пожалуйста, обратите внимание, что регулярные резервные копии очень важны в данном случае. Если один из SSD выходит из строя, данные, содержащиеся в массиве RAID, будут практически невозможно восстановить. Возможно, вы захотите выбрать другой уровень RAID если важно обеспечить отказоустойчивость.

Шифрование не является отрицаемым при такой настройке.

Будем считать, что для наших целей в нижеприведенных инструкциях используются следующие блочные устройства:

    /dev/sda = первый SSD
    /dev/sdb = второй SSD
    /dev/sdc = HDD

    +---------------------+---------------------------+---------------------------+ +---------------------+---------------------------+---------------------------+ +---------------------------+
    | BIOS boot partition | EFI system partition      | LUKS encrypted volume     | | BIOS boot partition | EFI system partition      | LUKS encrypted volume     | | LUKS encrypted volume     |
    |                     |                           |                           | |                     |                           |                           | |                           |
    |                     | /efi                      | /                         | |                     | /efi                      | /                         | | /data                     |
    |                     |                           |                           | |                     |                           |                           | |                           |
    |                     |                           | /dev/mapper/root          | |                     |                           | /dev/mapper/root          | |                           |
    |                     +---------------------------+---------------------------+ |                     +---------------------------+---------------------------+ |                           |
    |                     | RAID1 array (part 1 of 2) | RAID0 array (part 1 of 2) | |                     | RAID1 array (part 2 of 2) | RAID0 array (part 2 of 2) | |                           |
    |                     |                           |                           | |                     |                           |                           | |                           |
    |                     | /dev/md/ESP               | /dev/md/root              | |                     | /dev/md/ESP               | /dev/md/root              | | /dev/mapper/data          |
    |                     +---------------------------+---------------------------+ |                     +---------------------------+---------------------------+ +---------------------------+
    | /dev/sda1           | /dev/sda2                 | /dev/sda3                 | | /dev/sdb1           | /dev/sdb2                 | /dev/sdb3                 | | /dev/sdc1                 |
    +---------------------+---------------------------+---------------------------+ +---------------------+---------------------------+---------------------------+ +---------------------------+

Используйте названия устройств соответствующие вашей системе, так как они могут отличаться.

### Подготовка дисков

Перед созданием любых разделов вы должны узнать о важности безопасного стирания диска и его методах, описанных в dm-crypt/Drive preparation.

Для BIOS systems с GPT, создайте BIOS boot partition с размером 1 MiB для GRUB для хранения второй стадии загрузчика BIOS. Не монтируйте этот раздел.

Для оборудования с UEFI создайте системный раздел EFI с подходящим размером, он будет позже смонтирован в `/efi`.

В оставшемся пространстве на диске создайте раздел (`/dev/sda3` в этом примере) для "Linux RAID". Выберите идентификатор типа раздела MBR `fd` или идентификатор типа GUID `A19D880F-05FC-4D3B-A006-743F0F84911E` для GPT.

После создания разделов на `/dev/sda`, следующие команды могут использоваться для их клонирования на `/dev/sdb`.

    # sfdisk -d /dev/sda > sda.dump
    # sfdisk /dev/sdb < sda.dump

В HDD используем один раздел `/dev/sdc1`, который занимает всё место на диске.

### Построение массива RAID

Создайте массив RAID для SSD.

Примечание

- Операционная система должна быть загружаемой с каждого системнго раздела EFI на каждом из дисков по отдельности, это значит, что именно для EFI-разделов требуется использовать зеркальный RAID1 вместо чередования данных RAID0.
- Суперблок RAID должен быть размещен в конце раздела EFI с использованием `--metadata=1.0`, иначе прошивка не сможет получить доступ к разделу.

    # mdadm --create --verbose --level=1 --metadata=1.0 --raid-devices=2 /dev/md/ESP /dev/sda2 /dev/sdb2

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

    # mdadm --create --verbose --level=0 --metadata=1.2 --raid-devices=2 /dev/md/root /dev/sda3 /dev/sdb3

### Подготовка блочных устройств

Как объяснено в dm-crypt (Русский)/Drive preparation (Русский), устройства стираются случайными данными с использованием `/dev/zero` и криптоустройства с случайным ключом. В качестве альтернативы вы можете использовать `dd` с `/dev/random` или `/dev/urandom`, хотя это будет намного медленнее.

    # cryptsetup open --type plain --sector-size 4096 --key-file /dev/urandom /dev/md/root to_be_wiped
    # dd if=/dev/zero of=/dev/mapper/to_be_wiped bs=1M status=progress
    # cryptsetup close to_be_wiped

И повторите вышеуказанное для HDD (`/dev/sdc1` в этом примере).

Настройте шифрование для `/dev/md/root`:

    # cryptsetup -v luksFormat /dev/md/root
    # cryptsetup open /dev/md/root root

Создайте файловую систему на разблокированном устройстве LUKS. Например, чтобы создать файловую систему Ext4, выполните:

    # mkfs.ext4 /dev/mapper/root

Смонтируйте корневой том в `/mnt`:

    # mount /dev/mapper/root /mnt

И повторите для HDD:

    # cryptsetup -v luksFormat /dev/sdc1
    # cryptsetup open /dev/sdc1 data
    # mkfs.ext4 /dev/mapper/data
    # mount --mkdir /dev/mapper/data /mnt/data

Для систем UEFI настройте системный раздел EFI:

Важно Форматируйте системный раздел EFI только в том случае, если он был только что создан на этапе разметки. Если на диске уже есть системный раздел EFI, его переформатирование удалит загрузчики других ранее установленных операционных систем.

    # mkfs.fat -F32 /dev/md/ESP
    # mount --mkdir /dev/md/ESP /mnt/efi

### Настройка GRUB

Настройте GRUB для зашифрованной системы LUKS, отредактировав `/etc/default/grub` следующим образом:

    GRUB_CMDLINE_LINUX="cryptdevice=/dev/md/root:root"
    GRUB_ENABLE_CRYPTODISK=y

Если у вас USB клавиатура на новой системе, либо включите поддержку устаревшего USB в прошивке, либо добавьте следующее в `/etc/default/grub`:

    GRUB_TERMINAL_INPUT="usb_keyboard"
    GRUB_PRELOAD_MODULES="usb usb_keyboard ohci uhci ehci"

Иначе вы рискуете не иметь возможность использовать клавиатуру в приглашении LUKS.

Смотрите dm-crypt/System configuration#Kernel parameters и GRUB#Encrypted /boot для деталей.

Завершите установку GRUB на оба SSD (на самом деле, установка только на `/dev/sda` тоже будет работать).

    # grub-install --target=i386-pc /dev/sda
    # grub-install --target=i386-pc /dev/sdb
    # grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB
    # grub-mkconfig -o /boot/grub/grub.cfg

### Создание файлов ключей

Следующие шаги позволяют вам избежать ввода пароля дважды при загрузке системы (один раз для GRUB, чтобы разблокировать LUKS устройство, и второй раз, когда initramfs принимает управление системой). Это делается путем создания файла ключа для шифрования и добавления его в образ initramfs, чтобы задействовать хук encrypt для разблокировки корневого устройства. Смотрите dm-crypt/Device encryption#With a keyfile embedded in the initramfs для деталей.

- Создайте файл ключа и добавьте ключ в `/dev/md/root`.
- Создайте другой файл ключа для HDD (`/dev/sdc1`) так, чтобы он также мог быть разблокирован при загрузке. Для удобства оставьте пароль, созданный выше, на месте, так как это может облегчить восстановление, если вам когда-нибудь понадобится получить доступ к зашифрованному HDD по парольной фразе, не имеея доступа к файлу ключа, хранящегося внутри зашифрованного системного раздела. Отредактируйте `/etc/crypttab`, чтобы расшифровать HDD при загрузке. Смотрите dm-crypt/System configuration#Unlocking with a keyfile.

### Настройка системы

Отредактируйте fstab для монтирования блочных устройств root и data, а также ESP:

    /dev/mapper/root  /	  ext4	rw,noatime 	   0 1
    /dev/mapper/data  /data   ext4	defaults           0 2
    /dev/md/ESP       /efi     vfat	rw,relatime,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,tz=UTC,errors=remount-ro  	0 2

Сохраните конфигурацию RAID:

    # mdadm --detail --scan >> /etc/mdadm.conf

Отредактируйте mkinitcpio.conf, чтобы задействовать ваш файл ключа и использовать нужные хуки:

    /etc/mkinitcpio.conf

    ...
    FILES=(/crypto_keyfile.bin)
    ...
    HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block mdadm_udev encrypt filesystems fsck)
    ...

Смотрите dm-crypt/System configuration#mkinitcpio для деталей.

## Простой dm-crypt

В отличие от LUKS, dm-crypt в обычном режиме (plain mode) не требует заголовка на зашифрованном устройстве: этот сценарий использует данную особенность для настройки системы на полностью зашифрованном диске, который будет неотличим от неразмеченного диска, заполненного случайными данными, что может обеспечить отрицаемое шифрование. Смотрите также wikipedia:Disk encryption#Full disk encryption.

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

Plain dm-crypt encryption может быть более устойчивым к повреждению, чем LUKS, так как он не зависит от ключа шифрования, который может быть одной точкой отказа, если поврежден или принудительно уничтожен. Однако использование режима plain также требует более тонкой настройки параметров шифрования для достижения той же криптографической стойкости. Смотрите также Data-at-rest encryption#Cryptographic metadata. Использование plain mode также может рассматриваться, если вы беспокоитесь о проблемах, описанных в dm-crypt/Specialties#Discard/TRIM support for solid state drives (SSD).

Совет Если шифрование без заголовка это ваша цель, но вы не уверены в крипто-стойкости из-за отсутствия её повышения в режиме plain, то есть две альтернативы:

- dm-crypt LUKS режим с отделенным заголовком с использованием опции cryptsetup `--header`. Он не может использоваться со стандартным хуком encrypt, но хук может быть специально для этого модифицирован.
- tcplay, который предлагает шифрование без заголовка, но с функцией PBKDF2.

Данный сценарий использует два USB-накопителя:

- Первый для загрузочного раздела, монтирующегося в `/boot`, что также позволит сохранить в конфигурации все параметры для разблокировки «простого» (plain) dm-crypt. Это удобно, чтобы избежать ошибок при ручном вводе сложных опций при каждой загрузке;
- Другой для файла ключа шифрования, в данном случае он хранится среди сырых (raw) битов, так что для потенциального злоумышленника, который может завладеть накопителем, но не знающего какой именно ключ нужен для расшифровки, он будет выглядеть как случайные данные вместо того, чтобы быть похожим на обычный файл ключа (Wikipedia:ru:Безопасность через неясность). Следуйте инструкциям в dm-crypt/Device encryption#Keyfiles для подготовки файла ключа.

Диск схематически выглядит так:

    +----------------------+----------------------+----------------------+ +----------------+ +----------------+
    | Logical volume 1     | Logical volume 2     | Logical volume 3     | | Boot device    | | Encryption key |
    |                      |                      |                      | |                | | file storage   |
    | /                    | [SWAP]               | /home                | | /boot          | | (unpartitioned |
    |                      |                      |                      | |                | | in example)    |
    | /dev/MyVolGroup/root | /dev/MyVolGroup/swap | /dev/MyVolGroup/home | | /dev/sdb1      | | /dev/sdc       |
    |----------------------+----------------------+----------------------| |----------------| |----------------|
    | disk drive /dev/sda encrypted using plain mode and LVM             | | USB stick 1    | | USB stick 2    |
    +--------------------------------------------------------------------+ +----------------+ +----------------+

Совет

- Также возможно использовать одно физическое USB-устройство, одним из слудующих способов:
  - Поместив ключ на другой раздел `/dev/sdb2` USB-устройства `/dev/sdb`.
  - Скопировав файл ключа напрямую в initramfs. Пример файла ключа `/etc/cryptsetup-keys.d/root.key` копируется в образ initramfs установкой `FILES=(/etc/cryptsetup-keys.d/root.key)` в `/etc/mkinitcpio.conf`. Способ указать хуку `encrypt` прочитать файл ключа в образе initramfs - использовать префикс `rootfs:` перед именем файла, например `cryptkey=rootfs:/etc/cryptsetup-keys.d/root.key`.
- Другой вариант - использование пароля с хорошей энтропией.

### Подготовка диска

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

Смотрите dm-crypt/Drive preparation и dm-crypt/Drive preparation#dm-crypt specific methods

### Подготовка незагрузочных разделов

Смотрите подробнее: dm-crypt/Device encryption#Encryption options for plain mode.

Используя устройство `/dev/sda`, с методом шифрования aes-xts с размером ключа 512 бит и используя файл ключа, мы имеем следующие параметры для этого сценария:

    # cryptsetup open --type plain --cipher=aes-xts-plain64 --offset=0 --key-file=/dev/sdc --key-size=512 --sector-size 4096 /dev/sda cryptlvm

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

Мы можем теперь проверить что маппинг сработал в `/dev/mapper/cryptlvm`:

    # fdisk -l

Совет

- Более простая альтернатива использованию LVM, рекомендуемая в FAQ cryptsetup для случаев, когда LVM не нужен: просто создать файловую систему на всём замаппенном устройстве dm-crypt.
- Если логический том будет отформатирован в ext4, оставьте не менее 256 МиБ свободного места в группе томов для разрешения использования e2scrub(8). После создания последнего тома с `-l 100%FREE` это можно выполнить, уменьшив его размер с помощью `lvreduce -L -256M MyVolGroup/home`.

Далее мы настраиваем логические тома LVM на замаппенном устройстве. (Смотрите Install Arch Linux on LVM более детального описания команд):

    # pvcreate /dev/mapper/cryptlvm
    # vgcreate MyVolGroup /dev/mapper/cryptlvm
    # lvcreate -L 32G MyVolGroup -n root
    # lvcreate -L 4G MyVolGroup -n swap
    # lvcreate -l 100%FREE MyVolGroup -n home

Далее форматируем и монтируем их, активируем подкачку. (более детальное описание комманд: File systems#Create a file system):

    # mkfs.ext4 /dev/MyVolGroup/root
    # mkfs.ext4 /dev/MyVolGroup/home
    # mount /dev/MyVolGroup/root /mnt
    # mount --mkdir /dev/MyVolGroup/home /mnt/home
    # mkswap /dev/MyVolGroup/swap
    # swapon /dev/MyVolGroup/swap

### Подготовка загрузочного раздела

`/boot` раздел может быть типичным разделом FAT32 на USB-накопителе, если это необходимо. Но если нужно ручное разбиение, то 1 ГиБ раздела достаточно. Создайте раздел с помощью любого инструмента разбиения на свой вкус.

Создайте файловую систему на разделе, предназначенном для `/boot`:

Важно Форматируйте системный раздел EFI только в том случае, если он был только что создан на этапе разметки. Если на диске уже есть системный раздел EFI, его переформатирование удалит загрузчики других ранее установленных операционных систем.
Совет При наличиии других установленных систем использующих `/boot` лучше создавать отдельные разделы для `/boot` каждой системы, при этом EFI-раздел, в каждой системе можно монтировать в `/efi`

    # mkfs.fat -F32 /dev/sdb1
    # mount --mkdir /dev/sdb1 /mnt/boot

### Настройка mkinitcpio

Убедитесь, что пакет lvm2 установлен.

Если используется стандартный initramfs на основе busybox, добавьте хуки `keyboard`, `encrypt` и `lvm2` в mkinitcpio.conf. Если на этапе загрузки системы вы хотите использовать неамериканскую (не US) консольную карту клавиш или нестандартный шрифт консоли, дополнительно добавьте хуки `keymap` и `consolefont` соответственно.

    HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt lvm2 filesystems fsck)

Пересоберите initramfs после сохранения изменений. Смотрите dm-crypt/System configuration#mkinitcpio для подробностей, например других хуков, которые вам могут понадобиться.

### Настройка загрузчика

Чтобы загрузить зашифрованный корневой раздел, загрузчиком должны быть установлены следующие параметры ядра (обратите внимание, что 64 — это количество байт в 512 битах):

    cryptdevice=/dev/disk/by-id/disk-ID-of-sda:cryptlvm:sector-size=4096 cryptkey=/dev/disk/by-id/disk-ID-of-sdc:0:64 crypto=:aes-xts-plain64:512:0:

Вместо `disk-ID-of-disk` требуется указать id соответствующих дисков. Смотрите Persistent block device naming (Русский) для деталей.

Смотрите dm-crypt/System configuration#Kernel parameters для деталей и других параметров, которые вам могут понадобиться.

Совет Если используется GRUB, вы можете установить его на тот же USB на кортором находится раздел для `/boot`.

Для BIOS:

    # grub-install --target=i386-pc --recheck /dev/sdb

Для UEFI:

    # grub-install --target=x86_64-efi --efi-directory=/boot --removable

### После установки

Вы можете захотеть извлечь из системы USB-накопители после загрузки. Поскольку `/boot` раздел обычно не нужен, опцию `noauto` можно добавить в соответствующую строку в `/etc/fstab`:

    /etc/fstab

    # /dev/sdb1
    UUID=XXXX-XXXX /boot vfat noauto,rw,noatime 0 2

Однако, когда обновление чего-либо в initramfs, или ядра, или загрузчика требуется; `/boot` раздел должен быть присутствующим и смонтированным. Поскольку запись в `fstab` уже существует, его можно просто смонтировать с помощью:

    # mount /boot

## Зашифрованный загрузочный раздел (GRUB)

Этот набор инструкций использует ту же схему разбиения и конфигурацию, что и раздел #LVM внутри LUKS, за исключением того, как в данном случае настраивается загрузчик GRUB, который способен загружаться и с логического тома LVM и с зашифрованного раздела для `/boot`. Смотрите также: GRUB#Encrypted /boot.

Диск схематически выглядит так:

    +---------------------+----------------------+----------------------+----------------------+----------------------+
    | BIOS boot partition | EFI system partition | Logical volume 1     | Logical volume 2     | Logical volume 3     |
    |                     |                      |                      |                      |                      |
    |                     | /efi                 | /                    | [SWAP]               | /home                |
    |                     |                      |                      |                      |                      |
    |                     |                      | /dev/MyVolGroup/root | /dev/MyVolGroup/swap | /dev/MyVolGroup/home |
    | /dev/sda1           | /dev/sda2            |----------------------+----------------------+----------------------+
    | unencrypted         | unencrypted          | /dev/sda3 encrypted using LVM on LUKS                              |
    +---------------------+----------------------+--------------------------------------------------------------------+

Совет

- Все сценарии предназначены в качестве примеров. Конечно, возможно применить оба вышеуказанных различных шага установки и с другими сценариями. Смотрите также варианты, связанные в #LVM внутри LUKS.
- Вы можете использовать скрипт `cryptboot` из пакета cryptbootAUR для упрощенного управления зашифрованной загрузкой (монтирование, размонтирование, обновление пакетов) и в качестве защиты от атак злой горничной с UEFI Secure Boot. Для получения дополнительной информации и ограничений смотрите страницу проекта cryptboot.

### Подготовка диска

Перед созданием любых разделов вы должны узнать о важности безопасного стирания диска и его методах, описанных в dm-crypt/Drive preparation.

Ваша схема разделов должна выглятить примерно так:

    # gdisk -l /dev/sda

    ...
    Number  Start (sector)    End (sector)  Size       Code  Name
       1            2048            4095   1024.0 KiB  EF02  BIOS boot partition
       2            4096         2101247   1024.0 MiB  EF00  EFI system partition
       3         2101248        69210111   32.0 GiB    8309  Linux LUKS

Для её получения на чистом диске:

Для систем с UEFI создайте EFI system partition с подходящим размером, он будет позже смонтирован в `/efi`.

Для связки BIOS/GPT создайте BIOS boot partition с размером 1 MiB для GRUB, чтобы хранить второй stage загрузчика BIOS. Не монтируйте раздел. Для BIOS/MBR настроек это не нужно.

Создайте раздел типа `8309`, который позже будет содержать крипто-контейнер для LVM.

Создайте крипто-контейнер LUKS:

    # cryptsetup luksFormat /dev/sda3

Для получения дополнительной информации о доступных параметрах cryptsetup смотрите LUKS encryption options перед выполнением вышеуказанной команды.

Откройте контейнер:

    # cryptsetup open /dev/sda3 cryptlvm

Расшифрованный контейнер теперь доступен в `/dev/mapper/cryptlvm`.

### Подготовка логических томов

Логические тома этого примера аналогичны #LVM внутри LUKS. При необходимости вы можете выполнить любую похожую разбивку в соответствии с вашими целями. Для UEFI-систем создайте точку монтирования для EFI system partition в `/efi` для совместимости с `grub-install` и смонтируйте его:

    # mount --mkdir /dev/sda2 /mnt/efi

В этот момент у вас должны быть следующие разделы и логические тома внутри `/mnt`:

    $ lsblk

    NAME                  MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    sda                   8:0      0   200G  0 disk
    ├─sda1                8:1      0     1M  0 part
    ├─sda2                8:2      0   550M  0 part  /mnt/efi
    └─sda3                8:3      0   100G  0 part
      └─cryptlvm          254:0    0   100G  0 crypt
        ├─MyVolGroup-swap 254:1    0     4G  0 lvm   [SWAP]
        ├─MyVolGroup-root 254:2    0    32G  0 lvm   /mnt
        └─MyVolGroup-home 254:3    0    60G  0 lvm   /mnt/home

Теперь в этот момент возвращаемся к общим шагам Installation guide (Русский)#Установка. Вернитесь на эту страницу, чтобы немного по другому выполнить шаги Installation guide (Русский)#Initramfs и Installation guide (Русский)#Загрузчик.

### Настройка mkinitcpio

Убедитесь, что пакет lvm2 установлен.

Если используется стандартный initramfs на основе busybox, добавьте хуки `keyboard`, `encrypt` и `lvm2` в mkinitcpio.conf. Если вы используете неамериканскую консольную карту клавиш или нестандартный шрифт консоли, дополнительно добавьте хуки `keymap` и `consolefont` соответственно.

    HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt lvm2 filesystems fsck)

Если используется initramfs на основе systemd, вместо этого добавьте хуки `keyboard`, `sd-encrypt` и `lvm2`. Если вы используете неамериканскую консольную карту клавиш или нестандартный шрифт консоли, дополнительно добавьте хук `sd-vconsole`.

    HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt lvm2 filesystems fsck)

Пересоберите initramfs после сохранения изменений. Смотрите dm-crypt/System configuration#mkinitcpio для деталей и других хуков, которые вам могут понадобиться.

### Настройка GRUB

Настройте GRUB для разрешения загрузки с `/boot` на зашифрованном при помощи LUKS разделе:

    /etc/default/grub

    GRUB_ENABLE_CRYPTODISK=y

Установите параметры ядра, чтобы initramfs мог разблокировать зашифрованный корневой раздел. Используя хук `encrypt`:

    /etc/default/grub

    GRUB_CMDLINE_LINUX="... cryptdevice=UUID=device-UUID:cryptlvm ..."

Если используется хук sd-encrypt, вместо этого нужно установить следующее:

    /etc/default/grub

    GRUB_CMDLINE_LINUX="... rd.luks.name=device-UUID=cryptlvm ..."

Смотрите dm-crypt/System configuration#Kernel parameters и GRUB#Encrypted /boot для деталей. `device-UUID` следует заменить на UUID суперблока LUKS, в этом примере это UUID `/dev/sda3` (раздел, который содержит lvm с корневой файловой системой). Смотрите Persistent block device naming (Русский).

Установите GRUB на смонтированный ESP для загрузки UEFI:

    # grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB --recheck

Если нужно загрузка с BIOS, то установите GRUB таким способом:

    # grub-install --target=i386-pc --recheck /dev/sda

Сгенерируйте конфигурационный файл GRUB:

    # grub-mkconfig -o /boot/grub/grub.cfg

Если все команды завершились без ошибок, GRUB должен запросить пароль для разблокировки раздела `/dev/sda3` после следующей перезагрузки.

### Избегание ввода пароля дважды

Хотя GRUB запрашивает пароль для разблокировки зашифрованного раздела LUKS после вышеуказанных инструкций, разблокировка раздела не передается в initramfs. Поэтому без дополнительных настроек вам нужно будет ввести пароль дважды при загрузке: один раз для GRUB и ещё один раз для initramfs.

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

Сначала создайте файл ключа и добавьте его как ключ LUKS:

    # dd bs=512 count=4 if=/dev/random iflag=fullblock | install -m 0600 /dev/stdin /etc/cryptsetup-keys.d/cryptlvm.key
    # cryptsetup -v luksAddKey /dev/sda3 /etc/cryptsetup-keys.d/cryptlvm.key

Добавьте файл ключа в образ initramfs:

    /etc/mkinitcpio.conf

    FILES=(/etc/cryptsetup-keys.d/cryptlvm.key)

Пересоберите initramfs.

Установите следующие параметры ядра для разблокировки раздела LUKS с помощью файла ключа. Используя хук `encrypt`:

    GRUB_CMDLINE_LINUX="... cryptkey=rootfs:/etc/cryptsetup-keys.d/cryptlvm.key"

При использовании хука sd-encrypt, `/etc/cryptsetup-keys.d/name.key` будет использоваться по умолчанию, поэтому дополнительные параметры ядра устанавливать не нужно.

Если по какой-то причине файл ключа не сможет разблокировать загрузочный раздел, systemd автоматически перейдёт к "плану Б" и запросит пароль и, если он окажется правильным, продолжит загрузку.

Совет Если вы хотите зашифровать раздел `/boot` для защиты от угроз физического вмешательства, хук mkinitcpio-chkcryptoboot был специально создан, чтобы помочь в этом.

### Использование USB-накопителя для разблокировки /boot

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

Сначала создайте файл ключа таким же образом, как и в #Избегание ввода пароля дважды. Лучше не используйте тот же файл ключа, что и встроен в initramfs т.к. если USB-накопитель будет потерян или скомпрометирован, вам придется делать меньше теловижений: потребуется обновить только "внешний" файл ключа.

Скопируйте этот файл ключа на ваш USB-накопитель и создайте новый файл конфигурации GRUB:

    /boot/grub/grub-pre.cfg

    set crypto_uuid=UUID-of-the-luks-volume
    set key_disk=UUID-of-the-volume-with-the-key
    cryptomount -u $crypto_uuid -k ($key_disk)/the-location-of-the-key-on-your-usb
    set root=UUID-of-the-unlocked-volume-as-in-grub.cfg
    set prefix=($root)/boot/grub
    insmod normal
    normal

Создайте образ GRUB и установите его (не все эти модули могут понадобиться в зависимости от вашей файловой системы):

    # grub-mkimage -p /boot/grub -O x86_64-efi -c /boot/grub/grub-pre.cfg -o /tmp/grubx64.efi  part_gpt  part_msdos cryptodisk  luks  gcry_rijndael gcry_sha512 lvm ext2 ntfs fat exfat
    # install -v /tmp/grubx64.efi /efi/EFI/GRUB/grubx64.efi

## Корневой раздел на ZFS

Чтобы использовать dm-crypt с ZFS, см. ZFS#Encryption in ZFS using dm-crypt.

Кроме того, ZFS имеет встроенное шифрование, которое также может использоваться для шифрования корня системы, исключая загрузчик и метаданные файловой системы. Смотрите:

- Arch Linux Root on ZFS guide на странице OpenZFS,
- Install Arch Linux on ZFS.

После установки загрузчик может быть проверен с Secure Boot на системах основанных на UEFI.

Categories:

- Data-at-rest encryption (Русский)
- Installation process (Русский)

dm-crypt (Русский)/Encrypting an entire system (Русский)
Add topic