Ubuntu Weekly Recipe

第444回 Ubuntuにおけるセキュアブートの仕組み

この記事を読むのに必要な時間:およそ 11 分

Ubuntuにおける鍵の取り扱い

セキュアブートとその鍵の扱いを見てきました。今度はWindwos PCにUbuntuをインストールした時に,セキュアブートを有効にしたUbuntuのブートシーケンスにおいてこれらの鍵がどのように使われているかを見ていきましょう※18⁠。

※18
Windowsに限っているのは,単純にMacのSecureBootがどうなっているか知らないためです。

ベンダーがUbuntuを最初からインストールしているマシンであれば,UbuntuのブートローダーであるGRUBやOSであるLinuxカーネルを起動するための鍵をあらかじめEnrollしてくれているはずです。しかしながら,今のUbuntuはUbuntuがプリインストールされていないマシンであっても,鍵を入れかえることなくセキュアブートを有効化できます。これはどういうことでしょうか。

これまで何度か言及しているように,PK変数やKEK変数,db/dbx変数はいずれもPCベンダーもしくはOSベンダー(Microsoft)の秘密鍵を持っていないと書き換えはできません。つまりGRUBやLinuxカーネルはdb変数に登録されている鍵で検証可能な,署名済みバイナリである必要があります。そこでUbuntu(やFedora)は,GRUBより一段前にMicrosoftの鍵で署名されたshimブートローダーをはさむ方法を採用しました。もともとMicrosoftはdb用に2つの鍵を持っています。

PCAはWindowsのOSローダーの署名に使われている証明書です。これに対してUEFI CAのほうは,サードパーティーのベンダー向けにMicrosoftが提供しているUEFIファームウェアの署名サービスで使われる鍵です。サードパーティのベンダーがUEFIバイナリを作成しMicrosoftに送付すると,Microsoft側でバイナリを検証した上でUEFI CAで署名したバイナリを作成してくれます。このサービスで作成したUEFIバイナリを使えば,UEFI CAインストール済みのWindowsマシンでも独自のバイナリを実行できるというわけです※19⁠。

※19
Microsoftが公開しているWindowsセキュアブートキーの作成と管理のガイダンス「1.5 すべての PC でセキュア ブートに必要なキー」によると,PCAについては「必要なキー」に列挙されているものの,UEFI CAについては「推奨されるキー」に留まっています。そのためシステムによっては,UEFI CAがインストールされていないかもしれません。そのようなマシンの場合は,PKを更新しない限りセキュアブートを有効化した状態ではUbuntuを起動できません。

shimはGRUBなどの他のブートローダーの署名を検証した上で起動するだけのブートローダーです。Microsoftによる署名処理を少なくするために,できる限りシンプルに作られています。shim自体はshimパッケージで提供されていますが,UEFI CAで署名済みのバイナリはshim-signedパッケージに入っています。UEFIシステム上にUbuntuをインストールした時は,このshimローダーを最初に起動するようにUEFI変数を設定します。ちなみに,起動関連のUEFI変数はefbootmgrコマンドで確認できます。

$ efibootmgr -v | grep ubuntu
Boot000B* ubuntu        HD(1,GPT,49f2bf87-652c-4787-a801-59b4ea5dcbb2,0x800,0x100000)/File(\EFI\ubuntu\shimx64.efi)
$ sudo ls /boot/efi/EFI/ubuntu/
MokManager.efi  fw  fwupx64.efi  grub.cfg  grubx64.efi  shimx64.efi

UEFIのシステムパーティションにshimx64.efiが存在します。このshimローダーには,Canonicalの証明書が埋め込まれています。shimローダーから起動するGRUBやさらにその先のカーネルは,このCanonicalの証明書で正当性を検証することで,shim以降の安全性を確保しているのです。当然のことながらshimに証明書を埋め込むということは,その秘密鍵が流出してしまうと何でも起動できてしまうということです。Microsoftがshimに署名をする場合は,埋め込まれる証明書の厳密な管理が求められています

まとめると,セキュアブートが有効化されている環境において,Ubuntu 16.04 LTSの起動時には次のような手順で検証が行われます。

  1. UEFIファームウェアはセキュアブートが有効になっているか確認する
  2. Ubuntuシステムで起動するUEFIアプリケーションを確認するshimx64.efi
  3. shimx64.efiがdbx変数にある証明書・署名・ハッシュのいずれかに一致しないか確認する
  4. shimx64.efiがdb変数にある証明書・署名・ハッシュのいずれかに一致するか確認する
  5. このとき「Microsoft Corporation UEFI CA 2011」で署名されていることがわかるのでshimx64.efiを実行する
  6. shimは埋め込まれた証明書である「Canonical Ltd. Master Certificate Authority」を用いて次のブートローダーを検証する
  7. 次のブートローダーであるgrubx64.efiが上記の証明書で署名されているならgrubx64.efiを実行する
  8. カーネルが署名済みならGRUBはshimに埋め込まれた「Canonical Ltd. Master Certificate Authority」を用いて次のカーネルを検証する
  9. カーネルが上記の証明書で署名されているならカーネルを起動する

MicrosftのUEFI CAで署名されたshimローダーさえあれば,あとはCanonical側の鍵を使うだけでGRUBやカーネルの更新時も,Microsoftによる承認を待つことなく新しいパッケージをリリースできるのです。

ちなみにカーネルのキーリングには,セキュアブート関連の鍵も保存されています。keyutilsパッケージのkeyctlコマンドを使えば,鍵の一覧を確認できます。たとえばヒューレットパッカードのPCだと,次のような結果になります。

$ sudo keyctl list %:.system_keyring
5 keys in keyring:
315799008: ---lswrv     0     0 asymmetric: Hewlett-Packard Company: HP UEFI Secure Boot 2013 DB key: 1d7cf2c2b92673f69c8ee1ec7063967ab9b62bec
128458387: ---lswrv     0     0 asymmetric: Build time autogenerated kernel key: d76179dc6bbadd817ec29258d181eadabda602cb
304050812: ---lswrv     0     0 asymmetric: Canonical Ltd. Master Certificate Authority: ad91990bc22ab1f517048c23b6655a268e345a63
376509249: ---lswrv     0     0 asymmetric: Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4
132391469: ---lswrv     0     0 asymmetric: Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53

PCベンダーであるヒューレットパッカードの鍵,WindowsのベンダーであるMicrosoftの鍵に加えて,Canonicalの鍵も追加されていることがわかります。ちなみに「Build time autogenerated kernel key」はカーネルパッケージのビルド時に自動生成された鍵です。モジュールの検証に使われます※20⁠。

※20
当たり前のことではありますが,セキュアブート環境下においてはカーネルイメージだけでなく,カーネルモジュールそのものも検証の対象となります。よってカーネルパッケージに付属しているか,DKMSなどで独自にビルドしているかに関わらず,カーネルモジュールを署名・検証する仕組みも必要になります。けれどもこれは別の物語,いつかまた,別のときに話すことにしましょう。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。