Установка Linux на шифрованный диск с авторазблокировкой

Linux на шифрованный диск и авторазблокировка

Сегодня мы будем уста­новливать Linux на шиф­рован­ный кор­невой раз­дел, нас­тро­им авто­раз­бло­киров­ку при старте с помощью модуля TPM и новой функции systemd-cryptsetup. И будем бекапить ключ вос­ста­нов­ления в Active Directory. В моем случае будет использоваться Arch Linux, но вы можете проделать тоже самое в любом дис­три­бути­ве.

Еще по теме: Создание VPN-туннеля в Linux и Windows

Хо­телось бы не вво­дить пароль при заг­рузке каж­дый раз. Для это­го нуж­но нас­тро­ить авто­раз­бло­киров­ку LUKS с помощью чипа TPM.

Убе­дим­ся, что мы счас­тли­вые обла­дате­ли TPM. Необ­ходимая вер­сия TPM — 2.0.

$ test -e /dev/tpm0 && echo PASS || echo FAIL
PASS
$ cat /sys/class/tpm/tpm0/device/description
TPM 2.0 Device
or
$ cat /sys/class/tpm/tpm0/tpm_version_major
2

Ав­тораз­бло­киров­ку сде­лаем с помощью отно­ситель­но новой фичи systemd-cryptsetup.

Systemd-cryptsetup добав­лена в systemd начиная с вер­сии 248.

Для начала необ­ходимо про­верить нашу вер­сию systemd.

$ systemctl --version
systemd 249 (249.2-1-arch)
+PAM +AUDIT -SELINUX -APPARMOR -IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT -QRENCODE +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +XKBCOMMON +UTMP -SYSVINIT default-hierarchy=unified

Все отлично. Для работы с TPM нуж­но допол­нитель­но уста­новить пакет tpm2-tss.

$ pacman -Sy tpm2-tss

Да­лее добавим ключ TPM в слот LUKS с помощью тул­зы systemd-cryptenroll.

$ systemd-cryptenroll /dev/sda2 --tpm2-device=auto --tpm2-pcrs=0,4

Не забыва­ем про­верить.

$ systemd-cryptenroll /dev/sda2
SLOT TYPE
---------
0 password
1 tpm2

В коман­де выше мы ука­зали параметр —tpm2-pcrs=0,4. Что такое PCR? Вот оп­ределе­ние из Википе­дии:

PCR — это внут­ренние регис­тры памяти TPM, в которых в зашиф­рован­ном виде содер­жится вся информа­ция о целос­тнос­ти мет­рик сис­темы, начиная с заг­рузки BIOS до завер­шения работы сис­темы. Информа­ция, содер­жаща­яся в PCR, фор­миру­ет корень доверия для изме­рений (RTM). Могут хра­нить­ся как в энер­гонеза­виси­мой, так и в энер­гозави­симой памяти. Эти регис­тры сбра­сыва­ются при стар­те и при перезаг­рузке сис­темы. Спе­цифи­кация пред­писыва­ет минималь­ное количес­тво регис­тров (16), каж­дый регистр содер­жит 160 бит информа­ции. Регис­тры 0–7 зарезер­вирова­ны для нужд TPM. Регис­тры 8–15 дос­тупны для исполь­зования опе­раци­онной сис­темой и при­ложе­ниями. Изме­нения зна­чений PCR необ­ратимы, и их зна­чения нель­зя записать нап­рямую, их мож­но толь­ко рас­ширить новыми зна­чени­ями, которые зависят от пре­дыду­щих. Все изме­нения зна­чений PCR записы­вают­ся в лог изме­нений, который хра­нит­ся в энер­гозави­симой памяти.

PCR Use
PCR0 Core System Firmware executable code (aka Firmware)
PCR1 Core System Firmware data (aka UEFI settings)
PCR2 Extended or pluggable executable code
PCR3 Extended or pluggable firmware data
PCR4 Boot Manager
PCR5 GPT / Partition Table
PCR6 Resume from S4 and S5 Power State Events
PCR7 Secure Boot State
PCR8 Hash of the booted kernel
PCR 9 to 10 Reserved for Future Use
PCR11 BitLocker Access Control
PCR12 Data events and highly volatile events
PCR13 Boot Module Details
PCR14 Boot Authorities
PCR 15 to 23 Reserved for Future Use

Для вклю­чения systemd-cryptsetup необ­ходимо добавить в /etc/mkinicpio.conf хуки systemd и sd-encrypt.

HOOKS=(base systemd modconf block keyboard sd-encrypt filesystems fsck)
$ mkinicpio -P

