dm-crypt (Українська)/Swap encryption (Українська)

From ArchWiki

Залежно від вимог, можуть використовуватися різні методи для шифрування розділу swap, які описані нижче. Налаштування, при якому шифрування свопу повторно ініціалізується під час перезавантаження (з новим шифром), забезпечує більш високий захист даних, оскільки дозволяє уникнути чутливих фрагментів файлів, які, можливо, були досить давно записані у своп і збереглись без перезапису. Однак повторне шифрування свопу, як правило, також забороняє використання функції призупинення на диск.

Без підтримки функції призупинення на диск

У системах, де призупинення роботи на диск (сплячий режим) не є бажаною функцією, /etc/crypttab можна налаштувати для розшифровки розділу підкачки випадковим паролем із простим dm-crypt під час завантаження. Випадковий пароль відкидається під час вимкнення, залишаючи позаду лише зашифровані, недоступні дані в пристрої обміну. Щоб увімкнути цю функцію, просто розкоментуйте рядок, що починається з swap, у /etc/crypttab. Змініть параметр <device> на ім’я вашого пристрою підкачки. Наприклад, це буде виглядати приблизно так:

/etc/crypttab
# <name>  <device>     <password>     <options>
swap      /dev/sdX#    /dev/urandom   swap,cipher=aes-xts-plain64,size=256

Це відобразить /dev/sdX# у /dev/mapper/swap як розділ підкачки, який можна додати в /etc/fstab як звичайний своп. Якщо у вас раніше був незашифрований розділ підкачки, не забудьте його відключити, або повторно використати його fstab запис, змінивши device на /dev/mapper/swap. Опцій за замовчуванням має бути достатньо для більшості використань. Інші варіанти та пояснення кожного стовпця наведено у crypttab(5), а також point cryptsetup FAQ 2.3.

Попередження: Весь вміст зазначеного пристрою буде остаточно видалено. Небезпечно використовувати для пристрою підкачки просте іменування ядра, оскільки порядок іменування пристроїв(наприклад /dev/sda, /dev/sdb) може змінюватись при кожному завантаженні . Варіанти:
  • Використовуйте шляхи by-id та by-path. Однак вони обидва сприйнятливі до апаратних змін. Див. Persistent block device naming#by-id and by-path.
  • Використовуйте ім'я логічного тому LVM.
  • Використовуйте метод, описаний у #UUID і LABEL. Мітки та UUIDS не можна використовувати безпосередньо через рекреацію та повторне шифрування пристрою підкачки при кожному завантаженні за допомогою mkswap, див. cryptsetup FAQ.
Примітка: Налаштування розділу підкачки іноді може бути невдалим, див. systemd issue 10179.

Щоб використовувати постійне іменування пристрою by-id замість простого іменування ядра, спочатку визначте пристрій підкачки:

# find -L /dev/disk -samefile /dev/sdaX
/dev/disk/by-id/ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-partX
/dev/disk/by-id/wwn-0x60015ee0000b237f-partX

Потім використовуйте як постійне посилання, наприклад для розділу /dev/sdX# (якщо повертаються два результати, як зазначено вище, виберіть один із них):

/etc/crypttab
# <name> <device>                                                        <password>    <options>
swap     /dev/disk/by-id/ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-partX /dev/urandom  swap,cipher=aes-cbc-essiv:sha256,size=256

Зауважите, що після перезавантаження і активації зашифрованого розділу підкачки, запуск для нього swapon -s показує довільний запис для відображення пристрою (наприклад, /dev/dm-1), тоді як команда lsblk показує crypt у стовпці FSTYPE. Завдяки новому шифруванню при кожному завантаженні, UUID для /dev/mapper/swap буде змінюватися кожного разу.

Примітка: Якщо розділ, вибраний для підкачки, раніше був розділом LUKS, crypttab не буде перезаписувати розділ, щоб створити розділ підкачки. Це захід безпеки для запобігання втраті даних від випадкової помилкової ідентифікації розділу підкачки в crypttab. Для того, щоб використовувати такий розділ, видаліть один раз заголовок LUKS LUKS header must be overwritten.

UUID і LABEL

Небезпечно використовувати crypttab розділ підкачки з простими іменами пристроїв ядра, такими як /dev/sdX# або навіть /dev/disk/by-id/ata-SERIAL-partX. Незначна зміна назв пристроїв або макета розділів та /etc/crypttab побачить ваші цінні дані, які будуть відформатовані під час наступного завантаження. Те саме, якщо ви використовуєте PARTUUID, а потім вирішите використовувати цей розділ для чогось іншого, не видаляючи спочатку запис crypttab.

Надійніше визначити правильний розділ, надавши йому справжній UUID або LABEL. За замовчуванням це не працює, оскільки dm-crypt та mkswap просто перезаписують будь-який вміст у цьому розділі, який також видаляє UUID та LABEL; однак можна вказати зміщення підкачки. Це дозволяє створити дуже маленьку, порожню, неправдиву файлову систему, яка не має жодної іншої мети, окрім забезпечення постійного UUID або LABEL для шифрування свопа.

