<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>60828</bug_id>
          
          <creation_ts>2026-10-06 12:51:07 +0300</creation_ts>
          <short_desc>make-initrd: LUKS2 TPM2 token не используется при crypttab с keyfile=none</short_desc>
          <delta_ts>2026-10-07 12:19:53 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>3</classification_id>
          <classification>Distributions</classification>
          <product>Regular</product>
          <component>any</component>
          <version>не указана</version>
          <rep_platform>x86_64</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>security, systemd</keywords>
          <priority>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="andsed">accotempory</reporter>
          <assigned_to name="Антон Мидюков">antohami</assigned_to>
          
          
          <qa_contact name="Andrey Cherepanov">cas</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>301310</commentid>
    <comment_count>0</comment_count>
    <who name="andsed">accotempory</who>
    <bug_when>2026-10-06 12:51:07 +0300</bug_when>
    <thetext>Краткое описание

В ALT Linux Sisyphus make-initrd с feature luks не использует зарегистрированный systemd-tpm2 token для автоматического открытия LUKS2, если в /etc/crypttab для тома указано none в поле keyfile.

В результате при загрузке initrd не пытается выполнить cryptsetup с LUKS token и сразу переходит к запросу пароля.

При этом:

TPM2 корректно работает;
TPM2 token успешно зарегистрирован в LUKS2;
cryptsetup поддерживает systemd-tpm2 token;
TPM2 plugin присутствует внутри initrd;
ручной запуск cryptsetup --token-only из того же initrd успешно открывает LUKS keyslot.

Проблема находится в логике обработчика:

/usr/share/make-initrd/features/luks/data/lib/uevent/handlers/085-luks
Окружение
ALT Linux Regular Sisyphus
build: 20260806
architecture: x86_64
kernel: 6.18.54-6.18-alt1
systemd: 260.4-alt2
cryptsetup: 2.8.4-alt1
shim: 16.1-alt2
GRUB: 2.14-alt9
Secure Boot: enabled
TPM2: enabled and available

Системный /boot находится на отдельном незашифрованном разделе /dev/nvme0n1p2.

ESP:

/dev/nvme0n1p1

LUKS2:

/dev/nvme0n1p3
UUID=57f93512-8af3-604b-addd-8c1d7d92369a

LUKS содержит Btrfs root/home/swap.

Конфигурация crypttab

Используется стандартная запись:

luks-57f93512-8af3-604b-addd-8c1d7d92369a UUID=57f93512-8af3-604b-addd-8c1d7d92369a none luks

Обычный LUKS пароль находится в keyslot 0.

TPM2 token зарегистрирован в keyslot 1:

systemd-cryptenroll /dev/nvme0n1p3 \
    --tpm2-device=auto \
    --tpm2-pcrs=0,2,4,7

Результат:

New TPM2 token enrolled as key slot 1.

Таким образом, парольный fallback сохраняется.

Что работает корректно

TPM2 обнаруживается системой:

/dev/tpm0
/dev/tpmrm0

Проверка:

systemd-analyze has-tpm2

показывает наличие firmware, driver, system, subsystem и TPM2 libraries.

cryptsetup luksDump показывает:

Keyslot 0
Keyslot 1

Token 0
    type: systemd-tpm2
    keyslots: 1

Также в системе присутствует:

/usr/lib64/cryptsetup/libcryptsetup-token-systemd-tpm2.so
Проблема

ALT make-initrd использует классический uevent-based обработчик:

/usr/lib/uevent/handlers/085-luks

В текущей реализации при:

keyfile=none

происходит:

none
 ↓
/etc/cryptsetup-keys.d/&lt;volume&gt;.key
 ↓
файл отсутствует
 ↓
rc=1
 ↓
запрос пароля

То есть LUKS token не проверяется.

Критический фрагмент исходного обработчика:

else
    message &quot;The keyfile was not found for partition: $LUKS_ROOT&quot;
    rc=1
fi

При этом в initrd уже присутствует TPM2 token plugin, но он не вызывается.

Подтверждение проблемы

После добавления TPM2 plugin в initrd был выполнен тест непосредственно из распакованного initrd.

Внутри initrd присутствовали:

/dev/tpm0
/dev/tpmrm0

и:

/usr/lib64/cryptsetup/libcryptsetup-token-systemd-tpm2.so

Команда:

cryptsetup --token-only --debug \
    open --type luks \
    /dev/nvme0n1p3 \
    initrd-tpm-token-test \
    --test-passphrase

успешно выполнилась:

Trying to load /usr/lib64/cryptsetup/libcryptsetup-token-systemd-tpm2.so.
Token handler systemd-tpm2-1.0 systemd-v260.4 loaded successfully.
Requesting JSON for token 0.
Trying to open keyslot 1 with token 0 (type systemd-tpm2).
Trying to open LUKS2 keyslot 1.
Verifying key from keyslot 1, digest 0.
Key slot 1 unlocked.
Command successful.
RETURN_CODE=0

