MinnowBoard Turbot でTPMを使うには、I2CをかSPIで外部にDiscrete TPMチップを接続する方法と、fTPM(ファームウェア実装のTPM2.0、Intelの場合はPTTとも呼ぶ)を使う方法があります。UEFI BIOSではFirmwareとDiscrete選べるようだが TPMチップの方の設定(おそらくNationz製のI2C TPM)について詳細な情報は公開されていないようです。ここではfTPMを有効化する方法についてまとめます。
1. 準備
- MinnowBoard Turbot 本体
- https://minnowboard.org/get-a-board
- Mouser
- Netgate (決済でエラーになる場合がある)
- ACアダプター (5V,2.5A(min) 4A(推奨), 5.5x21.mm)
- 5V4A,900円 http://akizukidenshi.com/catalog/g/gM-10660/
- 5V4A,1000円 http://akizukidenshi.com/catalog/g/gM-06238/
- 5V4A,1280円 http://akizukidenshi.com/catalog/g/gM-09594/
- 5V6.2A,1200円 http://akizukidenshi.com/catalog/g/gM-11105/
- HDMIケーブル
- HDMIモニター
- MicroSDカード(Class10、16GB以上)もしくは SATA SSD、 M.2 SSD 等
- USBメモリ(OS導入用)
- USBキーボード、マウス
2. セットアップ
2-1. 前置き
- 購入したボードのUEFIのVersion 0.95でした。
- BIOSの設定画面でTPMの選択が可能。
- ただし、BIOSでせってしてもOSからはTPMが認識できない状態。
- どうも付いてくるBIOSではFTPMをサポートしていないにもかかわらずメニューだけサポートしているフリをする困ったやつの可能性が高いです。そのため、OSでTPMを認識できない場合は、(どこにも書いてませんが)最新のFTPM対応のUEFIイメージにファームウェアをアップデートしておくひつようがありそうです。
- UEFIをアップデートすると設定をすべて消すので、UEFIをアップデートしてからOSをインストールしたほうが良いでしょう。
- ファームウェアは8種類(32/64BIT, Debug/Release、FTPMの有無)あります。Debugのファームウェアは動作がかなり遅いので64-bit/Release/FTPMを利用するのがココでは無難だと思われます。
- SDカードにOSインストールすると、動作が非常に遅いです。M.2 SSDなどを使ったほうがよいかもしれません(未確認)。
2-1. UEFI の更新
TeddyさんのBlog[1]にFTPMの有効化の方法が書かれていますが、最新のファームウェアではFTPMに対応済みのようです。インテルのファームウェアのサイト[2]から最新版ダウンロードしてアップデートします。
- https://firmware.intel.com/projects/minnowboard-max から最新UEFIファームウェアをダウンロード(これを書いた時点では 0.96が最新)。
- 解凍し、下記の2つをUSBドライブにコピー
- MinnowBoard.MAX.FirmwareUpdateX64.efi
- FTPM/MNW2MAX1.X64.0096.R01.1707030938.bin
- ボード起動、しばらくしてUEFIシェル起動
- "fs0:" でUSBドライブ選択
- "MinnowBoard.MAX.FirmwareUpdateX64.efi MNW2MAX1.X64.0096.R01.1707030938.bin" でアップデート実行
- 勝手に再起動
2-3. UEFIのメニューでTPMの有効化
- ボード起動、F2もしくはDELでメニューに
- Device Manager
- System Setop
- Security Configulation
- PTT ->
- Discrete TPM
- Measured Boot
− 以上でPTT(=fTPM)が有効化される
- Security Configulation
- System Setop
2-4. OSの設定、確認
以下は Ubuntu16.04 をインストールしたあとの作業です。 ftPM(PTT)は自動で認識されるため設定作業は不要です。以下は動作確認のメモです。
$ lsmod | grep tpm
tpm_crb 16384 0
CRBが読み込み済み。(のはず)
$ stat /dev/tpm0
File: '/dev/tpm0'
Size: 0 Blocks: 0 IO Block: 4096 character special file
Device: 6h/6d Inode: 417 Links: 1 Device type: a,e0
Access: (0600/crw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-07-22 07:27:09.062223303 +0900
Modify: 2017-07-22 07:27:09.062223303 +0900
Change: 2017-07-22 07:27:09.062223303 +0900
Birth: -
デバイスファイルも作成済み(のはず)
$ sudo acpidump -s
[sudo] password for sage:
ACPI: APIC 0x0000000000000000 000084 (v03 INTEL EDK2 00000003 VLV2 0100000D)
ACPI: CSRT 0x0000000000000000 00014C (v00 INTEL EDK2 00000005 INTL 20120624)
ACPI: DSDT 0x0000000000000000 007B07 (v02 INTEL EDK2 00000003 VLV2 0100000D)
ACPI: FACP 0x0000000000000000 00010C (v05 INTEL EDK2 00000003 VLV2 0100000D)
ACPI: FACS 0x0000000000000000 000040
ACPI: FPDT 0x0000000000000000 000044 (v01 INTEL EDK2 00000002 01000013)
ACPI: HPET 0x0000000000000000 000038 (v01 INTEL EDK2 00000003 VLV2 0100000D)
ACPI: MCFG 0x0000000000000000 00003C (v01 INTEL EDK2 00000003 VLV2 0100000D)
ACPI: LPIT 0x0000000000000000 000104 (v01 INTEL EDK2 00000003 VLV2 0100000D)
ACPI: TCPA 0x0000000000000000 000032 (v02 INTEL EDK2 00000002 01000013)
ACPI: UEFI 0x0000000000000000 000042 (v01 INTEL EDK2 00000002 01000013)
ACPI: TPM2 0x0000000000000000 000034 (v03 00000000 00000000)
ACPI: SSDT 0x0000000000000000 0004AC (v01 INTEL RHPROXY 00000003 VLV2 0100000D)
ACPI: SSDT 0x0000000000000000 00043A (v01 Intel_ Tpm2Tabl 00001000 INTL 20120518)
ACPI: SSDT 0x0000000000000000 000763 (v01 PmRef CpuPm 00003000 INTL 20141107)
ACPI: SSDT 0x0000000000000000 000261 (v01 PmRef Cpu0Tst 00003000 INTL 20141107)
ACPI: SSDT 0x0000000000000000 00017A (v01 PmRef ApTst 00003000 INTL 20141107)
ACPI: SSDT 0x0000000000000000 000395 (v01 PmRef Cpu0Ist 00003000 INTL 20141107)
ACPI: SSDT 0x0000000000000000 000233 (v01 PmRef Cpu0Cst 00003001 INTL 20141107)
ACPI: SSDT 0x0000000000000000 00015F (v01 PmRef ApIst 00003000 INTL 20141107)
ACPI: SSDT 0x0000000000000000 00008D (v01 PmRef ApCst 00003000 INTL 20141107)
ACPIテーブルにエントリがある(のはず)
$ dmesg | grep TPM
[ 0.000000] ACPI: TPM2 0x0000000078679000 000034 (v03 00000000 00000000)
[ 0.189472] ACPI Error: [TPME] Namespace lookup failure, AE_NOT_FOUND (20150930/psargs-359)
[ 0.189483] ACPI Error: Method parse/execution failed [\_SB.TPM._STA] (Node ffff880076cb95f0), AE_NOT_FOUND (20150930/psparse-542)
[ 0.189521] ACPI Error: [TPME] Namespace lookup failure, AE_NOT_FOUND (20150930/psargs-359)
[ 0.189530] ACPI Error: Method parse/execution failed [\_SB.TPM._STA] (Node ffff880076cb95f0), AE_NOT_FOUND (20150930/psparse-542)
[ 0.218213] ACPI Error: [TPME] Namespace lookup failure, AE_NOT_FOUND (20150930/psargs-359)
[ 0.218225] ACPI Error: Method parse/execution failed [\_SB.TPM._STA] (Node ffff880076cb95f0), AE_NOT_FOUND (20150930/psparse-542)
[ 0.237639] ACPI Error: [TPME] Namespace lookup failure, AE_NOT_FOUND (20150930/psargs-359)
[ 0.237650] ACPI Error: Method parse/execution failed [\_SB.TPM._STA] (Node ffff880076cb95f0), AE_NOT_FOUND (20150930/psparse-542)
[ 2.422114] ima: No TPM chip found, activating TPM-bypass!
[ 7.378722] ACPI Error: [TPME] Namespace lookup failure, AE_NOT_FOUND (20150930/psargs-359)
[ 7.378736] ACPI Error: Method parse/execution failed [\_SB.TPM._STA] (Node ffff880076cb95f0), AE_NOT_FOUND (20150930/psparse-542)
[ 7.389216] ACPI Error: [TPME] Namespace lookup failure, AE_NOT_FOUND (20150930/psargs-359)
[ 7.389231] ACPI Error: Method parse/execution failed [\_SB.TPM._STA] (Node ffff880076cb95f0), AE_NOT_FOUND (20150930/psparse-542)
このボードに限らずPTTの場合は、IMAの初期化時にTPMの動作確認が出来ないため IMAがTPM-bypassモードになるようです。
2-5. IBM TSS2.0 での動作確認
(ざっくり)インストール
$ sudo apt-get install -y libssl-dev
$ mkdir -p sandbox/ibmtpm20tss
$ cd sandbox/ibmtpm20tss
$ wget https://sourceforge.net/projects/ibmtpm20tss/files/ibmtss996.tar.gz
$ tar xvfz ibmtss996.tar.gz
$ cd utils
$ make
$ export TPM_INTERFACE_TYPE=dev
$ sudo chmod a+rwx /dev/tpm0
$ ./getcapability -cap 6
TPM_PT 00000100 value 322e3000 TPM_PT_FAMILY_INDICATOR - a 4-octet character string containing the TPM Family value (TPM_SPEC_FAMILY)
<SNIP>
TPM_PT 00000105 value 494e5443 TPM_PT_MANUFACTURER - the vendor ID unique to each TPM manufacturer
<SNIP>
TPM_PT 0000010b value 00010000 TPM_PT_FIRMWARE_VERSION_1 - the most-significant 32 bits of a TPM vendor-specific value indicating the version number of the firmware
TPM_PT 0000010c value 0003048c TPM_PT_FIRMWARE_VERSION_2 - the least-significant 32 bits of a TPM vendor-specific value indicating the version number of the firmware
<SNIP>
$ ./pcrread -ha 0 -halg sha1 -ns
dfaa319c2ee33b4efc4edb4eb9ec057801bec1bb
PCR0-7に値が書き込まれているので、Trusted Boot (Measured Boot)も動作している模様。
以上で MinnowBoard Turbot(MAXも同じはず)でfTPMが使えるようになりました。
3. 参照
- [1] Teddy Reed V, Minnowboard Max: Enable the firmware (TXE) TPM 2.0, January 11, 2016
- [2] MinnowBoard Max/Turbot - UEFI Firmware
- [3] Minnowboard 本家
その他(ググッてみつけた)関連情報
- Davide Guerri, TPM2.0 practical usage, Using a firmware TPM 2.0 on an embedded device, FOSDEM2017
- Security technologies and the Minnowboard Max
- TPM how to enable?
- Detection and Mitigation of Malicious Modifications on the Minnowboard Turbot
- https://trustedcomputinggroup.org/wp-content/uploads/TCG_RSA_Booklet_2016_WebRevC.pdf
- https://www.linuxfestnorthwest.org/sites/default/files/slides/linfwsec_0.pdf
- http://events.linuxfoundation.org/sites/events/files/slides/ELC2017_TPM2-and-TSS_Tricca_0.pdf
- http://www.uefi.org/sites/default/files/resources/FINAL%20Pres5%20UEFI%20Development-Open%20Source%20Ecosystem.pdf
以上