Створіть файлову систему з міткою на ваш вибір:

# mkfs.ext2 -L cryptswap /dev/sdX# 1M

Незвичний параметр після імені пристрою обмежує розмір файлової системи до 1 Мб, залишаючи за собою місце для зашифрованого свопу.

# blkid /dev/sdX#
/dev/sdX#: LABEL="cryptswap" UUID="b72c384e-bd3c-49aa-b7a7-a28ea81a2605" TYPE="ext2"

Завдяки цьому /dev/sdX# тепер легко можна ідентифікувати за допомогою UUID або LABEL, незалежно від того, як в майбутньому може змінитися назва пристрою або навіть номер розділу. Залишились лише відредагувати записи /etc/crypttab та /etc/fstab:

/etc/crypttab
# <name> <device>         <password>    <options>
swap     LABEL=cryptswap  /dev/urandom  swap,offset=2048,cipher=aes-xts-plain64,size=512

Зверніть увагу на зміщення: це 2048 секторів по 512 байт, отже, 1 Мб. Таким чином зашифрований своп не вплине на LABEL/UUID файлової системи, вирівнювання даних також працює.

/etc/fstab
# <filesystem>    <dir>  <type>  <options>  <dump>  <pass>
/dev/mapper/swap  none   swap    defaults   0       0

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

Вимкнення режиму глибокого сну в робочих середовищах

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

Xfce можна налаштувати на приховування своєї кнопки Hibernate, виконавши цю команду:

$ xfconf-query -c xfce4-session -np /shutdown/ShowHibernate -t bool -s false

З підтримкою призупинення на диск

Щоб мати змогу відновити роботу після призупинення роботи комп’ютера на диск (сплячого режиму), потрібно зберегти своп простір цілим. Отже, потрібно мати раніше існуючий розділ або файл підкачки LUKS, який можна зберігати на диску або вводити вручну під час запуску.

Наступні три методи є альтернативами налаштування зашифрованого своп з підтримкою призупинення на диск. Якщо ви застосовуєте будь-який із них, пам’ятайте, що критичні дані, які система замінює, можуть потенційно залишатися в свопі протягом тривалого періоду (тобто доки він не буде перезаписаний). Щоб зменшити цей ризик, розгляньте можливість встановлення системного завдання, яке повторно шифрує своп, наприклад кожного разу, коли система переходить у звичайне відключення, разом із вибраним методом.

LVM на LUKS

Якщо том підкачки знаходиться у групі томів, яка активується в initramfs, просто дотримуйтесь інструкцій у Power management/Suspend and hibernate#Hibernation.

Використання розділу підкачки

Щоб відновити роботу із зашифрованого розділу підкачки, зашифрований розділ потрібно розблокувати в initramfs.

  • При використанні initramfs на основі busybox( це за замовчуванням) застосуйте виверт encrypt, дотримуйтесь інструкцій у #Виверт mkinitcpio.
  • Коли ж використовуєте initramfs на основі systemd з mkinitcpio вивертом sd-encrypt, просто вкажіть додаткові параметри ядра rd.luks, щоб розблокувати розділ підкачки.

Виверт mkinitcpio

