Використання однієї парольної фрази для розблокування декількох зашифрованих дисків під час завантаження


23

На моїй машині встановлено SSD, де я встановив систему та жорсткий диск, який я використовую як сховище для великих та / або нечасто використовуваних файлів. Обидва є зашифрованими, але я вирішив використовувати для них одну і ту ж парольну фразу. SSD встановлено на, /а HDD - у /usr/hdd(кожен окремий користувач має в ньому каталог і може посилатись на домашню директорію, як їм подобається).

Коли система завантажується, вона негайно запитує пароль для SSD, а через пару секунд - для жорсткого диска (він встановлюється автоматично). З огляду на те, що обидві парольні фрази однакові, чи існує спосіб налаштування системи запитувати лише один раз?


Ви можете, можливо, написати expectсценарій або подібний, який викликається для встановлення дисків, а не для того, щоб система це робила. Натомість система викликає скрипт, який запитає пароль, зберігає його та надає його до кожної операції монтування.
h3rrmiller

Якщо я правильно розумію вашу ідею, вона не може бути застосована до SSD, оскільки звідси завантажується система. Але потім це стає безглуздим, тому що мені все одно потрібно буде вводити пароль для HDD окремо. Чи ні?
подвоєння

Ви можете використовувати /etc/crypttab для розблокування другого накопичувача .
jasonwryan

1
@jasonwryan, якщо це можна розширити на відповідь, то ... відповіді слід розміщувати як відповіді, а не коментарі.
derobert

1
@derobert інколи люди не мають часу чи схильності написати гарну відповідь.
Jasonwryan

Відповіді:


24

Дистрибуції на основі Debian:

Debian і Ubuntu доставляють скрипт кешування паролем decrypt_keyctl з пакетом cryptsetup .

сценарій decrypt_keyctl надає один і той же пароль для декількох зашифрованих цілей LUKS, врятуючи вас від введення його кілька разів. Його можна включити в криптовалюті з keyscript=decrypt_keyctlопцією. Один і той же пароль використовується для цілей, які мають однаковий ідентифікатор у полі ключових файлів . Під час завантаження пароль для кожного ідентифікатора запитується один раз.

Приклад криптовалюти :

<target>      <source>         <keyfile>      <options>
part1_crypt   /dev/disk/...    crypt_disks    luks,keyscript=decrypt_keyctl
part2_crypt   /dev/disk/...    crypt_disks    luks,keyscript=decrypt_keyctl

Після оновлення криптовалюти вам доведеться також оновити initramfs, щоб застосувати зміни. Використовуйте update-initramfs -u.

Повний readme для decrypt_keyctl знаходиться в /usr/share/doc/cryptsetup/README.keyctl

На жаль, це в даний час не працює в системах Debian, які використовують systemd init через помилку (інші init системи не повинні впливати). Сторінка людини криптовалюти Debian пропонує як initramfsваріант використовувати варіант для примусової обробки в стадії завантаження initramfs.


Дистрибутиви, які не передбачають сценарій decrypt_keyctl :

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

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

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

    dd if=/dev/urandom of=<path to key file> bs=1024 count=1
    chmod u=rw,g=,o= <path to key file>
    
  2. Додайте ключ до свого пристрою LUKS

    cryptsetup luksAddKey <path to encrypted device> <path to key file>
    
  3. Налаштуйте криптовалюту для використання файлу ключів. Перший рядок має бути кореневим пристроєм, оскільки пристрої розблоковані в тому ж порядку, що вказаний у криптовалюті . Використовуйте абсолютні шляхи для ключових файлів.

    <target>      <source>         <keyfile>                  <options>
    root_crypt    /dev/disk/...    none                       luks
    part1_crypt   /dev/disk/...    <path to key file>         luks
    

З перших рядків readme це виглядає дуже перспективно, дякую. Я перевірю це завтра (не хочу перезавантажувати зараз).
подвоєння

На жаль, це не працює (як і без змін). Перегляньте моїcrypttab (я не торкався UUID=створених інсталятором системи, я думаю, це не має значення) та результуючі записи в/var/log/syslog . Помилки начебто зрозумілі, але я поняття не маю, що з ними робити. Файл /lib/cryptsetup/scripts/decrypt_keyctlіснує, тому я не знаю, чому він скаржиться на невідомий варіант. Я також не маю уявлення, що вказати як ключовий файл, я ніде не бачу пояснень ...
подвоїти

