UEFI変数の追加や更新
セキュアブートにはdb/EFI_
)
$ hd /sys/firmware/efi/efivars/PK-* | head 00000000 27 00 00 00 a1 59 c0 a5 e4 94 a7 4a 87 b5 ab 15 |'....Y.....J....| 00000010 5c 2b f0 72 75 04 00 00 00 00 00 00 59 04 00 00 |\+.ru.......Y...| 00000020 74 24 86 16 a3 fc 52 46 86 1f 93 30 80 10 25 e7 |t$....RF...0..%.| 00000030 30 82 04 45 30 82 03 2d a0 03 02 01 02 02 09 00 |0..E0..-........|
たとえば上記のPK変数の例だと
0010 0111 = 0x27 ^- NVRAM領域に保存する ^- Boot Service後も読み込み可能にする ^- Boot Service後も書き込み可能にする ^- Hardware Error Record用の変数である ^- 書き込み時にカウンタベースの認証が必要 ^- 書き込み時に時刻ベースの認証が必要 ^- 書き込み時に既存のデータの後ろに追記する
- ※8
- LinuxカーネルをUEFIファームウェアから起動した場合,
/sys/
経由でUEFI変数にアクセスできます。変数名の後ろには変数ごとに決まっているfirmware/ efi/ efivars/ 「VendorGuid」 が付きます。UEFI対応版のGRUB (grub-efi-ARCHパッケージ) からLinuxカーネル起動するか, UEFIファームウェアから直接Linuxカーネルを起動した場合に, カーネルは 「UEFIファームウェアから起動した」 と判断します。従来のBIOSファームウェア環境にUbuntuをインストールした場合は, grub-efi-ARCHパッケージではなくgrub-pcパッケージがインストールされるため, 結果的に /sys/
は作成されません。firmware/ efi/ efivars/ - ※9
- UEFI Spec 「7.
2 Variable Services」 の GetVariable()
のRelated DefinitionsやSetVariable()
のDescription
このうち
- ※10
- UEFI Spec 「7.
2.1 Using the EFI_
descriptor (Recommended)」VARIABLE_ AUTHENTICATION_ 2
PK変数は
まずPK変数が空の状態を考えてみます。この状態はSetup Modeと呼ばれ
- ※11
- UEFI Spec 「Figure 77. Secure Boot Modes」
- ※12
- 正確には認証処理自体は行われますが,
署名の検証部分のみスキップします。 - ※13
- UEFI Spec 「7 Services — Runtime Services」
- ※14
- Ubuntuの場合は
「GRUBを起動したあと」 から 「Linuxを起動するより前もしくは起動した後」 の間で, Boot ServiceからRuntime Serviceに移行します。移行のタイミングはセキュアブートが有効かどうかとLinuxカーネルが署名済みかどうかに依存します。
一般的にセキュアブート対応のPCを購入した場合,
- ※15
- UEFI 2.
5からはSetup Mode/ User Mode以外に 「Audit Mode」 。このモードを使うと,と 「Deployed Mode」 が追加されました データセンターや政府向けマシンといった, ベンダーやOSのPKではなく独自のPKやKEK/ dbなどを複数のマシンへデプロイしたい場合の作業がより簡単になります。
KEKやPKの秘密鍵を持っていない状態でdb/
- PK変数に空のデータを書き込む
- プラットフォーム固有のPK変数クリア機能を実行する
- ※16
- UEFI Spec 「30.
3.2 Clearing The Platform Key」
PK変数に空のデータを書き込む場合は,
- ※17
- OVMFにはありませんが,
ベンダーのファームウェアによっては, ベンダー固有の鍵にリカバリーする機能も存在します。通常のPCのPK変数を変更する場合は, まずリカバリーできるかどうかという点を確認しておきましょう。
このようにセキュアブートに関するUEFI変数の更新には,