web-dev-qa-db-ja.com

centOS 7用にdracutによって作成されたinitramfsイメージでtpm2_nvreadを実行するにはどうすればよいですか?

TPM 2.0を使用して、起動時にLUKSパーティション(ルートファイルシステム)をロードロック解除したい。

keyscript=/path/to/scriptファイルで/etc/crypttabを使用しても成功しませんでしたが、見つけた方法を使用して進歩しました ここ

Dracutを使用して最初のramfsイメージを作成しています。

したがって、/usr/lib/dracut/modules.d/90cryptで、いくつかのファイルに変更を加えました(リンクしたガイドによると)。

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"

バイナリが正しく読み込まれていることを知っています。TPMからluksAddKeyを使用してキーを追加し、パスフレーズで起動した後、シェルのコマンドラインで関数をテストしました。

私が抱えている問題は、tpm2_nvreadがリソースマネージャーの初期化に失敗したというエラー(エラー0x1)をスローしていることです。

ただし、通常の起動では、リソースマネージャーもここで失敗しますが、tpm2-toolsコマンドの使用を妨げることはありません。

Elrepo(4.something)から最新のカーネルにアップグレードしようとしましたが、次のようにdracutを使用してカーネルドライバーを追加しました。

dracut --add-drivers tpm_crb --force

これは役に立たないようです。

tpm2_nvreadをinitrdで機能させる方法について何かアドバイスはありますか?

1
spanishgum

私は解決策を見つけました!

/sbin/straceのインストール済みバイナリにmodule-setup.shを追加したので、dracutシェルのtpm2_nvreadコマンドを手動で検査できました。エラーは、私のネットワークに到達できなかったということでした。

Tpm2コマンドは、libtctiを使用してtpmと通信し、tpmは127.0.0.1:2323のソケットを使用します。

さて、なぜループバックがダウンしたのかについては、よくわかりません。私の推測では、ネットワークが利用可能になる前のdracut実行の90cryptか、systemdを無効にしたという事実と関係があります。

そこで、/sbin/ifupmodule-setup.shに追加し、これをcryptroot-ask.shに追加しました。

ifup lo inet loopback
sleep 3

睡眠が必要かどうかはわかりませんが、とにかく寝ます。

1
spanishgum

「-Tデバイス」をtpm2_nvreadに追加して、リソースマネージャーを経由せずに/ dev/tpm0と直接通信することもできます。

0
patrick h