На­конец, изме­ним стро­ку заг­рузки, добавив парамет­ры rd.luks.name и rd.luks.name.

$ blkid /dev/sda2
/dev/sda2: UUID="e04b5b87-6bfc-4f73-83b0-36f91d52f141" TYPE="crypto_LUKS" PARTLABEL="primary" PARTUUID="136ffe26-5569-4c76-a871-9025ea52dbd8"

$ efibootmgr \
--create \
--bootnum=0001 \
--label "Arch Linux" \
--disk /dev/sda \
--part 1 \
--loader /vmlinuz-linux \
--unicode 'rd.luks.name=e04b5b87-6bfc-4f73-83b0-36f91d52f141=cryptroot rd.luks.options=tpm2-device=auto root=/dev/mapper/cryptroot rootflags=subvol=@root rw initrd=\initramfs-linux.img' \
--verbose

Пе­резаг­ружа­емся и про­веря­ем, что все работа­ет как надо.

Для тех, кому systemd-cryptsetup по каким‑то при­чинам не под­ходит (нап­ример, вер­сия systemd ста­рая или вооб­ще нет systemd), могу пореко­мен­довать фрей­мворк Clevis. С его помощью мож­но реали­зовать сле­дующие сце­нарии авто­раз­бло­киров­ки LUKS:

  • tpm2 — раз­бло­киров­ка с TPM;
  • tang — раз­бло­киров­ка с сетево­го сер­вера.

Вот как исполь­зовать Сlevis с TPM:

$ clevis luks bind -d /dev/sda2 tpm2 '{"pcr_bank":"sha1","pcr_ids":"0,4"}'
Enter existing LUKS password: ***************

Про­веря­ем.

$ sudo clevis luks list -d /dev/sda2
1: tpm2 '{"hash":"sha256","key":"ecc","pcr_bank":"sha1","pcr_ids":"0,4"}

Ва­риант с сер­вером tang нас­тра­ивает­ся не слож­нее (разуме­ется, заранее раз­ворачи­ваем tang и обес­печива­ем сетевую дос­тупность):

$ sudo clevis luks bind -d /dev/sda2 tang '{"url":"http://192.168.88.101:7500"}'
The advertisement contains the following signing keys:

QjvwIdUeor3gBqxLteIOKvWPRqM

Do you wish to trust these keys? [ynYN] y
Enter existing LUKS password:

Про­веря­ем.

$ sudo clevis luks list -d /dev/sda2
1: tpm2 '{"hash":"sha256","key":"ecc","pcr_bank":"sha1","pcr_ids":"0,4"}'
2: tang '{"url":"http://192.168.88.101:7500"}'

В зак­лючение темы авто­раз­бло­киров­ки сто­ит упо­мянуть некото­рые огра­ниче­ния фрей­мвор­ка Clevis:

  • Clevis работа­ет толь­ко с TPM 2.0; TPM 1.2 не под­держи­вает­ся.
  • В Tang не реали­зован механизм сме­ны клю­чей.
  • Для Tang необ­ходима дос­тупность сети на эта­пе заг­рузки, поэто­му, нап­ример, для Wi-Fi-под­клю­чения тре­бует­ся допол­нитель­ная нас­трой­ка адап­тера в initrd.

Создание ключей восстановления

Бэ­капы клю­чей в таком деле, как шиф­рование, дол­жны быть, об этом зна­ет каж­дый.

Есть два вари­анта соз­дания клю­чей вос­ста­нов­ления:

  • дамп заголов­ка и мас­тер‑клю­ча;
  • за­пись пароля вос­ста­нов­ления в Active Directory.

Создаем копию мастер-ключа

Сде­лать резер­вную копию заголов­ка и мас­тер‑клю­ча мож­но с помощью хорошо извес­тной нам ути­литы cryptsetup.

С помощью соз­данной копии мож­но будет получить дос­туп к раз­делу, не зная пароль, поэто­му нас забот­ливо пре­дуп­режда­ют, что хра­нить ее нуж­но в сек­рете!
$ cryptsetup luksDump --dump-master-key /dev/sda2 --master-key-file mk.dump

WARNING!
========
The header dump with volume key is sensitive information
that allows access to encrypted partition without a passphrase.
This dump should be stored encrypted in a safe place.

Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/sda2:
LUKS header information for /dev/sda2
Cipher name:    aes
Cipher mode:    xts-plain64
Payload offset: 32768
UUID:           e04b5b87-6bfc-4f73-83b0-36f91d52f141
MK bits:        512
Key stored to file mk.dump

