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

提供: ArchWiki
2022年7月15日 (金) 12:50時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎自分で署名した鍵を使う: セクション名変更)
ナビゲーションに移動 検索に移動

関連記事

セキュアブートとは、UEFI 規格に含まれているセキュリティ機能であり、プリブートプロセスへの保護レイヤを追加するために設計されました。起動時の実行を許可または禁止されているバイナリの暗号署名されたリストを保持することにより、マシンのコアブートコンポーネント(ブートマネージャ、カーネル、initramfs)が改ざんされていないという信頼性を高めるのに役立ちます。

なので、セキュアブートは、コンピュータ環境をセキュアに保つ試みの一環、あるいはそれを補完するものであるとみなせます。システムの暗号化のような他のソフトウェアのセキュリティ対策では簡単にカバーできない攻撃面を減らしますが、完全に異なったものであり、それらに依存していません。セキュアブートは、独自の長所と短所を備えた、現在のセキュリティ慣例の一つの要素として独立しています。

ノート: Linux におけるセキュアブートについてのより詳細な概要は、Rodsbooks' Secure Boot の記事と他のオンライン上のリソース を参照してください。この記事では、Arch Linux でセキュアブートをセットアップする方法に焦点を置いています。

目次

セキュアブートの状態を確認する

OS の起動前

OS の起動前にセキュアブートの状態を確認するには、ファームウェアのセットアップ画面を見る必要があります。すでにマシンが起動済みであれば、ほとんどの場合再起動する必要があります。

起動プロセス中に特別なキーを押すことでファームウェアのセットアップ画面にアクセスできます。どのキーかはファームウェアに依りますが、通常 EscF2Del、のどれかです。もしかすると、他のファンクションキーかもしれません。ファームウェアによっては、どのキー押すべきかが起動プロセスの開始時に短い時間表示されます。通常、マザーボードのマニュアルにキーが記載されています。マシンの電源を入れたらすぐに(スクリーンが表示されるよりも前に)キーを押して、そのまま押し続ける必要があるかもしれません。

ファームウェアのセットアップ画面に入ったら、意図せずに設定を変更してしまわないよう気をつけてください。通常、セットアップ画面の下部に案内指示や設定の短いヘルプがあります。セットアップ自体はいくつかのページから構成されているかもしれません。それらのページの中から正しい場所に移動する必要があります。設定は単に「セキュアブート」と表示されるかもしれません(これでオン/オフを設定できます)。

OS の起動後

systemd を使用するシステム上では、systemd-boot でセキュアブートの状態を簡単に確認できます:

ノート: 以下のコマンドを実行するために systemd-boot をブートマネージャとして使う必要はありません。これは他の *ctl systemd ユーティリティと似ていて、設定に干渉しません。
$ bootctl status
System:
     Firmware: UEFI 2.70 (American Megatrends 5.15)
  Secure Boot: enabled
   Setup Mode: user
 Boot into FW: supported
...

ここでは、セキュアブートが有効化され強制されていることがわかります。他に取りうる値は、"Secure Boot" は disabled、"Setup Mode" は setup です[1]

