TPMデバイスを仮想マシンに追加しようとすると・・・
libvirtd の virt-managerが TPMに対応してたので、それを追加しようとしたら、エラーになる。
パススルー or swtpm
仮想ホスト側にあるTPMをパススルーでゲスト仮想マシンに渡すか、swtpm でエミュレートしたものを仮想マシンにtpmに見せかける事ができるようです。
仮想ホスト側に swtpm が必要
swtpm つまり、ソフトウェアでモックされたTPMが必要になるってことですね。
構成について
実は、この仮想マシンのホストは、物理マシンではなく、仮想マシンである。仮想マシン上に仮想マシンを構成した nested vm にしてある。
その理由は、ubuntu/debian だと swtpm が apt に存在しないのと、swtpm 関連は不具合を引き起こすと公式サイトに記載があったためである。
そのため、nested vm にしてswtpm を構成している。
ホスト側にswtpm を作成する
debian/ubuntu の場合は相当めんどくさい。そのうちにapt で入るようになるんだろうけど、現在(2022-01-06)は 公式パッケージが存在しない。
libtpm / swtpm をインストール
libtpm をインストール
git clone https://github.com/stefanberger/libtpms cd libtpms/ sudo apt-get -y install automake autoconf libtool gcc build-essential libssl-dev dh-exec pkg-config gawk ./autogen.sh --with-openssl sudo make dist mv debian/source debian/source.old dpkg-buildpackage -us -uc -j4 cd .. sudo dpkg -i libtpm*.deb
swtpm をインストール
cd git clone https://github.com/stefanberger/swtpm.git cd swtpm sudo apt-get -y install dpkg-dev debhelper libssl-dev libtool net-tools libfuse-dev libglib2.0-dev libgmp-dev expect libtasn1-dev socat python3-twisted gnutls-dev gnutls-bin libjson-glib-dev python3-setuptools softhsm2 libseccomp-dev gawk libtpms-dev dpkg-buildpackage -us -uc -j$(nproc) cd .. sudo dpkg -i swtpm*.deb
インストールの確認
takuya@u02:~$ type swtpm swtpm is /usr/bin/swtpm
swtpm が追加される。
tpmデバイスを追加する。
ホスト側にtpmができたので、それを仮想マシンに追加してやる
tpm デバイスが追加されたことを確認
仮想マシンをインストールして、起動して、tpm が生えたことを確認する。
takuya@u0201:~$ dmesg | grep -i tpm [ 0.000000] efi: SMBIOS=0x7ebd8000 TPMFinalLog=0x7db10000 ACPI=0x7ebfa000 ACPI 2.0=0x7ebfa014 MEMATTR=0x7df45018 MOKvar=0x7df47000 TPMEventLog=0x7d085018 [ 0.012720] ACPI: TPM2 0x000000007D9EE000 00004C (v04 BOCHS BXPCTPM2 00000001 BXPC 00000001) [ 0.012731] ACPI: Reserving TPM2 table memory at [mem 0x7d9ee000-0x7d9ee04b] [ 1.874567] tpm_tis MSFT0101:00: 2.0 TPM (device-id 0x1, rev-id 1) takuya@u0201:~$ cat /proc/keys 249913f0 I--Q--- 1 perm 1f3f0000 1000 65534 keyring _uid_ses.1000: 1 343a1bb4 I--Q--- 3 perm 1f3f0000 1000 65534 keyring _uid.1000: empty 3ac179bd I--Q--- 7 perm 3f030000 1000 1000 keyring _ses: 1
使ってみる
sudo apt install tpm2-tools
takuya@u0201:~$ sudo tpm2_getcap pcrs [sudo] password for takuya: selected-pcrs: - sha1: [ ] - sha256: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 ] - sha384: [ ] - sha512: [ ]
動作チェック / sha256 でハッシュHEXを作ってみる。
takuya@u0201:~$ echo $(echo hello | sudo tpm2_hash --hash-algorithm=sha256 --hex ) 5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 takuya@u0201:~$ echo $(echo hello | sha256sum ) 5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 -
ふむ、ちゃんと動いてるようだ。
参考資料
- https://www.mankier.com/1/tpm2_hash
- https://github.com/tpm2-software/tpm2-tools
- https://tpm2-tools.readthedocs.io/en/latest/man/tpm2_hash.1/
- https://paolozaino.wordpress.com/2021/02/21/linux-configure-and-use-your-tpm-2-0-module-on-linux/
- https://www.insight-intl.com/jigyou/securitysystem/about_TPM/about_TPM20_3.html