Примітка: Цей розділ застосовується лише при використанні виверта encrypt, який може розблокувати лише один пристрій (FS#23182). З вивертом sd-encrypt, може бути розблоковано кілька пристроїв, див. Dm-crypt/System configuration#Using systemd-cryptsetup-generator.

Якщо пристрій підкачки знаходиться на пристрої, відмінному від пристрою кореневої файлової системи, він не буде відкритий вивертом encrypt, тобто відновлення повинно відбутися до того, як /etc/crypttab може бути використаний, тому потрібно створити виверт у /etc/mkinitcpio.conf, щоб відкрити своп пристрій LUKS перед відновленням.

Якщо ви хочете послуговуватись розділом, який зараз використовується системою, спочатку його потрібно відключити:

# swapoff /dev/<device>

Також не забудьте видалити будь-який рядок із /etc/crypttab, що вказує на цей пристрій.

Якщо ви повторно використовуєте існуючий своп partition, і якщо розділ знаходиться в таблиці розділів GPT, вам потрібно буде використовувати gdisk, щоб встановити на ньому атрибут розділу 63 "не монтувати автоматично "partition attribute 63 "do not automount". Це не дозволить systemd-gpt-auto-generator виявити та ввімкнути розділ під час завантаження.

Наступна установка має недолік, оскільки при кожному завантаженні потрібно додатково вручну вставляти парольну фразу для розділу підкачки.

Попередження: Не використовуйте це налаштування з файлом ключа, якщо /boot не зашифровано. Будь ласка, прочитайте про проблему, про яку повідомлено тут. Або скористайтеся зашифрованим gnupg файлом ключів відповідно до https://bbs.archlinux.org/viewtopic.php?id=120181

Щоб відформатувати зашифрований контейнер для розділу підкачки, створіть набір ключів для запам’ятовуваної користувачем парольної фрази.

# cryptsetup luksFormat /dev/<device>

Відкрийте розділ у /dev/mapper:

# cryptsetup open /dev/<device> swapDevice

Створіть файлову систему підкачки всередині відображеного розділу:

# mkswap /dev/mapper/swapDevice

Тепер вам потрібно створити виверт, щоб відкрити підкачку під час завантаження. Ви можете встановити install та налаштувати пакет mkinitcpio-openswapAUR, або слідувати наступним інструкціям. Створіть файл хука, що містить команду відкриття вашого пристрою підкачки:

/etc/initcpio/hooks/openswap
run_hook ()
{
    cryptsetup open /dev/<device> swapDevice
}
Попередження: Монтування файлової системи є небезпечною та руйнівною дією. Файл ключів не слід читати з файлової системи, яка була змонтована під час призупинення роботи.

This article or section needs expansion.

Reason: Додайте інструкції, які не призведуть до втрати даних. (Discuss in Talk:Dm-crypt (Українська)/Swap encryption (Українська))

шляхом введення пароля під час завантаження або:

/etc/initcpio/hooks/openswap
run_hook ()
{
    ## Optional: To avoid race conditions
    x=0;
    while [ ! -b /dev/mapper/<root-device> ] && [ $x -le 10 ]; do
       x=$((x+1))
       sleep .2
    done
    ## End of optional

    mkdir crypto_key_device
    mount /dev/mapper/<root-device> crypto_key_device
    cryptsetup open --key-file crypto_key_device/<path-to-the-key> /dev/<device> swapDevice
    umount crypto_key_device
}

шляхом завантаження файлу із зашифрованного кореневого пристрою.

На деяких комп’ютерах можуть виникати умови, що призводять до перегонів , коли mkinitcpio намагається встановити пристрій перед процесом дешифрування та завершенням переліку пристроїв. Коментований блок Optional затримає процес завантаження на 2 секунди, поки кореневий пристрій не буде готовий до монтування.

Примітка: Якщо підкачка знаходиться на твердотільному диску (SSD), а Discard/TRIM бажана, опція --allow-discards повинна бути додана до рядка cryptsetup у виверті openswap вище. Див. Dm-crypt/Specialties#Discard/TRIM support for solid state drives (SSD) або SSD для отримання додаткової інформації про Discard/TRIM. Крім того, вам потрібно додати опцію монтування 'discard' до вашого запису fstab для пристрою підкачки.

Потім створіть і відредагуйте файл налаштування виверта:

/etc/initcpio/install/openswap
build ()
{
   add_runscript
}
help ()
{
cat<<HELPEOF
  This opens the swap encrypted partition /dev/<device> in /dev/mapper/swapDevice
HELPEOF
}

Додайте виверт openswap в рядок HOOKS в /etc/mkinitcpio.conf, перед filesystem, але після encrypt. Не забудьте додати виверт resume після openswap.

HOOKS=(... encrypt openswap resume filesystems ...)

Перегенеруйте initramfs Regenerate the initramfs.

Додайте відображений розділ до /etc/fstab, доповнивши таким рядком:

/dev/mapper/swapDevice swap swap defaults 0 0

Налаштуйте свою систему на відновлення з /dev/mapper/swapDevice. Наприклад, якщо ви використовуєте GRUB з підтримкою ядром сплячого режиму, додайте параметр ядра resume=/dev/mapper/swapDevice до GRUB, додавши його до GRUB_CMDLINE_LINUX_DEFAULT змінна в /etc/default/grub. Рядок grub.cfg для ядра із зашифрованими кореневим та своп розділами може виглядати так:

kernel /vmlinuz-linux cryptdevice=/dev/sda2:rootDevice root=/dev/mapper/rootDevice resume=/dev/mapper/swapDevice ro

Під час завантаження виверт openswap відкриє розділ підкачки, щоб відновлення ядра могло використовувати його. Якщо ви використовуєте спеціальні виверти для виходу з режиму глибокого сну, переконайтеся, що вони розміщені після openswap у масиві HOOKS. Зверніть увагу, що через відкриття розділу підкачки у initrd не має потреби вносити запис про swapDevice у /etc/crypttab в цьому випадку.

Використання файла підкачки

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

Дотримуйтесь інструкцій щодо створення файлів підкачки у Swap#Swap file та налаштуйте сплячий режим відповідно до Power management/Suspend and hibernate#Acquire swap file offset.

Примітка: Під час відновлення з файлу підкачки параметр resume повинен вказувати на розблокований/відображений пристрій, що містить файлову систему з файлом підкачки.

Відомі проблеми