この記事またはセクションの正確性には問題があります。
理由: セキュアブートが有効化されている場合でも、以下のコマンドは6つ以上の数値を出力するかもしれません。 (議論: トーク:Unified Extensible Firmware Interface/セキュアブート#)

マシンがセキュアブートで起動されているかどうかを調べる他の方法は、以下のコマンドを使用することです:

$ od --address-radix=n --format=u1 /sys/firmware/efi/efivars/SecureBoot*

セキュアブートが有効化されている場合、このコマンドは5つの数値の最後に 1 を出力します。例えば:

6  0  0  0  1

しかし、機能が不十分なブートローダを使用している場合、(ファームウェアで有効になっている場合でも)カーネルがセキュアブートを検出できない場合があります。これは、システムの起動直後にカーネルのメッセージを確認することで確認できます:

# dmesg | grep -i secure
[    0.013442] Secure boot disabled
[    0.013442] Secure boot could not be determined

セキュアブートが検出された場合、カーネルメッセージは Secure boot enabled となります。

インストールメディアを起動する

ノート: 公式の Arch インストールイメージはセキュアブートをサポートしていません(FS#53864)。Arch インストールメディアを起動するには、セキュアブートを無効化する必要があります。

Arch インストールメディアのセキュアブートサポートは archlinux-2013.07.01-dual.iso で初めて追加されました。しかし、その後 archlinux-2016.06.01-dual.iso で削除されました。その時、prebootloader は、未署名の EFI バイナリを使用する efitools に置き換えられました。それ以降、公式のインストールメディアにセキュアブートのサポートが追加されることはありませんでした。

Archboot イメージはインストールメディアでセキュアブートを使用する手段を提供します。

セキュアブートを無効化する

セキュアブートの機能は UEFI インターフェイスを通して無効化できます。ファームウェアの設定画面にアクセスする方法は #OS の起動前 で説明されています。

ホットキーが使用できず Windows が起動する場合、次の方法で強制的にファームウェア設定を開くように再起動できます (Windows 10 の場合): Settings > Update & Security > Recovery > Advanced startup (Restart now) > Troubleshoot > Advanced options > UEFI Firmware settings > restart

一部のマザーボード (例: Packard Bell 製ノートパソコン) では、管理者パスワードを設定しないとセキュアブートを無効化できません (無効化した後に管理者パスワードは消去できます)。Rod Smith の Secure Boot 無効化に関する記事 も参照。

インストールイメージをリマスタリングする

この記事またはセクションは加筆を必要としています。

インストール ISO をリマスタリングする必要があるかもしれません。例えば、#PreLoader の署名済み EFI アプリケーション PreLoader.efiHashTool.efi が使えます。他の手段としては、セキュアブートをサポートする他の GNU+Linux ディストリビューションのインストールメディアから BOOTx64.EFI (shim) と grubx64.efi を拝借するというものがあります。この場合、セキュアブートの認証チェーンは grubx64.efi で途絶える必要がありますUbuntu の例)。そうすることで、GRUB は archiso の未署名のカーネルと initramfs を起動できます。気をつけるべきなのは、この時点でマシンの ESP にアクセス可能であると仮定していることです。しかし、OS の存在しないマシン上にインストールする際は、ESP が存在しません。この状況にどう対処すべきかは他の記事を参照してください(例えば Unified Extensible Firmware Interface#ISO から UEFI ブータブル USB を作成する)。

セキュアブートを実現する

セキュアブートの理想的なセットアップを実現するにはいくつか条件があります:

  1. UEFI がほぼ信頼されていて(しかし、いくつかのよく知られた批判と脆弱性[2]がある)、必ず強力なパスワードで保護されていること。
  2. メーカー/サードパーティーのデフォルトの鍵は、セキュアブートのセキュリティモデルを大幅に弱化させることが判明しているので、使用しないこと。[3]
  3. セキュアブートによって確立された信頼の鎖をブート中に維持して攻撃面を減らすために、マイクロコード(必要な場合)と initramfs を含む、ユーザ署名済み結合 EFISTUB カーネルイメージ(ブートマネージャ無し)を UEFI が直接ロードすること。
  4. マシンへ物理的にアクセスできる誰かが、カーネルイメージの作成と署名プロセスで使用されるツールとファイルにアクセスしたり改ざんしたりできないようにするために、ドライブの完全暗号化を使用すること。
  5. TPM を使うことでさらに改善することができるかもしれませんが、ツールやサポートの問題がこれを難しくしています。

シンプルかつ完全に自立したセットアップは #自分の鍵を使う で説明されています。一方、#署名済みのブートローダーを使う では、サードパーティにより署名された中間ツールを使用します。

自分の鍵を使う

警告: プラットフォームの鍵をあなたの鍵で置き換えると、一部のマシン(ノート PC を含む)でハードウェアを文鎮化してしまう可能性があります。そうなると、修正するために UEFI/BIOS の設定画面に入ることが不可能になります。これは、一部のデバイス(GPU など)の、起動中に実行されるファームウェア(OpROMs)が、Microsoft の鍵を使って署名されているためです。

セキュアブートでは以下の鍵が使われます:

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

より詳細な説明は The Meaning of all the UEFI Keys を見てください。

セキュアブートをを使用するには最低でも PK, KEK, db 鍵が必要です。KEK, db, dbx 証明書は複数追加できますが、Platform Key はひとつしか使えません。

Secure Boot を "User Mode" にすると、上位の鍵を使用してアップデートに署名しないかぎり鍵を更新できなくなります (sign-efi-sig-list を使用)。Platform key は自分自身で署名することができます。

efitools をインストールする

以下のほぼ全てのセクションで、efitools パッケージがインストールされている必要があります。

現在の変数をバックアップする

新しい鍵を作成したり EFI 変数を変更したりする前に、現在の変数をバックアップしておくことを推奨します。そうすれば、エラーが発生した場合に変数を復元できます。

主要なセキュアブートの変数4つを全てバックアップするには、以下のコマンドを実行してください:

$ efi-readvar -v PK -o old_PK.esl
$ efi-readvar -v KEK -o old_KEK.esl
$ efi-readvar -v db -o old_db.esl
$ efi-readvar -v dbx -o old_dbx.esl

新しいコンピュータやマザーボードでこれらのコマンドを実行する場合、抽出される変数はおそらくマイクロソフトにより提供されたものでしょう。

鍵を作成する

手動による手順

鍵を生成するには以下の手順を行ってください:

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

.key
EFI バイナリと EFI 署名リストの署名に必要な PEM 形式の秘密鍵。
.crt
sbsign(1)sbvarsign(1)sign-efi-sig-list(1) で必要な PEM 形式の証明書。
.cer
ファームウェアが使用する DER 形式の証明書。
.esl
sbvarsign(1)efi-updatevar(1)KeyTool、ファームウェアのための EFI 署名リストの証明書。
.auth
efi-updatevar(1)sbkeysyncKeyTool、ファームウェアのための認証ヘッダが付いた EFI 署名リストの証明書 (つまり、署名済みの証明書アップデートファイル)。

所有者を識別する GUID を作成してください:

$ uuidgen --random > GUID.txt

Platform key:

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

"User Mode" で Platform Key を削除できるようにするために空のファイルを署名してください:

$ sign-efi-sig-list -g "$(< GUID.txt)" -c PK.crt -k PK.key PK /dev/null rm_PK.auth

Key Exchange Key:

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

Signature Database key:

$ openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=my Signature Database key/" -out db.crt
$ openssl x509 -outform DER -in db.crt -out db.cer
$ cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
$ sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth
ヘルパースクリプト

便利なヘルパースクリプトがこのトピックの参照メージの著者により提供されています[4](python が必要です)。簡単に編集されたバージョンも sbkeysAUR としてパッケージングされています。

スクリプトを使うには、安全な場所にフォルダを作成し(例えば、後で sbupdate-gitAUR を使って unified カーネルイメージを作成し署名する予定なのであれば /etc/efi-keys/)、スクリプトを実行してください:

# mkdir /etc/efi-keys
# cd !$
# curl -L -O https://www.rodsbooks.com/efi-bootloaders/mkkeys.sh
# chmod +x mkkeys.sh
# ./mkkeys.sh
<鍵に埋め込む Common Name を入力(例: "Secure Boot")>

これは様々な形式で必要なファイルを生成します。

鍵をアップデートする

一度セキュアブートを "User Mode" にしたら、KEK, db, dbx を変更するには上位の鍵による署名が必要です。

例えば、db 鍵を新しいものに置き換えたい場合:

  1. 新しい鍵を作成
  2. EFI 署名リストに変換
  3. EFI 署名リストに署名
  4. 署名された証明書アップデートファイルを登録
$ cert-to-efi-sig-list -g "$(< GUID.txt)" new_db.crt new_db.esl
$ sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db new_db.esl new_db.auth

db 鍵を置き換えるかわりに Signature Database に別の鍵を追加したい場合、-a オプションを使う必要があります (sign-efi-sig-list(1) を参照):

$ sign-efi-sig-list -a -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db new_db.esl new_db.auth

new_db.auth が作成されたら登録してください。

EFI バイナリに署名する

セキュアブートを有効化(つまり "User Mode" に)すると、署名した EFI バイナリ(例: アプリケーション、ドライバUnified カーネルイメージ)しか起動できなくなります。

sbsigntools を使って手動で行う

sbsigntoolsインストールして、sbsign(1) で EFI バイナリに署名してください。

ヒント:
  • バイナリが署名されたかどうか確認したり署名を一覧表示したりするには: $ sbverify --list /path/to/binary
  • rEFInd ブートマネージャの refind-install スクリプトで rEFInd EFI バイナリを署名し、ESP へ db 証明書と一緒にコピーできます。手順は rEFInd#自分の鍵を使う を見てください。
ノート: sbsign--output 無しで実行すると、出力されるファイルは filename.signed となります。詳細は sbsign(1) を見てください。

カーネルとブートマネージャに署名するには、sbsign を使用してください。例えば:

# sbsign --key db.key --cert db.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux
# sbsign --key db.key --cert db.crt --output esp/EFI/BOOT/BOOTx64.EFI esp/EFI/BOOT/BOOTx64.EFI
警告: カーネル以外を署名しなかったら initramfs を改ざんから守ることはできません。sbsign で手動で署名できる結合イメージを生成する方法は Unified カーネルイメージ を見てください。
pacman フックでカーネルに署名する

mkinitcpio の pacman フックを使って、インストール時とアップデート時にカーネルに署名することもできます。

/usr/share/libalpm/hooks/90-mkinitcpio-install.hook/etc/pacman.d/hooks/90-mkinitcpio-install.hook に、/usr/share/libalpm/scripts/mkinitcpio-install/usr/local/share/libalpm/scripts/mkinitcpio-install にコピーしてください。

/etc/pacman.d/hooks/90-mkinitcpio-install.hook 内の

Exec = /usr/share/libalpm/scripts/mkinitcpio-install

Exec = /usr/local/share/libalpm/scripts/mkinitcpio-install

に置き換えてください。

/usr/local/share/libalpm/scripts/mkinitcpio-install 内の

install -Dm644 "${line}" "/boot/vmlinuz-${pkgbase}"

sbsign --key /path/to/db.key --cert /path/to/db.crt --output "/boot/vmlinuz-${pkgbase}" "${line}"

に置き換えてください。

systemd-boot を使用している場合、この作業を半自動的に行う専用の pacman フックが存在します。

sbupdate による完全に自動化された unified カーネルの生成と署名

sbupdate は、Arch Linux で unified カーネルイメージの生成と署名を自動化するために特別に作られたツールです。このツールは、pacman フックを通してカーネルのインストール・削除・アップデートを処理します。

sbupdate-gitAUR をインストールして、プロジェクトのホームページにある手順に従って設定してください。[5]

ヒント: systemd-boot を使用している場合、設定の必要とせずにに署名済みのカーネルイメージを直接認識させるために OUT_DIR="EFI/Linux" を設定してください。systemd-boot(7) § FILESSystemd-boot#ローダーの追加 を参照してください。

設定したら、イメージを生成するために sbupdate を root として実行してください。

ノート: sbupdate の出力にはしばしばエラーを含んでいます(例えば warning: data remaining[26413568 vs 26423180]: gaps between PE/COFF sections?)。これらは無害で、安全に無視できます。[6]

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

Platform Key が削除されると、セキュアブートは Setup Mode になります。ファームウェアを Setup Mode にするには、ファームウェア設定ユーティリティに入り、証明書を削除/クリアするオプションを探してください。設定ユーティリティに入る方法は #OS の起動前 で説明されています。

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

dbKEKPK 証明書を登録するには、以下に述べる方法のうち1つを使ってください。

ヒント: dbx (forbidden signatures db) は空なので、以下の手順では省いても安全です。
警告: Platform Key を登録するとセキュアブートは "Setup Mode" から "User Mode" になります。なので、Platform Key は最後に登録する必要があります。
sbkeysync を使う

sbsigntools をインストールしてください。そして、以下のディレクトリ構造を持つ /etc/secureboot/keys ディレクトリを作成してください:

/etc/secureboot/keys
├── db
├── dbx
├── KEK
└── PK

例えば、以下のように:

# mkdir -p /etc/secureboot/keys/{db,dbx,KEK,PK}

そして、先程生成した .auth ファイルをそれぞれの場所にコピーしてください(例えば、PK.auth/etc/secureboot/keys/PK へといった感じです)。

sbkeysync がシステムの UEFI に加える変更を確認したい場合は、以下を使用してください:

# sbkeysync --pk --dry-run --verbose

最後に、sbkeysync を使って鍵を登録してください。

# sbkeysync --verbose
# sbkeysync --verbose --pk
ヒント:
  • sbkeysync で書き込みエラーが発生した場合、sbkeysync のコマンドの前にまず chattr -i /sys/firmware/efi/efivars/{PK,KEK,db}* を実行して、ファイルの属性を一時的に変更してください。これで、efivars ディレクトリ内の EFI 鍵を書き込むことができます。chattr(1) を参照してください。
  • PK.authpermission denied エラーが発生する場合、次のコマンドでその鍵を登録できます: efi-updatevar -f /etc/secureboot/keys/PK/PK.auth PK

次の起動時に、UEFI は User Mode に戻り、セキュアブートポリシーを強制するはずです。

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

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

ファームウェアのセットアップユーティリティを起動し、dbKEKPK 証明書を登録してください。ファームウェアのインターフェイスは様々です。鍵を登録する例は Replacing Keys Using Your Firmware's Setup Utility を見てください。

使用するツールがサポートしていれば、.cer よりも .auth.esl を使用することを推奨します。

KeyTool を使う

KeyTool.efiefitools パッケージに含まれています。それを ESP にコピーしてください。鍵を登録した後にこのツールを使うには、sbsign で署名してください。

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

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

KeyTool メニューオプションの説明は Replacing Keys Using KeyTool を見てください。

他のオペレーティングシステムとデュアルブートする

Microsoft Windows
この記事またはセクションは加筆を必要としています。

Windows のデュアルブートをするには、Microsoft の証明書を Signature Database に追加する必要があります。Microsoft は2つの db 証明書を用意しています:

Microsoft の GUID (77fa9abd-0359-4d32-bd60-28f4e78f784b) を使って EFI 署名リストを作成してひとつのファイルにまとめます:

$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_db.esl MicWinProPCA2011_2011-10-19.crt
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_UEFI_db.esl MicCorUEFCA2011_2011-06-27.crt
$ cat MS_Win_db.esl MS_UEFI_db.esl > MS_db.esl

KEK を使って db アップデートに署名してください。sign-efi-sig-list-a オプションを付けて db 証明書を追加します(置き換えるのではありません):

$ sign-efi-sig-list -a -g 77fa9abd-0359-4d32-bd60-28f4e78f784b -k KEK.key -c KEK.crt db MS_db.esl add_MS_db.auth

#ファームウェアに鍵を登録するに従って add_MS_db.auth を Signature Database に追加してください。

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

署名済みのブートローダーを使うというのは Microsoft の鍵で署名されたブートローダーを使うということです。署名済みのブートローダーとしては PreLoader と shim が存在します。どちらも他の EFI バイナリ (通常のブートローダー) をチェインロードします。Microsoft は未署名のあらゆるバイナリを自動起動するブートローダーに署名しないことになっているため、PreLoader と shim は Machine Owner Key リストと呼ばれるホワイトリストを使っています。バイナリの SHA256 ハッシュあるいはバイナリの署名鍵が MokList に存在する場合、バイナリが起動されますが、存在しない場合はハッシュや鍵を登録するための鍵管理ユーティリティが起動します。

PreLoader

起動時に PreLoader は loader.efi を実行しようとします。MokList に loader.efi のハッシュが存在しない場合、PreLoader は HashTool.efi を起動します。HashTool で起動したい EFI バイナリのハッシュ、つまりブートローダー (loader.efi) とカーネルを登録する必要があります。

ノート: バイナリ (ブートローダーやカーネル) をアップデートするたびに新しいハッシュの登録が必要です。
ヒント: rEFInd ブートマネージャの refind-install スクリプトは rEFInd と PreLoader EFI バイナリを ESP にコピーできます。手順は rEFInd#PreLoader を使う を見てください。
PreLoader をセットアップする
ノート: efitools パッケージに含まれている PreLoader.efiHashTool.efi は署名されていないため、使い道は限られています。署名済みの PreLoader.efiHashTool.efi を入手するには preloader-signedAUR をインストールするか 手動でダウンロード します。

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

# cp /usr/share/preloader-signed/{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 --verbose --disk /dev/sdX --part Y --create --label "PreLoader" --loader /EFI/systemd/PreLoader.efi

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

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

フォールバック

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

# cp /usr/share/preloader-signed/HashTool.efi esp/EFI/BOOT/
# cp esp/EFI/systemd/systemd-bootx64.efi esp/EFI/BOOT/loader.efi

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

# cp /usr/share/preloader-signed/PreLoader.efi esp/EFI/BOOT/BOOTx64.EFI

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

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

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

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

起動途中で使用するには?

Failed to Start loader... I will now execute HashTool. というメッセージが表示されるでしょう。loader.efivmlinuz.efi のハッシュを登録するために HashTool を使用するには、以下の手順を踏んでください。以下の手順では、リマスタリングされた archiso インストールメディアのタイトルについて仮定をおいています。実際のタイトルはブートローダのセットアップに依存します。

  • OK を選択してください
  • HashTool のメインメニューで、Enroll Hash を選択し、\loader.efi を選んで Yes で確定してください。再び Enroll Hasharchiso を選択し archiso のディレクトリに入って、vmlinuz.efi を選択し、Yes で確定してください。そして、Exit を選択してブートデバイスの選択メニューに戻ってください。
  • ブートデバイスの選択メニューで、Arch Linux archiso x86_64 UEFI CD を選んでください。
PreLoader を除去する
ノート: 以下を実行する前にバックアップを作成すると良いでしょう。

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

# rm esp/EFI/systemd/{PreLoader,HashTool}.efi
# rm esp/EFI/systemd/loader.efi
# efibootmgr --verbose --bootnum N --delete-bootnum
# bootctl update

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

ノート: 上記のコマンドは一番簡単な場合です。他にもファイルを作成したり、コピーしたり、ファイル名を変更したり、編集したりした場合、おそらくそれらも処理する必要があります。PreLoader をブートエントリとして使用していた場合、明らかに#セキュアブートを無効化する必要もあります。
登録したハッシュを削除する

MOK データベースに登録されたハッシュのエントリは NVRAM の容量を少し圧迫します。空き容量を増やしたり、時代遅れなプログラムが起動しないようにしたりするために、場合によっては使用しないハッシュを削除する必要があるでしょう。

efitoolsインストールし、KeyTool.efi をコピーしてください:

# cp /usr/share/efitools/efi/KeyTool.efi esp/EFI/systemd/KeyTool.efi

PreLoader を起動するよう設定すれば、KeyTool のエントリが現れます。これで、MOK データベース内のハッシュを編集することができます。

shim

この記事またはセクションは加筆を必要としています。

起動時に shim は grubx64.efi を実行しようとします。MokList に grubx64.efi のハッシュあるいは署名鍵が存在しない場合、shim は mmx64.efi を起動します。MokManager で起動したい EFI バイナリ (ブートローダー (grubx64.efi) とカーネル) のハッシュか署名鍵を登録する必要があります。

ノート:
  • #shim でハッシュを使う を使う場合、バイナリ(例: ブートローダやカーネル)を更新するたびに、新しいハッシュをを登録する必要があります。
  • バージョン 15.3 以降、shim は、有効な .sbat セクションが無いと EFI バイナリを起動しません。EFI バイナリが .sbat セクションを持っているか確認するには、objdump -j .sbat -s /path/to/binary.efi を実行してください。詳細は SBAT ドキュメント を見てください。
  • セキュアブートがもたらすセキュリティには興味がなく、Windows 11 の要件のためだけにセキュアブートを有効化する場合、mokutil --disable-validation で shim の認証プロセスを無効化すると良いかもしれません。その場合、grub(sbat は依然として必要でしょう)やカーネルイメージを署名する必要はありません。それと同時に、grub の chainloader で Windows を起動することができます。
shim をセットアップする
ヒント: rEFInd ブートマネージャの refind-install スクリプトは rEFInd EFI バイナリを署名することができ、shim や MOK 証明書と一緒にバイナリを ESP にコピーできます。手順は rEFInd#shim を使う を見てください。

shim-signedAURインストールしてください。

現在のブートローダーの名前を grubx64.efi に変更してください:

# mv esp/EFI/BOOT/BOOTx64.EFI esp/EFI/BOOT/grubx64.efi

shimMokManager を ESP 上のブートローダーのディレクトリにコピーしてください; shimx64.efi はブートローダの以前のファイル名を使ってください:

ノート:
  • 有効な bootx64.csv が存在しない限り、fbx64.efi (同じディレクトリ内にあります)はコピーしないでください。さもないと、shim は grubx64.efi を実行せず、動作に失敗してマシンをリセットします。
# cp /usr/share/shim-signed/shimx64.efi esp/EFI/BOOT/BOOTx64.EFI
# cp /usr/share/shim-signed/mmx64.efi esp/EFI/BOOT/

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

# efibootmgr --verbose --disk /dev/sdX --part Y --create --label "Shim" --loader /EFI/BOOT/BOOTx64.EFI

shim は、MokList に格納されている Machine Owner Key やハッシュによってバイナリを認証することができます。

Machine Owner Key (MOK)
EFI バイナリに署名するためにユーザが生成し利用する鍵
hash
EFI バイナリの SHA256 ハッシュ

ハッシュを用いるのは単純ですが、ブートローダやカーネルをアップデートするたびに、MokManager 内のそれらのハッシュを追加する必要があります。MOK では鍵を一度追加するだけで済みますが、ブートローダとカーネルをアップデートするたびに、それらに署名する必要があります。

shim でハッシュを使う

shim は、MokList に grubx64.efi の SHA256 ハッシュが存在しない場合、mmx64.efi を起動します。

MokManagerEnroll hash from disk を選択してから grubx64.efi を探して MokList に追加してください。同じようにカーネルの vmlinuz-linux も追加してください。完了したら Continue boot を選択してください。ブートローダーが起動してカーネルが起動します。

shim で鍵を使う

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

以下のファイルが必要です:

.key
EFI バイナリに署名するための PEM 形式の秘密鍵。
.crt
sbsign で使うための PEM 形式の証明書。
.cer
MokManager で使うための DER 形式の証明書。

Machine Owner Key を作成:

$ openssl req -newkey rsa:4096 -nodes -keyout MOK.key -new -x509 -sha256 -days 3650 -subj "/CN=my Machine Owner Key/" -out MOK.crt
$ openssl x509 -outform DER -in MOK.crt -out MOK.cer

(grubx64.efi という名前の) ブートローダーとカーネルに署名:

# sbsign --key MOK.key --cert MOK.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux
# sbsign --key MOK.key --cert MOK.crt --output esp/EFI/BOOT/grubx64.efi esp/EFI/BOOT/grubx64.efi

ブートローダーとカーネルをアップデートするたびに上記の署名が必要です。カーネルの署名は pacman フック で自動化できます。例えば:

/etc/pacman.d/hooks/999-sign_kernel_for_secureboot.hook
[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = linux
Target = linux-lts
Target = linux-hardened
Target = linux-zen

[Action]
Description = Signing kernel with Machine Owner Key for Secure Boot
When = PostTransaction
Exec = /usr/bin/find /boot/ -maxdepth 1 -name 'vmlinuz-*' -exec /usr/bin/sh -c 'if ! /usr/bin/sbverify --list {} 2>/dev/null | /usr/bin/grep -q "signature certificates"; then /usr/bin/sbsign --key MOK.key --cert MOK.crt --output {} {}; fi' ;
Depends = sbsigntools
Depends = findutils
Depends = grep

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

再起動してセキュアブートを有効にしてください。shim は MokList に grubx64.efi を署名するときに使った証明書がない場合、mmx64.efi を起動します。

MokManagerEnroll key from disk を選択してから MOK.cer を探して MokList に追加してください。完了したら Continue boot を選択してください。ブートローダーが起動して、Machine Owner Key で署名されたバイナリを起動できるようになります。

shim で鍵と GRUB を使う

まず、前のセクションの作業を完了してください。

TPM モージュールを有効化して /usr/share/grub/sbat.csv を使って GRUB を再インストールしてください。そして、それに署名してください:

# grub-install --target=x86_64-efi --efi-directory=esp --modules="tpm" --sbat /usr/share/grub/sbat.csv
# sbsign --key MOK.key --cert MOK.crt --output esp/EFI/GRUB/grubx64.efi esp/EFI/GRUB/grubx64.efi
# cp esp/GRUB/grubx64.efi esp/boot/grubx64.efi

再起動して、MokManager で鍵を選択すれば、セキュアブートが機能するはずです。

shim を除去する

shim-signedAURアンインストールして、コピーした shimMokManager のファイルを削除してブートローダーを元の名前に戻してください。

セキュアブートを保護する

マシンに物理アクセスできる者がセキュアブートを無効化してしまうことを阻止する唯一の方法は、ファームウェアの設定をパスワードで保護することです。

ほとんどの UEFI ファームウェアはそのような機能を提供します。通常、ファームウェア設定の「セキュリティ」セクションにその項目があるはずです。

参照