Como posso executar tpm2_nvread na imagem initramfs criada por dracut para o centOS 7?

1

Eu quero carregar minha partição LUKS (sistema de arquivos raiz) no momento da inicialização usando um TPM 2.0.

Eu não tive sucesso usando um keyscript=/path/to/script no meu arquivo /etc/crypttab , mas progredi usando métodos que encontrei aqui .

Eu estou usando o dracut para construir imagens iniciais de ram fs.

Então, em /usr/lib/dracut/modules.d/90crypt , fiz modificações em vários arquivos (de acordo com o guia que eu vinculei):

module-setup.sh

# gives me access to these binaries at boot time in initramfs
function install() {
    # existing code
    # ...
    inst /sbin/tpm2_nvread
    inst /bin/tail
    inst /bin/perl
    inst /sbin/resourcemgr
}

cryptroot-ask.sh

resourcemgr &
# yum is only at tpm2-tools 1.1.0, so I can't read keys to a file
# this is my solution to grab from tpm, and convert the spaced out hex to binary
function gettpmkeyfile() {
    key='tpm2_nvread -x 0x1500001 -a 0x40000001 -s 32 -o 0 | tail -n 1'
    key=${key//[[:blank:]]/}
    key='echo $key | /bin/perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie''
    printf $key
}
gettpmkeyfile | cryptsetup luksOpen $device $luksname --key-file=-

/etc/dracut.conf

omit_dracutmodules+="systemd"
add_dracutmodules+="crypt"

Eu sei que os binários estão carregados corretamente e adicionei as chaves do TPM com luksAddKey , e testei minha função na linha de comando em um shell após inicializar com uma frase secreta.

O problema que tenho é que o tpm2_nvread está jogando um erro sobre o gerenciador de recursos não inicializar (erro 0x1 ).

No entanto, notei que, em uma inicialização normal, o gerenciador de recursos também falha aqui, mas não me impede de usar os comandos tpm2-tools .

Eu tentei atualizar para o kernel mais recente a partir do elrepo (4.something), e adicionei drievrs do kernel com o dracut da seguinte forma:

dracut --add-drivers tpm_crb --force

Isso não parece ajudar.

Algum conselho sobre como posso obter tpm2_nvread para trabalhar no initrd?

    
por spanishgum 02.11.2017 / 22:55

2 respostas

1

Eu encontrei uma solução!

Eu adicionei /sbin/strace aos meus binários instalados em module-setup.sh para que eu pudesse inspecionar manualmente o comando tpm2_nvread no shell dracut. Acontece que o erro foi que minha rede estava inacessível.

Os comandos tpm2 usam libtcti para se comunicar com o tpm, que usa um soquete em 127.0.0.1:2323 .

Agora, até onde o loopback caiu, não tenho certeza. Meu palpite é 90crypt em dracut é executado antes da rede estar disponível, ou algo a ver com o fato de eu ter desativado systemd .

Então, adicionei /sbin/ifup a module-setup.sh e adicionei isso ao meu cryptroot-ask.sh :

ifup lo inet loopback
sleep 3

Não tenho certeza se preciso dormir, mas de qualquer maneira.

    
por 06.11.2017 / 21:40
0

Você também pode adicionar "-T device" ao seu tpm2_nvread para que ele converse diretamente com / dev / tpm0 sem precisar passar pelo gerenciador de recursos.

    
por 11.03.2018 / 20:59