Ви перевірили, що decrypt_keyctl потрапляє до initramfs? Перевірте це за допомогою багатослівної опції під час оновлення зображення: update-initramfs -u -k $(uname -r) -vвоно повинно вивести Adding binary /lib/cryptsetup/scripts/decrypt_keyctl.
sebasth

1
Щоб побачити, що містить initramfs:lsinitramfs /boot/initrd.img-$(uname -r)
sebasth

3
Ну, вибачте, тепер, коли я приділяв більше уваги на те , що update-initramfsсказав, я це помітив: E: /usr/share/initramfs-tools/hooks/cryptkeyctl failed with return 1.. Трохи погуглившись, я дізнався, що мені, мабуть, потрібен keyutilsпакет (дійсно не встановлений). Зараз це update-initramfsвдається і lsinitramfsзгадується decrypt_keytls. Оновиться після наступного завантаження (ймовірно, завтра).
подвоєння

3

Ось мій спосіб вирішення питання про debian, враховуючи помилку, на яку посилається @sebasth.

Моя установка трохи інша. У мене є зашифрований кореневий розділ та купа рейдових дисків. Для мене мені довелося додати параметр initramfs до криптовалюти:

<target>      <source>         <keyfile>      <options>
part1_crypt   /dev/disk/...    crypt_disks    plain,cipher=aes-xts-plain64,keyscript=decrypt_keyctl,initramfs
part2_crypt   /dev/disk/...    crypt_disks    plain,cipher=aes-xts-plain64,keyscript=decrypt_keyctl,initramfs

Це повідомляє update-initramfs, що я хочу, щоб ці записи криптовалют були встановлені у програмі initramfs. Я перевірив свою криптовалюту бігом

cryptdisks_start part1_crypt
cryptdisks_start part2_crypt

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

Зашифровані диски повинні бути встановлені до update-initramfsзапуску; інакше це призведе до помилок. Мені довелося шукати наступні рядки, коли будувався мій initramfs:

update-initramfs -k -u -v | grep 'keyctl'

який показав два наступні файли:

/bin/keyctl
cryptkeyctl

додається до initramfs.

Нарешті, мені довелося вимкнути systemd обробку моєї криптовалюти, щоб мати справу з помилкою, на яку згадувалося вище: systemd не підтримує параметр keycript у crypttab. Для цього я додав варіант ядра

GRUB_CMDLINE_LINUX_DEFAULT="quiet luks.crypttab=no"     

до / etc / default / grub та біг update-grub. Тепер systemd ігнорує crypttab, і всі зашифровані розділи завантажуються в initramfs.

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


1

Іншим варіантом є використання /lib/cryptsetup/scripts/decrypt_derivedскрипту, який також є частиною cryptsetup в Debian / Ubuntu.

Замість кешування ключа ви використовуєте клавішу гучності одного диска як додатковий пароль другого диска. Для цього потрібно додати другий пароль до другого (і третього тощо) зашифрованого диска, але LUKS підтримує це. Таким чином, це рішення також працює, якщо ваші кілька зашифрованих дисків не використовують один і той же пароль.

Приклад для додавання ключа від sda6crypt до sda5:

Додати ключ гучності sda6crypt як додатковий пароль для sda5:

mkfifo fifo
/lib/cryptsetup/scripts/decrypt_derived sda6crypt > fifo &
cryptsetup luksAddKey /dev/sda5 fifo
rm fifo

Налаштуйте sda5crypt для автоматичного розблокування в /etc/crypttab

ls -la /dev/disk/by-uuid/ | grep sda5
echo "sda5crypt UUID=<uuid> sda6crypt luks,initramfs,keyscript=/lib/cryptsetup/scripts/decrypt_derived" >> /etc/crypttab

Для fifoпередачі ключа використовується іменований канал ( ), щоб уникнути необхідності зберігання ключа гучності у тимчасовому файлі на диску.

keyscriptОпція працює тільки тоді , коли crypttabобробляються оригінальними інструментами Cryptsetup Debian, той Systemd перевиконання не підтримує його. Якщо ваша система використовує systemd (що є більшості систем), вам потрібна initramfsопція змусити обробку в initrd здійснюватися інструментами cryptsetup, перш ніж запускати systemd.

На основі /unix//a/32551/50793


Треба сказати, що це прекрасне рішення. Працював тут же, не мав ікати на Debian 10 Buster!
Янус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.