$ xxd mk.dump
00000000: 1501 eccc 84fd 82f7 f53b 56ae 4ab8 5775  .........;V.J.Wu
00000010: 4968 ea61 8d01 1f29 985e 33af 5537 ba40  Ih.a...).3.U7.@
00000020: af61 6aa2 b384 afe1 aff6 d4c9 ad95 1d67  .aj............g
00000030: 3a4f d64f 33ea 6f50 0a18 1139 9196 d694  :O.O3.oP...9....

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

$ cryptsetup luksAddKey /dev/sda2 --master-key-file mk.dump
Enter new passphrase for key slot: ********
Verify passphrase: ********

Добавление пароля восстановления в Active Directory

Дру­гой инте­рес­ный спо­соб — это хра­нение пароля в AD.

Для начала нуж­но вклю­чить нашу Arch Linux в домен. Делать это буду с помощью System Security Services Daemon (SSSD) и realmd.

Ус­танав­лива­ем sssd обыч­ным спо­собом:

$ pacman -Sy sssd

А realmd ста­вим из AUR.

Убе­дим­ся, что домен дос­тупен.

$ realm discover ad.localdomain
    ad.localdomain
  type: kerberos
  realm-name: AD.LOCALDOMAIN
  domain-name: ad.localdomain
  configured: no
  server-software: active-directory
  client-software: sssd

При­соеди­няем­ся к домену, для это­го понадо­бит­ся учет­ная запись с пра­вами вво­да в домен (для прос­тоты — administrator).

$ realm join ad.localdomain
 Password for Administrator: ********

Про­веря­ем, что все прош­ло успешно и мы получи­ли билеты Kerberos:

$ realm list
ad.localdomain
  type: kerberos
  realm-name: AD.LOCALDOMAIN
  domain-name: ad.localdomain
  configured: kerberos-member
  server-software: active-directory
  client-software: sssd
  login-formats: %U@ad.localdomain
  login-policy: allow-realm-logins
$ klist -k
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   2 ARCH$@AD.LOCALDOMAIN
   2 ARCH$@AD.LOCALDOMAIN
   2 ARCH$@AD.LOCALDOMAIN
   2 host/ARCH@AD.LOCALDOMAIN
   2 host/ARCH@AD.LOCALDOMAIN
   2 host/ARCH@AD.LOCALDOMAIN
   2 RestrictedKrbHost/ARCH@AD.LOCALDOMAIN
   2 RestrictedKrbHost/ARCH@AD.LOCALDOMAIN
   2 RestrictedKrbHost/ARCH@AD.LOCALDOMAIN

Па­роль вос­ста­нов­ления будем хра­нить в учет­ной записи компь­юте­ра: это дочер­ний объ­ект клас­са msFVE-RecoveryInformation. Так дела­ет вин­довый BitLocker, ана­логич­но пос­тупим и мы.

За­писы­вать пароль в AD буду с помощью скрип­та на Python.

$ git clone https://github.com/ambalabanov/lukscrow
$ cd lukscrow/
$ pip install -r requirements.txt

За­пус­каем ути­литу, ука­зав необ­ходимые парамет­ры и текущий ключ (пароль):

$ ./lukscrow --luks-device /dev/sda2 --ldap-url "ldap://ad.localdomain" --computers-base-dn "CN=Computers,DC=ad,DC=localdomain" --unlock-key ********
Using Kerberos credential cache /tmp/tmpcsdyn49r
Connected to AD as 'u:AD\ARCH$'
Generating recovery key...
Adding recovery key to LUKS volume...
New key added.
Storing recovery key in Active Directory
Recovery key saved to AD.
Remove Kerberos credential cache /tmp/tmpcsdyn49r
Removed cache file.

Про­веря­ем в AD, что пароль вос­ста­нов­ления успешно записал­ся.

linux шифрование системного диска

Ну и напос­ледок про­веря­ем сам пароль.

$ sudo cryptsetup --test-passphrase luksOpen /dev/sda2 && echo TRUE || echo FALSE
Enter passphrase for /dev/sda2: 287781-171655-523297-666928-307170-072073-039516-177220
TRUE

Заключение

Итак, мы уста­нови­ли Arch Linux на шиф­рован­ный кор­невой раз­дел, нас­тро­или авто­раз­бло­киров­ку при стар­те и позабо­тились о резер­вирова­нии клю­чей. Наде­юсь, для тебя это тоже было увле­катель­ным прик­лючени­ем!

Еще по теме: Установка Tails на флешку с возможностью сохранения данных

ВКонтакте
OK
Telegram
WhatsApp
Viber

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *