Unified Extensible Firmware Interface/セキュアブート

提供: ArchWiki
2017年5月11日 (木) 08:05時点におけるKusakata.bot (トーク | 投稿記録)による版 (update Pkg/AUR templates)
ナビゲーションに移動 検索に移動

関連記事

Linux における Secure Boot の概要については Rodsbooks' Secure Boot を見て下さい。この記事では Arch Linux で Secure Boot を設定する方法に焦点を置いています。

Secure Boot の無効化

Secure Boot 機能はファームウェアのインターフェイスから無効化することができます。Rod Smith's Disabling Secure Boot を見てください。

署名済みのブートローダーを使う

archiso の起動

EFI アプリケーション PreLoader.efiHashTool.efi が archiso に追加されたことで Secure Boot を有効にして archiso を起動することが可能になりました。Failed to Start loader... I will now execute HashTool というメッセージが表示されます。HashTool を使って loader.efivmlinzu.efi のハッシュを登録するには、以下の手順に従って下さい:

  • OK を選択してください
  • HashTool のメインメニューから Enroll Hash を選択し、\loader.efi を選んで Yes で確定します。また、Enroll Hasharchiso を選択して archiso のディレクトリに入り、vmlinuz-efi を選んで Yes で確定してください。それから Exit を選択してブートデバイスの選択メニューに戻って下さい。
  • ブートデバイスの選択メニューから Arch Linux archiso x86_64 UEFI CD を選択して下さい

archiso が起動し、シェルプロンプトが表示され、自動的に root でログインがされます。archiso が Secure Boot で起動しているかどうか確認するには、次のコマンドを使って下さい (1234 という所はマシンによって異なります。タブ補完を使ったり efi 変数を表示することで調べることができます):

$ od -An -t u1 /sys/firmware/efi/vars/SecureBoot-1234abcde-5678-/data

このコマンドで返ってくるリストの最後が 1 ならば Secure Boot で起動しています。例:

6  0  0  0  1

次のコマンドを実行すると、詳しい状態を表示できます:

# bootctl status

PreLoader の設定

ノート: efitools パッケージに含まれている PreLoader.efi は署名されていないため、使い道は限られています。署名済みの PreLoader.efi[1] から入手できます。

prebootloader[リンク切れ: replaced by efitools] パッケージをインストールして PreLoader.efiHashTool.efiブートローダーのディレクトリにコピーしてください。systemd-boot の場合、以下を実行:

# cp /usr/share/efitools/efi/{PreLoader,HashTool}.efi esp/EFI/systemd

そしてブートローダーのバイナリをコピーして loader.efi に名前を変更します。systemd-boot の場合、以下を実行:

# cp esp/EFI/systemd/systemd-bootx64.efi esp/EFI/systemd/loader.efi

最後に、PreLoader.efi を起動する NVRAM エントリを新しく作成してください:

# efibootmgr --disk /dev/sdX --part Y --create --label "PreLoader" --loader /EFI/systemd/PreLoader.efi

XEFI システムパーティションのドライブ文字に、Y は同じくパーティション番号に置き換えてください。

上記のエントリは起動リストの一番最初に追加する必要があります。efibootmgr コマンドで確認して、必要であればブートローダーの設定を変更してください。

フォールバック

カスタム NVRAM エントリの起動に問題が発生する場合、HashTool.efiloader.efi を UEFI によって自動的に起動されるデフォルトのブートローダーの場所にコピーしてください:

# cp /usr/share/efitools/efi/HashTool.efi esp/EFI/Boot
# cp esp/EFI/systemd/systemd-bootx64.efi esp/EFI/Boot/loader.efi

PreLoader.efi をコピーして名前を変更します:

# cp /usr/share/efitools/efi/PreLoader.efi esp/EFI/Boot/bootx64.efi

Windows にしか対応しない非協力的な UEFI 実装の場合、PreLoader.efi を Windows で使用されるデフォルトローダーの場所にコピーしてください:

# mkdir -p esp/EFI/Microsoft/Boot
# cp /usr/share/efitools/efi/PreLoader.efi esp/EFI/Microsoft/Boot/bootmgfw.efi
ノート: Windows とデュアルブートする場合、元の bootmgfw.efi はバックアップしておいてください。ファイルを置き換えると Windows のアップデートで問題が発生する可能性があります。

上と同じように、HashTool.efiloader.efiesp/EFI/Microsoft/Boot にコピーしてください。

Secure Boot を有効にした状態でシステムを起動したら、上のセクションの手順に従って loader.efi/vmlinuz-linux (あるいは使用している他のカーネルイメージ) を登録します。

PreLoader の削除

ノート: 以下を実行する前にバックアップを作成すると良いでしょう。

インストールした efitools パッケージやコピーしたファイルを削除して、設定を元に戻します。systemd-boot の場合、以下を実行:

# rm esp/EFI/systemd/{PreLoader,HashTool}.efi
# rm esp/EFI/systemd/loader.efi
# efibootmgr -b N -B
# bootctl update

NPreLoader.efi を起動するために作成した NVRAM のブートエントリに置き換えてください。efibootmgr コマンドで確認を行なって、必要に応じてブート順序を修正してください。

ノート: 上記のコマンドは一番簡単な場合です。他のファイルを作成した場合はそれらも削除する必要があります。

自分で署名した鍵を使う

ヒント: Rod Smith's Controlling Secure Boot を読むことを推奨します。

Secure Boot では以下の鍵が使われます:

Platform Key (PK)
トップレベル鍵
Key Exchange Key (KEK)
署名データベースや EFI バイナリに署名するのに使われる鍵
Signature Database (db)
EFI バイナリに署名するのに使われる鍵やハッシュが含まれます
Forbidden Signatures Database (dbx)
EFI バイナリをブラックリスト化するのに使われる鍵やハッシュが含まれます

Secure Boot を使用するには最低でも PK, KEK, db 鍵が必要です。

鍵の作成

鍵を生成するには、efitoolsインストールが必要です。

鍵と複数の形式の証明書を作成する必要があります:

  1. 鍵を作成して sbsign のための PEM 形式の証明書を作成
  2. ファームウェア用に証明書を DER 形式に変換
  3. KeyTool のために証明書を EFI Signature List に変換

所有者を識別する GUID を作成:

$ uuidgen --random

Platform Key:

$ openssl req -new -x509 -newkey rsa:2048 -subj "/CN=my PK/" -keyout PK.key -out PK.crt -days 3650 -nodes -sha256
$ openssl x509 -outform DER -in PK.crt -out PK.cer
$ cert-to-efi-sig-list -g GUID PK.crt PK.esl
$ sign-efi-sig-list -g GUID -k PK.key -c PK.crt PK PK.esl PK.auth

空のファイル null.esl を作成して Platform Key を削除できるように署名:

$ sign-efi-sig-list -g GUID -c PK.crt -k PK.key PK null.esl rm_PK.auth

Key Exchange Key:

$ openssl req -new -x509 -newkey rsa:2048 -subj "/CN=my KEK/" -keyout KEK.key -out KEK.crt -days 3650 -nodes -sha256
$ openssl x509 -outform DER -in KEK.crt -out KEK.cer
$ cert-to-efi-sig-list -g GUID KEK.crt KEK.esl

Signature Database:

$ openssl req -new -x509 -newkey rsa:2048 -subj "/CN=my db/" -keyout db.key -out db.crt -days 3650 -nodes -sha256
$ openssl x509 -outform DER -in db.crt -out db.cer
$ cert-to-efi-sig-list -g GUID db.crt db.esl

ブートローダーとカーネルの署名

Secure Boot を有効にすると ("User Mode")、署名したバイナリしか起動できなくなるため、カーネルとブートローダーに署名が必要です。

sbsigntools をインストールしてください。

ノート: --output を付けずに sbsign を実行すると作成されるファイルは filename.signed となります。
# sbsign --key db.key --cert db.crt /boot/vmlinuz-linux
# sbsign --key db.key --cert db.crt --output esp/EFI/BOOT/BOOTX64.EFI esp/EFI/BOOT/BOOTX64.EFI

ブートローダーのエントリにカーネルオプション vmlinuz-linux.signed を追加してください。

ファームウェアを "Setup Mode" にする

Platform Key を削除するとき Secure Boot は Setup Mode になります。ファームウェアを Setup Mode にするには、ファームウェアのセットアップユーティリティを起動して証明書を削除・消去するオプションを探して下さい。

ファームウェアに鍵を登録

*.cer, *.esl, *.auth を全て FAT でフォーマットされたファイルシステムにコピーしてください (EFI システムパーティションを使うことができます)。

ファームウェアのセットアップユーティリティあるいは KeyTool を起動して db, KEK, PK 証明書を登録してください。

使用しているツールが .auth.esl をサポートしている場合 .cer よりも優先して使って下さい。

警告: Platform Key を登録すると Secure Boot が "User Mode" になるため、Platform Key は最後に登録してください。

ファームウェアのセットアップユーティリティを使う

ファームウェアには様々なインターフェイスがあります。鍵を登録する例が Replacing Keys Using Your Firmware's Setup Utility に載っています。

KeyTool を使う

KeyTool.efiefitools パッケージに含まれているので、ESP にコピーしてください。鍵を登録した後に使用するには、sbsign で署名する必要があります:

# sbsign --key db.key --cert db.crt --output esp/EFI/KeyTool-signed.efi /usr/share/efitools/efi/KeyTool.efi

ファームウェアのセットアップユーティリティやブートローダー、あるいは UEFI シェルKeyTool-signed.efi を起動して鍵を登録してください。

KeyTool のメニューオプションの解説は Replacing Keys Using KeyTool を参照。