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で機能させる方法について何かアドバイスはありますか?
私は解決策を見つけました!
/sbin/strace
のインストール済みバイナリにmodule-setup.sh
を追加したので、dracutシェルのtpm2_nvread
コマンドを手動で検査できました。エラーは、私のネットワークに到達できなかったということでした。
Tpm2コマンドは、libtcti
を使用してtpmと通信し、tpmは127.0.0.1:2323
のソケットを使用します。
さて、なぜループバックがダウンしたのかについては、よくわかりません。私の推測では、ネットワークが利用可能になる前のdracut実行の90crypt
か、systemd
を無効にしたという事実と関係があります。
そこで、/sbin/ifup
をmodule-setup.sh
に追加し、これをcryptroot-ask.sh
に追加しました。
ifup lo inet loopback
sleep 3
睡眠が必要かどうかはわかりませんが、とにかく寝ます。
「-Tデバイス」をtpm2_nvreadに追加して、リソースマネージャーを経由せずに/ dev/tpm0と直接通信することもできます。