それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

QEMUがtpm サポートしてたので nested vm で tpm デバイスを実験する

TPMバイス仮想マシンに追加しようとすると・・・

libvirtd の virt-managerTPMに対応してたので、それを追加しようとしたら、エラーになる。

f:id:takuya_1st:20220106161535p:plain

パススルー or swtpm

仮想ホスト側にあるTPMをパススルーでゲスト仮想マシンに渡すか、swtpm でエミュレートしたものを仮想マシンtpmに見せかける事ができるようです。

仮想ホスト側に swtpm が必要

swtpm つまり、ソフトウェアでモックされたTPMが必要になるってことですね。

構成について

ホスト側に、何らかの形でTPMバイスを作る必要がある。 f:id:takuya_1st:20220106163535p:plain

実は、この仮想マシンのホストは、物理マシンではなく、仮想マシンである。仮想マシン上に仮想マシンを構成した 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バイスを追加する。

kvm+qemu+virt-manager

ホスト側にtpmができたので、それを仮想マシンに追加してやる

f:id:takuya_1st:20220106161305p:plain

tpmバイスが追加されたことを確認

仮想マシンをインストールして、起動して、tpm が生えたことを確認する。 f:id:takuya_1st:20220106161350p:plain

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 -

ふむ、ちゃんと動いてるようだ。

参考資料