Таким образом, TPM2 unlock полностью работоспособен уже внутри initrd.

Исправление / workaround

Был изменён обработчик 085-luks:

else
    message &quot;The keyfile was not found for partition: $LUKS_ROOT&quot;
    message &quot;Attempting to unlock using LUKS token...&quot;
    cryptsetup --token-only &quot;$@&quot;
    rc=&quot;$?&quot;
fi

Также в feature luks был добавлен TPM2 token plugin:

PUT_FEATURE_PROGS += /usr/lib64/cryptsetup/libcryptsetup-token-systemd-tpm2.so

После пересборки:

make-initrd -k &quot;$(uname -r)&quot;

проверено, что plugin и изменённый 085-luks находятся в итоговом initrd.

После перезагрузки система автоматически открыла LUKS через TPM2 без запроса пароля.

При этом обычный пароль в keyslot 0 остался доступен как fallback.

Ожидаемое поведение

Если в LUKS2 зарегистрирован поддерживаемый token, например:

systemd-tpm2

и в /etc/crypttab указано:

UUID=&lt;LUKS-UUID&gt; none luks

initrd должен попытаться использовать LUKS token перед переходом к интерактивному вводу пароля.

Ожидаемый порядок:

keyfile
  ↓
LUKS token
  ↓
clevis (если используется)
  ↓
password

или другой документированный порядок, согласованный с архитектурой make-initrd.

Предложение

Стоит изменить feature luks так, чтобы отсутствие keyfile при keyfile=none не означало немедленный переход к password prompt.

Желательно:

Проверять доступные LUKS2 tokens через cryptsetup.
Использовать доступный token handler, в частности systemd-tpm2.
Только после неудачи token unlock переходить к существующим механизмам clevis и password fallback.
При необходимости автоматически включать соответствующие token plugins в initrd.

Это позволит штатно использовать TPM2-enrolled LUKS2 volumes с ALT make-initrd без локального патча 085-luks.

Дополнительное замечание

Добавление:

tpm2-device=auto

в /etc/crypttab в данном окружении не является решением: текущий ALT make-initrd/luks parser не поддерживает этот параметр в используемой конфигурации.

Проблема воспроизводится независимо от этого параметра.

Результат

После локального исправления 085-luks:

UEFI Secure Boot
        ↓
GRUB
        ↓
unencrypted /boot
        ↓
ALT initrd
        ↓
systemd-tpm2 cryptsetup token
        ↓
LUKS2 keyslot 1
        ↓
Btrfs root

загрузка выполняется полностью автоматически, без ввода LUKS-пароля.

Обычный LUKS password keyslot при этом сохраняется как резервный способ разблокировки.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>301314</commentid>
    <comment_count>1</comment_count>
    <who name="Антон Мидюков">antohami</who>
    <bug_when>2026-10-06 13:36:43 +0300</bug_when>
    <thetext>Установите пакет make-initrd-clevis и настройте по инструкции TPM2.0:
https://www.altlinux.org/Clevis

Затем выполните:
make-initrd

и должно заработать.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>301393</commentid>
    <comment_count>2</comment_count>
    <who name="andsed">accotempory</who>
    <bug_when>2026-10-07 10:46:19 +0300</bug_when>
    <thetext>Смысл не в том, что с clevis все работает, работает это понятно. Смысл в том что, LUKS2 умеет хранить информацию о TPM2-token, systemd-cryptenroll умеет этот token создавать, а cryptsetup умеет его использовать при разблокировке. Документация systemd это прямо описывает, и в системах с systemd-based initrd это штатный сценарий. А в make-initrd не реализована интеграция с уже существующим механизмом, выше предложен патч для обработчика 085-luks чтобы это исправить. Возможно, я не правильно все оформил, но это мой первый багрепорт, можно кидать тапки.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>301396</commentid>
    <comment_count>3</comment_count>
    <who name="Антон Мидюков">antohami</who>
    <bug_when>2026-10-07 12:19:53 +0300</bug_when>
    <thetext>(Ответ для andsed на комментарий #2)
&gt; Смысл не в том, что с clevis все работает, работает это понятно. Смысл в том
&gt; что, LUKS2 умеет хранить информацию о TPM2-token, systemd-cryptenroll умеет
&gt; этот token создавать, а cryptsetup умеет его использовать при разблокировке.
&gt; Документация systemd это прямо описывает, и в системах с systemd-based
&gt; initrd это штатный сценарий. А в make-initrd не реализована интеграция с уже
&gt; существующим механизмом, выше предложен патч для обработчика 085-luks чтобы
&gt; это исправить. Возможно, я не правильно все оформил, но это мой первый
&gt; багрепорт, можно кидать тапки.

Сделайте пулл-риквест в аптсрим:
https://github.com/osboot/make-initrd</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>