「Unified Extensible Firmware Interface/セキュアブート」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(ユニファイドカーネルイメージに変更)
 
(2人の利用者による、間の8版が非表示)
30行目: 30行目:
 
{{Note|以下のコマンドを実行するために systemd-boot をブートマネージャとして使う必要はありません。これは他の *ctl systemd ユーティリティ (localectl, timedatectl...) と似たもので、設定に干渉しません。}}
 
{{Note|以下のコマンドを実行するために systemd-boot をブートマネージャとして使う必要はありません。これは他の *ctl systemd ユーティリティ (localectl, timedatectl...) と似たもので、設定に干渉しません。}}
   
{{bc|$ bootctl status
+
{{hc|$ bootctl|
 
System:
 
System:
Firmware: UEFI 2.70 (American Megatrends 5.15)
+
Firmware: UEFI 2.80 (American Megatrends 5.26)
  +
Firmware Arch: x64
Secure Boot: enabled
 
Setup Mode: user
+
Secure Boot: enabled (user)
  +
TPM2 Support: yes
Boot into FW: supported
 
  +
Boot into FW: supported
 
...
 
...
 
}}
 
}}
   
ここでは、セキュアブートが有効化され強制されていることがわかります。他に取りうる値は、"Secure Boot" は {{ic|disabled}}、"Setup Mode" は {{ic|setup}} ([https://github.com/systemd/systemd/issues/8154#issue-296106251 例])
+
ここでは、セキュアブートが (ユーザモードで) 有効化され強制されていることがわかります。他に取りうる値としては、Setup Mode の場合は {{ic|disabled (setup)}}、セキュアブートが無効化されている場合は {{ic|disabled (disabled)}}、ファームウェアにセキュアブートのサポートがない場合は {{ic|disabled (unsupported)}} があります。
   
 
マシンがセキュアブートで起動されているかどうかを調べる他の方法は、以下のコマンドを使用することです:
 
マシンがセキュアブートで起動されているかどうかを調べる他の方法は、以下のコマンドを使用することです:
60行目: 61行目:
 
== インストールメディアを起動する ==
 
== インストールメディアを起動する ==
   
{{Note|公式の Arch インストールイメージはセキュアブートをサポートしていません ({{Bug|53864}})。Arch インストールメディアを起動するには、[[#セキュアブートを無効化する|セキュアブートを無効化]]する必要がありま}}
+
公式の Arch インストールイメージはセキュアブートをサポートしていません ({{Bug|53864}})。Arch インストールメディアセキュアブートサポートは {{ic|archlinux-2013.07.01-dual.iso}} で初めて追加されました。しかし、その後 {{ic|archlinux-2016.06.01-dual.iso}} で削除されました。その時、''prebootloader'' は、未署名の EFI バイナリ使用する {{pkg|efitools}} に置き換えられました。それ以降、公式のインストールメディアにセキュアブートのサポート追加されることはありませんでした
   
  +
インストールメディアをセキュアブートのシステムでブートするには、セキュアブートを無効化するか、イメージを変更して署名されたブートローダを追加する必要があります。
Arch インストールメディアのセキュアブートサポートは {{ic|archlinux-2013.07.01-dual.iso}} で初めて追加されました。しかし、その後 {{ic|archlinux-2016.06.01-dual.iso}} で削除されました。その時、''prebootloader'' は、未署名の EFI バイナリを使用する {{pkg|efitools}} に置き換えられました。それ以降、公式のインストールメディアにセキュアブートのサポートが追加されることはありませんでした。
 
   
 
[https://gitlab.archlinux.org/tpowa/archboot/-/wikis/Archboot-Homepage Archboot] イメージはインストールメディアでセキュアブートを使用する手段を提供します。
 
[https://gitlab.archlinux.org/tpowa/archboot/-/wikis/Archboot-Homepage Archboot] イメージはインストールメディアでセキュアブートを使用する手段を提供します。
74行目: 75行目:
 
一部のマザーボード (例: Packard Bell 製ノートパソコンや最近の Xiaomi ノートパソコン) では、管理者パスワードを設定しないとセキュアブートを無効化できません (無効化した後に管理者パスワードは消去できます)。[https://www.rodsbooks.com/efi-bootloaders/secureboot.html#disable Rod Smith の Secure Boot 無効化に関する記事] も参照。
 
一部のマザーボード (例: Packard Bell 製ノートパソコンや最近の Xiaomi ノートパソコン) では、管理者パスワードを設定しないとセキュアブートを無効化できません (無効化した後に管理者パスワードは消去できます)。[https://www.rodsbooks.com/efi-bootloaders/secureboot.html#disable Rod Smith の Secure Boot 無効化に関する記事] も参照。
   
=== インストールイメージをリマスタリングする ===
+
=== インストールイメージを再パックする ===
   
  +
[[#ISO の再パック]] を見てください。
[[インストール ISO のリマスタリング|インストール ISO をリマスタリング]]する必要があるかもしれません。例えば、[[#PreLoader]] の署名済み EFI アプリケーション {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} が使えます。他の手段としては、セキュアブートをサポートする他の GNU+Linux ディストリビューションのインストールメディアから {{ic|BOOTx64.EFI}} (shim) と {{ic|grubx64.efi}} を拝借し、GRUB の設定を必要に応じて変更するというものがあります。この場合、セキュアブートの認証チェーンは {{ic|grubx64.efi}}([https://www.linux-magazine.com/index.php/layout/set/print/Issues/2014/164/The-State-of-Secure-Boot/(tagid)/154 Ubuntu の例])までとし、GRUB は archiso から未署名のカーネルと initramfs を起動するようにします。気をつけるべきなのは、この時点でユーザがマシンの [[ESP]] にアクセス可能であると仮定していることです。しかし、OS の存在しないマシン上にインストールする際は、ESP が存在しません。この状況にどう対処すべきかは他の記事を参照してください (例えば [[Unified Extensible Firmware Interface#ISO から UEFI ブータブル USB を作成する]])。
 
  +
  +
=== インストールメディアを編集する ===
  +
  +
[[USB インストールメディア]]を使用している場合、そのメディア上の [[EFI システムパーティション]]を手動で編集してセキュアブートのサポートを追加することが可能です。
  +
  +
USB ドライブを挿入し、EFI システムパーティションを[[マウント]]してください:
  +
  +
# mount /dev/disk/by-label/ARCHISO_EFI /mnt
  +
  +
そして、[[#署名済みのブートローダを使う]] の指示に従って、署名済みのブートローダをインストールしてください。例えば、[[#PreLoader]] をインストールするには:
  +
  +
{{bc|
  +
# mv /mnt/EFI/BOOT/BOOTx64.EFI /mnt/EFI/BOOT/loader.efi
  +
# cp /usr/share/preloader-signed/PreLoader.efi /mnt/EFI/BOOT/BOOTx64.EFI
  +
# cp /usr/share/preloader-signed/HashTool.efi /mnt/EFI/BOOT/HashTool.efi
  +
}}
   
 
== セキュアブートを実現する ==
 
== セキュアブートを実現する ==
89行目: 106行目:
   
 
シンプルかつ完全に自立したセットアップは [[#自分の鍵を使う]] で説明されています。一方、[[#署名済みのブートローダを使う]] では、サードパーティにより署名された中間ツールを使用します。
 
シンプルかつ完全に自立したセットアップは [[#自分の鍵を使う]] で説明されています。一方、[[#署名済みのブートローダを使う]] では、サードパーティにより署名された中間ツールを使用します。
  +
  +
[[GRUB]] ブートローダを使うには、セキュアブートを有効化する前に追加の手順が必要になります。詳細は [[GRUB#セキュアブートサポート]] を参照してください。
   
 
=== 自分の鍵を使う ===
 
=== 自分の鍵を使う ===
111行目: 130行目:
 
新しい鍵を作成したり EFI 変数を変更したりする前に、現在の変数をバックアップしておくことを推奨します。そうすれば、エラーが発生した場合に変数を復元できます。
 
新しい鍵を作成したり EFI 変数を変更したりする前に、現在の変数をバックアップしておくことを推奨します。そうすれば、エラーが発生した場合に変数を復元できます。
   
主要なセキュアブートの変数4つを全てバックアップするには、以下のコマンドを実行してください:
+
主要なセキュアブートの変数4つを全てバックアップするには、{{Pkg|efitools}} パッケージを[[インストール]]し、以下のコマンドを実行してください:
   
 
$ for var in PK KEK db dbx ; do efi-readvar -v $var -o old_${var}.esl ; done
 
$ for var in PK KEK db dbx ; do efi-readvar -v $var -o old_${var}.esl ; done
121行目: 140行目:
 
Platform Key が削除されると、セキュアブートは Setup Mode になります。ファームウェアを Setup Mode にするには、ファームウェア設定ユーティリティに入り、証明書を削除/クリアするオプションを探してください。設定ユーティリティに入る方法は [[#OS の起動前]] で説明されています。
 
Platform Key が削除されると、セキュアブートは Setup Mode になります。ファームウェアを Setup Mode にするには、ファームウェア設定ユーティリティに入り、証明書を削除/クリアするオプションを探してください。設定ユーティリティに入る方法は [[#OS の起動前]] で説明されています。
   
==== sbctl でプロセスをアシスト ====
+
==== sbctl でより簡単に行う ====
   
 
[https://github.com/Foxboron/sbctl sbctl] は、セキュアブートをセットアップしたりファイルを署名したりするユーザーフレンドリーな方法です。
 
[https://github.com/Foxboron/sbctl sbctl] は、セキュアブートをセットアップしたりファイルを署名したりするユーザーフレンドリーな方法です。
168行目: 187行目:
 
署名が必要なファイルは、システムのレイアウト、カーネル、ブートローダーによって異なります。
 
署名が必要なファイルは、システムのレイアウト、カーネル、ブートローダーによって異なります。
   
  +
{{Tip|特に Windows とデュアルブートしている場合は、署名する必要のあるファイルが多い場合があります。[[sed]] を使えば、sbctl によるファイルの署名を全て済ませることができます:
これで完了です!システムを再起動し、ファームウェアの設定でセキュアブートをオンに戻してください。ブートローダーとOSがロードされれば、セキュアブートは機能しているはずです。以下のコマンドで確認してください:
 
  +
  +
# sbctl verify {{!}} sed 's/✗ /sbctl sign -s /e'
  +
  +
この例では、出力されたファイルのパスが {{ic|/boot}} からの相対パスであると仮定しています。
  +
}}
  +
  +
これで完了です! システムを再起動し、ファームウェアの設定でセキュアブートをオンに戻してください。ブートローダーとOSがロードされれば、セキュアブートは機能しているはずです。以下のコマンドで確認してください:
   
 
$ sbctl status
 
$ sbctl status
233行目: 259行目:
 
便利なヘルパースクリプトがこのトピックの参照メージの著者により提供されています[https://www.rodsbooks.com/efi-bootloaders/controlling-sb.html#creatingkeys]([[python]] が必要です)。簡単に編集されたバージョンも {{AUR|sbkeys}} としてパッケージングされています。
 
便利なヘルパースクリプトがこのトピックの参照メージの著者により提供されています[https://www.rodsbooks.com/efi-bootloaders/controlling-sb.html#creatingkeys]([[python]] が必要です)。簡単に編集されたバージョンも {{AUR|sbkeys}} としてパッケージングされています。
   
スクリプトを使うには、安全な場所にフォルダを作成し(例えば、後で {{AUR|sbupdate-git}} を使って unified カーネルイメージを作成し署名する予定なのであれば {{ic|/etc/efi-keys/}})、スクリプトを実行してください:
+
スクリプトを使うには、安全な場所にフォルダを作成し(例えば、後で {{AUR|sbupdate-git}} を使ってユニファイドカーネルイメージを作成し署名する予定なのであれば {{ic|/etc/efi-keys/}})、スクリプトを実行してください:
   
 
# mkdir /etc/efi-keys
 
# mkdir /etc/efi-keys
270行目: 296行目:
 
{{ic|sbkeysync}} がシステムの UEFI に加える変更を確認したい場合は、以下を使用してください:
 
{{ic|sbkeysync}} がシステムの UEFI に加える変更を確認したい場合は、以下を使用してください:
   
# sbkeysync --pk --dry-run --verbose
+
# sbkeysync --keystore /etc/secureboot/keys --pk --dry-run --verbose
   
 
最後に、{{ic|sbkeysync}} を使って鍵を登録してください。
 
最後に、{{ic|sbkeysync}} を使って鍵を登録してください。
   
# sbkeysync --verbose
+
# sbkeysync --keystore /etc/secureboot/keys --verbose
# sbkeysync --verbose --pk
+
# sbkeysync --keystore /etc/secureboot/keys --verbose --pk
   
 
{{Tip|
 
{{Tip|
286行目: 312行目:
 
====== ファームウェアのセットアップユーティリティを使う ======
 
====== ファームウェアのセットアップユーティリティを使う ======
   
[[FAT]] でフォーマットされたファイルシステム([[EFI システムパーティション]] が使えます)に '''{{ic|noPK.auth}} を除いて''' {{ic|*.cer}}、{{ic|*.esl}}、{{ic|*.auth}} をすべてコピーしてください。
+
[[FAT]] でフォーマットされたファイルシステム ([[EFI システムパーティション]] が使えます) に '''{{ic|noPK.auth}} ファイルを除いて''' {{ic|*.cer}}、{{ic|*.esl}}、{{ic|*.auth}} をすべてコピーしてください。
   
{{Warning|'''{{ic|noPK.auth}} を [[EFI システムパーティション]] (ESP) にコピーしないでください!''' そうしてしまうと、例えば誰かがあなたの PC を盗んだ場合に、その人が EFI セキュアブートファームウェア内のあなたの Platform Key を削除し、"Setup Mode" を有効化して、セキュアブート鍵(PK, KEK, db, dbx)をその人のものに置き換えることができてしまいます。これでは UEFI セキュアブートの意味がありません。あなただけが Platform Key を置き換えられるようにするべきです。なので、あなたの以外の人が {{ic|noPK.auth}} ファイルにアクセスできないようにするべきなのです。以上の理由から、{{ic|noPK.auth}} ファイルは、あなただけがアクセスできる安全な場所に保管してください。{{ic|noPK.auth}} ファイルの保管場所として安全なのは:
+
{{Warning|'''{{ic|noPK.auth}} を [[EFI システムパーティション]] (ESP) にコピーしないでください!''' そうしてしまうと、例えば誰かがあなたの PC を盗んだ場合に、その人が EFI セキュアブートファームウェア内のあなたの Platform Key を削除し、"Setup Mode" を有効化して、セキュアブート鍵(PK, KEK, db, dbx)をその人のものに置き換えることができてしまいます。これでは UEFI セキュアブートの意味がありません。あなただけが Platform Key を置き換えられるようにするべきです。なので、あなたの以外の人が {{ic|noPK.auth}} ファイルにアクセスできないようにするべきなのです。以上の理由から、{{ic|noPK.auth}} ファイルは、あなただけがアクセスできる秘密の安全な場所に保管してください。{{ic|noPK.auth}} ファイルの保管場所として安全なのは:
   
 
* {{ic|KeyTool}} を使用している場合は、'''[[EFI システムパーティション]]のある外部 USB スティック'''。残念ながら、{{ic|KeyTool}} は、暗号化されていないストレージからしかファイルを読み出すことができません。
 
* {{ic|KeyTool}} を使用している場合は、'''[[EFI システムパーティション]]のある外部 USB スティック'''。残念ながら、{{ic|KeyTool}} は、暗号化されていないストレージからしかファイルを読み出すことができません。
311行目: 337行目:
 
===== EFI バイナリに署名する =====
 
===== EFI バイナリに署名する =====
   
''セキュアブート''を有効化(つまり "User Mode" に)すると、署名した EFI バイナリ(例: アプリケーション、[[Unified Extensible Firmware Interface#UEFI ドライバ|ドライバ]]、[[Unified カーネルイメージ]])しか起動できなくなります。
+
''セキュアブート''を有効化(つまり "User Mode" に)すると、署名した EFI バイナリ(例: アプリケーション、[[Unified Extensible Firmware Interface#UEFI ドライバ|ドライバ]]、[[ユニファイドカーネルイメージ]])しか起動できなくなります。
   
====== sbsigntools を使って手動で行う ======
+
====== sbsigntools を使う ======
   
 
{{Pkg|sbsigntools}} を[[インストール]]して、{{man|1|sbsign}} で EFI バイナリに署名してください。
 
{{Pkg|sbsigntools}} を[[インストール]]して、{{man|1|sbsign}} で EFI バイナリに署名してください。
329行目: 355行目:
 
# sbsign --key db.key --cert db.crt --output ''esp''/EFI/BOOT/BOOTx64.EFI ''esp''/EFI/BOOT/BOOTx64.EFI
 
# sbsign --key db.key --cert db.crt --output ''esp''/EFI/BOOT/BOOTx64.EFI ''esp''/EFI/BOOT/BOOTx64.EFI
   
{{Warning|カーネル以外を署名しなかったら initramfs を改ざんから守ることはできません。''sbsign'' で手動で署名できる結合イメージを生成する方法は [[Unified カーネルイメージ]] を見てください。}}
+
{{Warning|カーネル以外を署名しなかったら initramfs を改ざんから守ることはできません。''sbsign'' で手動で署名できる結合イメージを生成する方法は[[ユニファイドカーネルイメージ]] を見てください。}}
   
====== pacman フックでカーネルに署名する ======
+
====== mkinitcpio のポストフックでカーネルに署名する ======
   
mkinitcpio の [[pacman フック]]を使って、インストール時とアップデート時にカーネルに署名することもできます。
+
[[mkinitcpio]]ポストフックを使って、initramfs の生成時にカーネルイメージに署名することもできます。
   
  +
以下のファイルを[[作成]]し、[[実行可能属性]]を付与してください:
{{ic|/usr/share/libalpm/hooks/90-mkinitcpio-install.hook}} を {{ic|/etc/pacman.d/hooks/90-mkinitcpio-install.hook}} に、{{ic|/usr/share/libalpm/scripts/mkinitcpio-install}} を {{ic|/usr/local/share/libalpm/scripts/mkinitcpio-install}} にコピーしてください。
 
   
  +
{{hc|/etc/initcpio/post/kernel-sbsign|2=
{{ic|/etc/pacman.d/hooks/90-mkinitcpio-install.hook}} 内の
 
  +
#!/usr/bin/env bash
   
  +
kernel="$1"
Exec = /usr/share/libalpm/scripts/mkinitcpio-install
 
  +
<nowiki>[[ -n "$kernel" ]] || exit 0
   
  +
# use already installed kernel if it exists
 
  +
[[ ! -f "$KERNELDESTINATION" ]] || kernel="$KERNELDESTINATION"</nowiki>
   
  +
keypairs=(''/path/to/''db.key ''/path/to/''db.crt)
Exec = /usr/local/share/libalpm/scripts/mkinitcpio-install
 
   
  +
for (( i=0; i<${#keypairs[@]}; i+=2 )); do
に置き換えてください。
 
  +
key="${keypairs[$i]}" cert="${keypairs[(( i + 1 ))]}"
 
  +
if ! sbverify --cert "$cert" "$kernel" &>/dev/null; then
{{ic|/usr/local/share/libalpm/scripts/mkinitcpio-install}} 内の
 
  +
sbsign --key "$key" --cert "$cert" --output "$kernel" "$kernel"
  +
fi
  +
done
  +
}}
   
  +
{{ic|''/path/to/''db.key}} と {{ic|''/path/to/''db.crt}} の部分は、カーネルの署名に使用するキーペアへのパスに置き換えてください。
install -Dm644 "${line}" "/boot/vmlinuz-${pkgbase}"
 
   
  +
systemd-boot を使用する場合、この手順を半自動的に行う[[systemd-boot#自動で更新|専用の pacman フック]]が存在します。
 
   
  +
====== mkinitcpio のポストフックで ユニファイドカーネルイメージに署名する ======
sbsign --key ''/path/to/''db.key --cert ''/path/to/''db.crt --output "/boot/vmlinuz-${pkgbase}" "${line}"
 
   
  +
[[ユニファイドカーネルイメージ#セキュアブート用の UKI への署名]] 章を参照してください。
に置き換えてください。
 
   
  +
===== sbupdate による完全に自動化されたユニファイドカーネルの生成と署名 =====
systemd-boot を使用している場合、この作業を半自動的に行う[[systemd-boot#自動で更新|専用の pacman フック]]が存在します。
 
   
  +
{{Note|''sbupdate'' が作成されたのは、[[mkinitcpio]] やその他の [[initramfs]] ジェネレータに[[ユニファイドカーネルイメージ]]の生成機能が追加されて以前は面倒であった作業が非常に簡単になる前です。今日では、[[#sbctl でより簡単に行う]] にあるように sbctl を使用することを検討してください。}}
===== sbupdate による完全に自動化された unified カーネルの生成と署名 =====
 
   
[https://github.com/andreyv/sbupdate sbupdate] は、Arch Linux で unified カーネルイメージの生成と署名を自動化するために特別に作られたツールです。このツールは、[[pacman フック]]を通してカーネルのインストール・削除・アップデートを処理します。
+
[https://github.com/andreyv/sbupdate sbupdate] は、Arch Linux でユニファイドカーネルイメージの生成と署名を自動化するために特別に作られたツールです。このツールは、[[pacman フック]]を通してカーネルのインストール・削除・アップデートを処理します。
   
 
{{AUR|sbupdate-git}} をインストールして、プロジェクトのホームページにある手順に従って設定してください。[https://github.com/andreyv/sbupdate#sbupdate]
 
{{AUR|sbupdate-git}} をインストールして、プロジェクトのホームページにある手順に従って設定してください。[https://github.com/andreyv/sbupdate#sbupdate]
397行目: 430行目:
 
"Microsoft Windows Production PCA 2011" 鍵を UEFI セキュアブート変数に登録しない場合、[[#鍵を作成する|カスタム、個人の鍵]]で Windows のブートローダー ({{ic|EFI/Microsoft/Boot/bootmgfw.efi}}) を署名しても、Windows を起動することは通常'''不可能'''です:
 
"Microsoft Windows Production PCA 2011" 鍵を UEFI セキュアブート変数に登録しない場合、[[#鍵を作成する|カスタム、個人の鍵]]で Windows のブートローダー ({{ic|EFI/Microsoft/Boot/bootmgfw.efi}}) を署名しても、Windows を起動することは通常'''不可能'''です:
   
* {{ic|bootmgfw.efi}} に "Microsoft Windows Production PCA 2011" とあなたの独自のセキュアブート DB 鍵の'''両方'''の署名 (つまり、'''2つの署名''') が含まれている場合、''INSYDE Corp. 4096.01 (UEFI Version 2.31, Version F.70, Release Date: 07/18/2016, BIOS Revision 15.112, Firmware Revision: 29.66)'' のような UEFI ファームウェア実装は、{{ic|bootmgfw.efi}} を起動せず、セキュリティ違反エラー ('''{{ic|Selected boot image did not authenticate. Press ENTER to continue.}}''') を発生させます: このような UEFI ファームウェア実装は、おそらく'''1番目'''の署名だけは読み込むことができるでしょうが、'''2番目'''の署名は無理でしょう。2番目の署名の証明書だけが UEFI セキュアブート変数に登録されているので、セキュアブートの検証が失敗するのです。
+
* {{ic|bootmgfw.efi}} に "Microsoft Windows Production PCA 2011" とあなたの独自のセキュアブート db 鍵の'''両方'''の署名 (つまり、'''2つの署名''') が含まれている場合、''INSYDE Corp. 4096.01 (UEFI Version 2.31, Version F.70, Release Date: 07/18/2016, BIOS Revision 15.112, Firmware Revision: 29.66)'' のような UEFI ファームウェア実装は、{{ic|bootmgfw.efi}} を起動せず、セキュリティ違反エラー ('''{{ic|Selected boot image did not authenticate. Press ENTER to continue.}}''') を発生させます: このような UEFI ファームウェア実装は、おそらく'''1番目'''の署名だけは読み込むことができるでしょうが、'''2番目'''の署名は無理でしょう。2番目の署名の証明書だけが UEFI セキュアブート変数に登録されているので、セキュアブートの検証が失敗するのです。
* {{ic|bootmgfw.efi}} ファイルの "Microsoft Windows Production PCA 2011" 証明書が strip/削除されていて、さらにあなたの独自のセキュアブート DB 鍵の署名だけがそのファイルに追加されている場合、UEFI はそのファイルを起動するでしょう。しかし、Windows はリカバリ/回復環境を起動してしまいます: Windows は Windows 環境が破損していると報告するでしょう ({{ic|bootmgfw.efi}} ファイルの "Microsoft Windows Production PCA 2011" 署名が存在しないからです)。
+
* {{ic|bootmgfw.efi}} ファイルの "Microsoft Windows Production PCA 2011" 証明書が strip/削除されていて、さらにあなたの独自のセキュアブート db 鍵の署名だけがそのファイルに追加されている場合、UEFI はそのファイルを起動するでしょう。しかし、Windows はリカバリ/回復環境を起動してしまいます: Windows は Windows 環境が破損していると報告するでしょう ({{ic|bootmgfw.efi}} ファイルの "Microsoft Windows Production PCA 2011" 署名が存在しないからです)。
   
 
なので、[[Windows と Arch のデュアルブート|Windows とデュアルブート]]するには
 
なので、[[Windows と Arch のデュアルブート|Windows とデュアルブート]]するには
   
* 選択肢1: {{ic|bootmgfw.efi}} のハッシュを {{ic|DB}} 変数の許可ハッシュリストに追加する必要があります。そして、Windows アップデートが {{ic|bootmgfw.efi}} を変更するたびに毎回 {{ic|DB}} 変数をアップデートする必要があります。これはかなり面倒くさいうえ、エラーが発生しやすく、Microsoft によってサポートされている方法ではありません。さらに、このようなセットアップでは Bitlocker は正しく動作しないでしょう (Windows パーティションを復号化するために毎回 Bitlocker が回復パスワードを尋ねてきます)。
+
* 選択肢1: {{ic|bootmgfw.efi}} のハッシュを {{ic|db}} 変数の許可ハッシュリストに追加する必要があります。そして、Windows アップデートが {{ic|bootmgfw.efi}} を変更するたびに毎回 {{ic|db}} 変数をアップデートする必要があります。これはかなり面倒くさいうえ、エラーが発生しやすく、Microsoft によってサポートされている方法ではありません。さらに、このようなセットアップでは Bitlocker は正しく動作しないでしょう (Windows パーティションを復号化するために毎回 Bitlocker が回復パスワードを尋ねてきます)。
* 選択肢2: Micosoft の証明書を UEFI セキュアブート変数に追加する必要があります。[https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-secure-boot-key-creation-and-management-guidance#14-signature-databases-db-and-dbx Microsoft は2つの {{ic|DB}} 証明書と1つの {{ic|KEK}} 証明書を持っています] ([https://learn.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/windows-secure-boot-key-creation-and-management-guidance?view=windows-11#14-signature-databases-db-and-dbx 日本語訳ページ]):
+
* 選択肢2: Micosoft の証明書を UEFI セキュアブート変数に追加する必要があります。[https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-secure-boot-key-creation-and-management-guidance#14-signature-databases-db-and-dbx Microsoft は4つの db 証明書と2つの KEK 証明書を持っています] ([https://learn.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/windows-secure-boot-key-creation-and-management-guidance?view=windows-11#14-signature-databases-db-and-dbx 日本語訳ページ]):
** [https://www.microsoft.com/pkiops/certs/MicWinProPCA2011_2011-10-19.crt Microsoft Windows Production PCA 2011 証明書] は、Windows OS をロードできるようにするために、{{ic|DB}} 変数に含めなければなりません。
 
** [https://www.microsoft.com/pkiops/certs/MicCorUEFCA2011_2011-06-27.crt Microsoft Corporation UEFI CA 2011 証明書] (またの名を Microsoft 3rd Party UEFI CA 証明書) は、UEFI ドライバやオプションの ROM、{{Pkg|shim}} などのサードパーティのバイナリを使用するために、{{ic|DB}} 変数に含めるべきです。
 
** [https://www.microsoft.com/pkiops/certs/MicCorKEKCA2011_2011-06-24.crt Microsoft Corporation KEK CA 2011 証明書]は、「{{ic|DBX}} を更新して問題のあるイメージの失効を有効に」し「署名された新しい Windows イメージの準備をするために {{ic|DB}} を更新する」ために、{{ic|KEK}} 変数に含めるべきです。しかし、"Microsoft Corporation KEK CA 2011" 証明書がなくとも、Windows は起動するでしょう。
 
   
  +
** The [https://www.microsoft.com/pkiops/certs/MicWinProPCA2011_2011-10-19.crt Microsoft Windows Production PCA 2011 証明書]と[https://www.microsoft.com/pkiops/certs/windows%20uefi%20ca%202023.crt Windows UEFI CA 2023] は、Windows OS をロードできるようにするために、{{ic|db}} 変数に含めなければなりません。
Microsoft の GUID ({{ic|77fa9abd-0359-4d32-bd60-28f4e78f784b}}) を使用して Microsoft の DER 形式 {{ic|DB}} 証明書の EFI Signature Lists を作成し、それらのリストを1つのファイルにまとめてください:
 
  +
** The [https://www.microsoft.com/pkiops/certs/MicCorUEFCA2011_2011-06-27.crt Microsoft Corporation UEFI CA 2011 証明書]と[https://www.microsoft.com/pkiops/certs/microsoft%20uefi%20ca%202023.crt Microsoft UEFI CA 2023] (別名、Microsoft 3rd Party UEFI CA 証明書) は、UEFI ドライバやオプションの ROM、{{Pkg|shim}} などのサードパーティのバイナリを使用するために、{{ic|DB}} 変数に含める必要があります。
  +
** [https://www.microsoft.com/pkiops/certs/MicCorKEKCA2011_2011-06-24.crt Microsoft Corporation KEK CA 2011 証明書]と[https://www.microsoft.com/pkiops/certs/microsoft%20corporation%20kek%202k%20ca%202023.crt Microsoft Corporation KEK 2K CA 2023] は、「{{ic|dbx}} の更新による不良イメージの失効の有効化と、新しい署名済み Windows イメージの準備のために {{ic|db}} を更新するために」、{{ic|KEK}} 変数に含める必要があります。しかし、Windows はこれらの証明書無しでも起動します。
   
  +
Microsoft の GUID ({{ic|77fa9abd-0359-4d32-bd60-28f4e78f784b}}) を使用して Microsoft の DER 形式 {{ic|db}} 証明書の EFI Signature Lists を作成し、それらのリストを1つのファイルにまとめてください:
$ 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
 
  +
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_db_2011.esl MicWinProPCA2011_2011-10-19.crt
$ cat MS_Win_db.esl MS_UEFI_db.esl > MS_db.esl
 
  +
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_db_2023.esl 'windows uefi ca 2023.crt'
  +
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_UEFI_db_2011.esl MicCorUEFCA2011_2011-06-27.crt
  +
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_UEFI_db_2023.esl 'microsoft uefi ca 2023.crt'
  +
$ cat MS_Win_db_2011.esl MS_Win_db_2023.esl MS_UEFI_db_2011.esl MS_UEFI_db_2023.esl > MS_db.esl
   
 
任意 (Microsoft の UEFI セキュアブート要件を厳密に満たすために): Microsoft の GUID ({{ic|77fa9abd-0359-4d32-bd60-28f4e78f784b}}) を使って Microsoft の DER 形式 {{ic|KEK}} 証明書の EFI Signature List を作成してください:
 
任意 (Microsoft の UEFI セキュアブート要件を厳密に満たすために): Microsoft の GUID ({{ic|77fa9abd-0359-4d32-bd60-28f4e78f784b}}) を使って Microsoft の DER 形式 {{ic|KEK}} 証明書の EFI Signature List を作成してください:
   
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_KEK.esl MicCorKEKCA2011_2011-06-24.crt
+
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_KEK_2011.esl MicCorKEKCA2011_2011-06-24.crt
  +
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_KEK_2023.esl 'microsoft corporation kek 2k ca 2023.crt'
  +
$ cat MS_Win_KEK_2011.esl MS_Win_KEK_2023.esl > MS_Win_KEK.esl
   
{{ic|DB}} 変数のアップデートを {{ic|KEK}} を使って署名してください。{{ic|sign-efi-sig-list}} を {{ic|-a}} オプションで使用してください ({{ic|-a}} オプションは {{ic|DB}} 証明書を置き換えるのではなく '''追加''' します):
+
{{ic|db}} 変数のアップデートを {{ic|KEK}} を使って署名してください。{{ic|sign-efi-sig-list}} を {{ic|-a}} オプションで使用してください ({{ic|-a}} オプションは {{ic|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
 
$ 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
432行目: 470行目:
 
署名済みのブートローダーを使うというのは Microsoft の鍵で署名されたブートローダーを使うということです。署名済みのブートローダーとしては PreLoader と shim が存在します。どちらも他の EFI バイナリ (通常の[[ブートローダー]]) をチェインロードします。Microsoft は未署名のあらゆるバイナリを自動起動するブートローダーに署名しないことになっているため、PreLoader と shim は Machine Owner Key リストと呼ばれるホワイトリストを使っています。バイナリの SHA256 ハッシュあるいはバイナリの署名鍵が MokList に存在する場合、バイナリが起動されますが、存在しない場合はハッシュや鍵を登録するための鍵管理ユーティリティが起動します。
 
署名済みのブートローダーを使うというのは Microsoft の鍵で署名されたブートローダーを使うということです。署名済みのブートローダーとしては PreLoader と shim が存在します。どちらも他の EFI バイナリ (通常の[[ブートローダー]]) をチェインロードします。Microsoft は未署名のあらゆるバイナリを自動起動するブートローダーに署名しないことになっているため、PreLoader と shim は Machine Owner Key リストと呼ばれるホワイトリストを使っています。バイナリの SHA256 ハッシュあるいはバイナリの署名鍵が MokList に存在する場合、バイナリが起動されますが、存在しない場合はハッシュや鍵を登録するための鍵管理ユーティリティが起動します。
   
{{Warning|Microsoft が "Secured-core PC" と呼ぶものには Microsoft 3rd Party UEFI CA 証明書 (Microsoft Corporation UEFI CA 2011) が登録されていません。[https://docs.microsoft.com/en-us/windows/security/information-protection/secure-the-windows-10-boot-process#secure-boot] ([https://learn.microsoft.com/ja-jp/windows/security/information-protection/secure-the-windows-10-boot-process#%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2-%E3%83%96%E3%83%BC%E3%83%88 日本語訳ページ])。唯一登録されている DB 証明書は Microsoft Windows Production PCA 2011 証明書で、これは Windows ブートローダーを署名するためだけに使用されます。
+
{{Warning|Microsoft が "Secured-core PC" と呼ぶものには Microsoft 3rd Party UEFI CA 証明書 (Microsoft Corporation UEFI CA 2011 または Microsoft UEFI CA 2023) が登録されていません。[https://docs.microsoft.com/en-us/windows/security/information-protection/secure-the-windows-10-boot-process#secure-boot] ([https://learn.microsoft.com/ja-jp/windows/security/information-protection/secure-the-windows-10-boot-process#%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2-%E3%83%96%E3%83%BC%E3%83%88 日本語訳ページ])。唯一登録されている DB 証明書は Microsoft Windows Production PCA 2011 証明書で、これは Windows ブートローダーを署名するためだけに使用されます。
   
 
Microsoft 3rd Party UEFI CA 証明書で署名された EFI バイナリや OpROM を起動するには、Microsoft 3rd Party UEFI CA 証明書の登録をファームウェアの設定で有効化する必要があります。
 
Microsoft 3rd Party UEFI CA 証明書で署名された EFI バイナリや OpROM を起動するには、Microsoft 3rd Party UEFI CA 証明書の登録をファームウェアの設定で有効化する必要があります。
543行目: 581行目:
 
''shim'' と ''MokManager'' を ESP 上のブートローダーのディレクトリにコピーしてください; {{ic|shimx64.efi}} はブートローダの以前のファイル名を使ってください:
 
''shim'' と ''MokManager'' を ESP 上のブートローダーのディレクトリにコピーしてください; {{ic|shimx64.efi}} はブートローダの以前のファイル名を使ってください:
   
  +
{{Note|有効な {{ic|bootx64.csv}} が存在しない限り、{{ic|fbx64.efi}} (同じディレクトリ内にあります) はコピー'''しない'''でください。さもないと、shim は {{ic|grubx64.efi}} を'''実行せず'''、動作に失敗してマシンをリセットします。}}
{{Note|
 
* 有効な bootx64.csv が存在しない限り、fbx64.efi (同じディレクトリ内にあります)はコピー'''しない'''でください。さもないと、shim は grubx64.efi を実行せず、動作に失敗してマシンをリセットします。
 
}}
 
   
 
# cp /usr/share/shim-signed/shimx64.efi ''esp''/EFI/BOOT/BOOTx64.EFI
 
# cp /usr/share/shim-signed/shimx64.efi ''esp''/EFI/BOOT/BOOTx64.EFI
579行目: 615行目:
 
Machine Owner Key を作成:
 
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 req -newkey rsa:2048 -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
 
$ openssl x509 -outform DER -in MOK.crt -out MOK.cer
  +
  +
{{Note|shim は 4096 RSA キーを MokList に追加できないようです ({{ic|grubx64.efi}} バイナリをロードして検証する際にフリーズするかもしれません)。なので、今の時点では 2048 キーを使用してください。[[Debian:SecureBoot#Generating a new key]] を参照してください。}}
   
 
({{ic|grubx64.efi}} という名前の) ブートローダーとカーネルに署名:
 
({{ic|grubx64.efi}} という名前の) ブートローダーとカーネルに署名:
587行目: 625行目:
 
# sbsign --key MOK.key --cert MOK.crt --output ''esp''/EFI/BOOT/grubx64.efi ''esp''/EFI/BOOT/grubx64.efi
 
# sbsign --key MOK.key --cert MOK.crt --output ''esp''/EFI/BOOT/grubx64.efi ''esp''/EFI/BOOT/grubx64.efi
   
ブートローダーとカーネルをアップデートするたびに上記の署名が必要です。カーネルの署名は [[pacman フック]] で自動化できます。例えば:
+
ブートローダーとカーネルをアップデートするたびに上記の署名が必要です。カーネルの署名は [[mkinitpcio]] のポストフックで自動化できます。以下のファイルを[[作成]]し、[[実行可能属性|実行可能]]にしてください:
  +
  +
{{hc|/etc/initcpio/post/kernel-sbsign|2=
  +
#!/usr/bin/env bash
  +
  +
kernel="$1"
  +
<nowiki>[[ -n "$kernel" ]] || exit 0
  +
  +
# use already installed kernel if it exists
  +
[[ ! -f "$KERNELDESTINATION" ]] || kernel="$KERNELDESTINATION"</nowiki>
   
  +
keypairs=(''/path/to/''MOK.key ''/path/to/''MOK.crt)
{{hc|/etc/pacman.d/hooks/999-sign_kernel_for_secureboot.hook|2=
 
[Trigger]
 
Operation = Install
 
Operation = Upgrade
 
Type = Package
 
Target = linux
 
Target = linux-lts
 
Target = linux-hardened
 
Target = linux-zen
 
   
  +
for (( i=0; i<${#keypairs[@]}; i+=2 )); do
[Action]
 
  +
key="${keypairs[$i]}" cert="${keypairs[(( i + 1 ))]}"
Description = Signing kernel with Machine Owner Key for Secure Boot
 
  +
if ! sbverify --cert "$cert" "$kernel" &>/dev/null; then
When = PostTransaction
 
  +
sbsign --key "$key" --cert "$cert" --output "$kernel" "$kernel"
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' ;
 
  +
fi
Depends = sbsigntools
 
  +
done
Depends = findutils
 
Depends = grep
 
 
}}
 
}}
   
616行目: 654行目:
 
====== shim で鍵と GRUB を使う ======
 
====== shim で鍵と GRUB を使う ======
   
  +
手順は [[GRUB#Shim-lock]] を見てください。
GRUB は、'''必要なモジュールがすべて GRUB の EFI バイナリに含められている''' 場合に '''限り'''、セキュアブートモードで起動することができます。
 
   
  +
===== 登録されたハッシュ/鍵を削除する =====
GRUB バージョン {{ic|2.06.r261.g2f4430cc0}} 以降、'''{{ic|insmod}}''' を用いたセキュアブートモードのサイドロードは '''もはや許可されません'''。GRUB のモジュールが GRUB の EFI バイナリに組み込まれていない場合、GRUB はそれらのモージュルをサイドロード (すなわち {{ic|insmod}}) しようと試みます。しかし、GRUB は次のメッセージで起動に失敗するでしょう:
 
   
  +
MOK データベースに登録されたハッシュ/鍵のエントリは、NVRAM の領域を少しずつ圧迫していきます。領域を節約し、古いプログラムがブートされないようにするために、使っていないハッシュ/鍵は削除すると良いかもしれません。
error: prohibited by secure boot policy
 
   
  +
MOK データベースは {{Pkg|mokutil}} で管理できます。
GRUB の EFI バイナリは、必須のモジュールと共にリビルドし、署名する必要があります。
 
GRUB は、Linux カーネルと initramfs のあるディスクまたはパーティションを読み込み/復号/アクセスするのに必要なモジュールすべてが GRUB の EFI バイナリに含まれている場合に限り、Linux カーネルと initramfs をブートすることができます。
 
   
  +
登録された鍵とハッシュを一覧表示する:
Ubuntuは、[https://git.launchpad.net/~ubuntu-core-dev/grub/+git/ubuntu/tree/debian/build-efi-images?h=ubuntu#n87 公式のビルドスクリプト]によると、以下の GRUB モジュールを GRUB EFI バイナリ {{ic|grubx64.efi}} に組み込んでいます:
 
   
  +
# mokutil --list-enrolled
* (CD やシンプルにパーティショニングされたディスクから起動するために必要な) 「基本的な」モジュールについては、[https://git.launchpad.net/~ubuntu-core-dev/grub/+git/ubuntu/tree/debian/build-efi-images?h=ubuntu#n87 ビルドスクリプトの 87 行目]を見てください:
 
   
  +
データベースからハッシュを削除する。ここで入力するパスワードは、MOK マネージャで削除の確認を行う際に再び尋ねられます。
{{bc|1=
 
CD_MODULES="
 
all_video
 
boot
 
btrfs
 
cat
 
chain
 
configfile
 
echo
 
efifwsetup
 
efinet
 
ext2
 
fat
 
font
 
gettext
 
gfxmenu
 
gfxterm
 
gfxterm_background
 
gzio
 
halt
 
help
 
hfsplus
 
iso9660
 
jpeg
 
keystatus
 
loadenv
 
loopback
 
linux
 
ls
 
lsefi
 
lsefimmap
 
lsefisystab
 
lssal
 
memdisk
 
minicmd
 
normal
 
ntfs
 
part_apple
 
part_msdos
 
part_gpt
 
password_pbkdf2
 
png
 
probe
 
reboot
 
regexp
 
search
 
search_fs_uuid
 
search_fs_file
 
search_label
 
sleep
 
smbios
 
squash4
 
test
 
true
 
video
 
xfs
 
zfs
 
zfscrypt
 
zfsinfo
 
"
 
}}
 
   
  +
# mokutil --delete-hash <削除するハッシュ>
* x86_64-efi アーキテクチャ向けの「プラットフォーム固有」のモジュールは、[https://git.launchpad.net/~ubuntu-core-dev/grub/+git/ubuntu/tree/debian/build-efi-images?h=ubuntu#n147 ビルドスクリプトの 147 行目]を見てください。そのようなモジュールは、例えば、以下のような用途に必要です:
 
  +
Input password:
** 起動中に音を鳴らす: {{ic|play}}
 
** 起動中に CPU を特定する: {{ic|cpuid}}
 
** UEFI ブート: {{ic|linuxefi}}
 
** Measured Boot / [[TPM|Trusted Platform Module]]: {{ic|tpm}}
 
   
  +
データベースから鍵を削除する:
{{bc|1=
 
CD_MODULES="$CD_MODULES
 
cpuid
 
linuxefi
 
play
 
tpm
 
"
 
}}
 
   
  +
# mokutil --delete MOK.cer
* 「高度」なモジュールについては、[https://git.launchpad.net/~ubuntu-core-dev/grub/+git/ubuntu/tree/debian/build-efi-images?h=ubuntu#n159 ビルドスクリプトの 159 行目] を見てください。以下のモジュールから成ります:
 
** [[dm-crypt|plain モードで暗号化]]されたディスクから起動する: {{ic|cryptodisk}}
 
** すべてのハッシュ、暗号化アルゴリズム: {{ic|gcry_...}}
 
** [[LUKS]] で暗号化されたディスクから起動する: {{ic|luks}}
 
** [[LVM]] 論理ボリュームディスクから起動する: {{ic|lvm}}
 
** [[RAID]] 仮想ディスクから起動する: {{ic|mdraid09}}, {{ic|mdraid1x}}, {{ic|raid5rec}}, {{ic|raid6rec}}
 
   
  +
次回のブート時に削除されるハッシュ/鍵を一覧表示する:
{{bc|1=
 
GRUB_MODULES="$CD_MODULES
 
cryptodisk
 
gcry_arcfour
 
gcry_blowfish
 
gcry_camellia
 
gcry_cast5
 
gcry_crc
 
gcry_des
 
gcry_dsa
 
gcry_idea
 
gcry_md4
 
gcry_md5
 
gcry_rfc2268
 
gcry_rijndael
 
gcry_rmd160
 
gcry_rsa
 
gcry_seed
 
gcry_serpent
 
gcry_sha1
 
gcry_sha256
 
gcry_sha512
 
gcry_tiger
 
gcry_twofish
 
gcry_whirlpool
 
luks
 
lvm
 
mdraid09
 
mdraid1x
 
raid5rec
 
raid6rec
 
"
 
}}
 
   
  +
# mokutil --list-delete
あなたの Arch Linux セットアップで必要な GRUB モジュールをすべて見つけてください。
 
安全のために、上記のモジュールをすべて含めることもできます。
 
GRUB のブートプロセスを高速化したい場合や、ESP パーティションのスペースを節約したい場合は、必要ないモジュールを排除してください。
 
GRUB_MODULES のリストを変数として指定しコンパイルしたら、以下を続けてください:
 
   
  +
次回のブート時に、登録/削除するハッシュ/鍵のオプション付きで MOK マネージャが初期化されます。詳細は {{man|1|mokutil}} を参照してください。
[https://github.com/rhboot/shim/blob/main/SBAT.md Secure Boot Advanced Targeting (SBAT)] ファイル/セクションも GRUB の EFI バイナリに含める必要があります。これは、GRUB が UEFI shim ローダーから起動される場合にセキュリティを向上するのに役立ちます。
 
 
この SBAT ファイル/セクションには、GRUB バイナリに関するメタデータ (バージョン、メンテナ、開発者、上流の URL) が含まれており、脆弱性のある特定の GRUB バージョンのロードを shim がブロックするのを容易にします [https://eclypsium.com/2020/07/29/theres-a-hole-in-the-boot/#additional][https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/GRUB2SecureBootBypass2021]。これは、shim の [https://github.com/rhboot/shim/blob/main/SBAT.md UEFI shim bootloader secure boot life-cycle improvements] ドキュメントで説明されています。
 
 
第一段階の UEFI ブートローダーである shim は、SBAT セクションが {{ic|grubx64.efi}} に存在しない場合、{{ic|grubx64.efi}} の起動に失敗します。
 
 
GRUB がインストールされている場合、シンプルな SBAT ''.csv'' ファイルが {{ic|/usr/share/grub/sbat.csv}} に提供されています。
 
 
提供されている {{ic|/usr/share/grub/sbat.csv}} ファイルと 必要な {{ic|GRUB_MODULES}} を用いて GRUB を再インストールし、それを署名してください:
 
 
# grub-install --target=x86_64-efi --efi-directory=''esp'' --modules=${GRUB_MODULES} --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 を除去する =====
780行目: 693行目:
 
== ヒントとテクニック ==
 
== ヒントとテクニック ==
   
=== 公式の ISO をカスタム鍵で署名する ===
+
=== ISO の再パック ===
   
ブートローダー ({{ic|BOOTx64.EFI}} と {{ic|BOOTIA32.EFI}})、カーネル、UEFI シェル ISO から抽出しそれらを署名し、署名済みファイルを ISO に再パックすで、カスタムの鍵で公式 ISO にセキュアブートサポートを追加できます。
+
{{Pkg|libisoburn}} と {{Pkg|mtools}} を使うことで公式のンストーイメージ展開したり、再パックしたりできまの方法で、カスタムの鍵か署名済みブートローダを使ってセキュアブートサポートするイメージ作成することができます。
   
  +
==== 公式の ISO をカスタムの鍵で署名する ====
{{Pkg|libisoburn}}、{{Pkg|mtools}}、{{Pkg|sbsigntools}} を[[インストール]]してください。
 
  +
  +
ブートローダー ({{ic|BOOTx64.EFI}} と {{ic|BOOTIA32.EFI}})、カーネル、UEFI シェルを ISO から抽出し、それらを署名し、署名済みファイルを ISO に再パックすることで、カスタムの鍵で公式の ISO にセキュアブートサポートを追加できます。
   
 
まず、関連するファイルと El Torito ブートイメージを抽出してください:
 
まず、関連するファイルと El Torito ブートイメージを抽出してください:
802行目: 717行目:
 
$ chmod +w BOOTx64.EFI BOOTIA32.EFI shellx64.efi shellia32.efi vmlinuz-linux
 
$ chmod +w BOOTx64.EFI BOOTIA32.EFI shellx64.efi shellia32.efi vmlinuz-linux
   
登録されている db 鍵と証明書を使ってファイルを署名してください:
+
ファイルを署名してください。{{Pkg|sbsigntools}} を使って署名する場合、以下のようにできます:
   
 
$ sbsign --key db.key --cert db.crt --output BOOTx64.EFI BOOTx64.EFI
 
$ sbsign --key db.key --cert db.crt --output BOOTx64.EFI BOOTx64.EFI
820行目: 735行目:
 
$ xorriso -indev archlinux-''YYYY.MM.DD''-x86_64.iso \
 
$ xorriso -indev archlinux-''YYYY.MM.DD''-x86_64.iso \
 
-outdev archlinux-''YYYY.MM.DD''-x86_64-Secure_Boot.iso \
 
-outdev archlinux-''YYYY.MM.DD''-x86_64-Secure_Boot.iso \
  +
-map vmlinuz-linux /arch/boot/x86_64/vmlinuz-linux \
  +
-map_l ./ /EFI/BOOT/ BOOTx64.EFI BOOTIA32.EFI -- \
  +
-map_l ./ / shellx64.efi shellia32.efi -- \
 
-boot_image any replay \
 
-boot_image any replay \
-append_partition 2 0xef eltorito_img2_uefi.img \
+
-append_partition 2 0xef eltorito_img2_uefi.img
-map BOOTx64.EFI /EFI/BOOT/BOOTx64.EFI \
 
-map BOOTIA32.EFI /EFI/BOOT/BOOTIA32.EFI \
 
-map shellx64.efi /shellx64.efi \
 
-map shellia32.efi /shellia32.efi \
 
-map vmlinuz-linux /arch/boot/x86_64/vmlinuz-linux
 
 
}}
 
}}
   
 
完成した {{ic|archlinux-''YYYY.MM.DD''-x86_64-Secure_Boot.iso}} を起動してみてください。
 
完成した {{ic|archlinux-''YYYY.MM.DD''-x86_64-Secure_Boot.iso}} を起動してみてください。
  +
  +
==== ブートローダを PreLoader に置き換える ====
  +
  +
公式の ISO イメージにセキュアブートのサポートを追加するもう一つの方法は、ブートローダを抽出し、それを [[#PreLoader]] で置き換えることです。
  +
  +
{{Note|ISO の GRUB EFI バイナリ ({{ic|EFI/BOOT/BOOTx64.EFI}}) は {{ic|--disable-shim-lock}} でビルドされているため、shim で使用することはできません。これは GRUB の制限であり、GRUB に shim かカスタムの署名のどちらか一方との互換性を持たせることはできますが、同時に両方との互換性を持たせることはできません。}}
  +
  +
まず、ブートローダと El Torito ブートイメージを抽出してください。
  +
  +
{{bc|
  +
$ osirrox -indev archlinux-''YYYY.MM.DD''-x86_64.iso \
  +
-extract_boot_images ./ \
  +
-cpx /EFI/BOOT/BOOTx64.EFI ./
  +
}}
  +
  +
{{ic|BOOTx64.efi}} ファイルを PreLoader に置き換えてください:
  +
  +
{{bc|
  +
$ mv BOOTx64.EFI loader.efi
  +
$ cp /usr/share/preloader-signed/PreLoader.efi BOOTx64.EFI
  +
$ cp /usr/share/preloader-signed/HashTool.efi HashTool.efi
  +
}}
  +
  +
新しいファイルをブートイメージに追加してください:
  +
  +
$ mcopy -D oO -i eltorito_img2_uefi.img BOOTx64.EFI loader.efi HashTool.efi ::/EFI/BOOT/
  +
  +
最後に、変更されたブートイメージと新しいブートローダファイルを使って ISO を再パックしてください。
  +
  +
{{bc|
  +
$ xorriso -indev archlinux-''YYYY.MM.DD''-x86_64.iso \
  +
-outdev archlinux-''YYYY.MM.DD''-x86_64-Secure_Boot.iso \
  +
-map_l ./ /EFI/BOOT/ BOOTx64.EFI loader.efi HashTool.efi -- \
  +
-boot_image any replay \
  +
-append_partition 2 0xef eltorito_img2_uefi.img
  +
}}
  +
  +
=== オプション ROM のダイジェスト値を登録する ===
  +
  +
[[Wikipedia:Option ROM|オプション ROM]] (OpROM: ブート中に実行されるデバイスファームウェア) は、セキュアブートのために署名されている必要があります。さもないと、デバイスが初期化されません。たいてい、OpROM は Microsoft 3rd Party UEFI CA 証明書で署名されています。このせいで、あなた独自の鍵のみによるセキュアブートができないことがあります。代わりに、OpROM の SHA256 ダイジェスト値 (ハッシュ値) を登録することで、この問題を解決できます。
  +
  +
{{Warning|Microsoft 3rd Party UEFI CA 証明書を削除して必須のデバイスが初期化されなくなってしまうと、一部のデバイス (ノート PC も含む) においてはハードウェアが文鎮化してしまい、ファームウェアの設定画面にすら入れなくなって問題解決が不可能になる恐れがあります。}}
  +
  +
[[TPM]] のあるシステムでは、[https://docs.kernel.org/security/tpm/tpm_event_log.html TPM イベントログ]からオプション ROM の SHA256 ダイジェスト値を得ることができます。
  +
  +
{{Pkg|tpm2-tools}} と {{AUR|digest-to-efi-sig-list}} を[[インストール]]してください。
  +
  +
{{man|1|tpm2_eventlog}} を使い、{{ic|/sys/kernel/security/tpm0/binary_bios_measurements}} から {{ic|BOOT_SERVICES_DRIVER}} のダイジェスト値を探してください。[https://github.com/Foxboron/sbctl/wiki/FAQ#option-rom]
  +
  +
例えば:
  +
  +
{{hc|# tpm2_eventlog /sys/kernel/security/tpm0/binary_bios_measurements|
  +
...
  +
- EventNum: 9
  +
PCRIndex: 2
  +
EventType: EV_EFI_BOOT_SERVICES_DRIVER
  +
DigestCount: 1
  +
Digests:
  +
- AlgorithmId: sha256
  +
Digest: "'''''0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'''''"
  +
...
  +
- EventNum: 10
  +
PCRIndex: 2
  +
EventType: EV_EFI_BOOT_SERVICES_DRIVER
  +
DigestCount: 1
  +
Digests:
  +
- AlgorithmId: sha256
  +
Digest: "'''''fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210'''''"
  +
...
  +
}}
  +
  +
探し出したそれぞれの OpROM ダイジェスト値に対する EFI 署名リストを作成するには、''digest-to-efi-sig-list'' を使用してください:
  +
  +
$ digest-to-efi-sig-list ''0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'' OpROM1.esl
  +
$ digest-to-efi-sig-list ''fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210'' OpROM2.esl
  +
  +
複数の OpROM がある場合は、それぞれの EFI 署名リストを1つにまとめて、単一のファイルとして署名できるようにしてください:
  +
  +
$ cat OpROM1.esl OpROM2.esl > OpROM.esl
  +
  +
EFI 署名リストに署名して、Signature Database に追加してください:
  +
  +
$ sign-efi-sig-list -a -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db OpROM.esl OpROM.auth
  +
  +
そして、[[#ファームウェアに鍵を登録する|登録してください]]。
  +
  +
最も危険な最後のステップは、Microsoft 3rd Party UEFI CA 証明書を Signature Database から削除することです。削除後もシステムが起動し、全てのデバイスが機能することを確認してください。
   
 
== 参照 ==
 
== 参照 ==
   
* [https://edk2-docs.gitbook.io/understanding-the-uefi-secure-boot-chain/ Understanding the UEFI Secure Boot Chain] by tianocore
+
* [https://edk2-docs.gitbook.io/understanding-the-uefi-secure-boot-chain/ Understanding the UEFI Secure Boot Chain] tianocore による
* [[Wikipedia:Unified Extensible Firmware Interface#Secure boot]]
+
* [[Wikipedia:ja:Unified Extensible Firmware Interface#セキュアブート]]
* [https://www.rodsbooks.com/efi-bootloaders/secureboot.html Dealing with Secure Boot] by Rod Smith
+
* [https://www.rodsbooks.com/efi-bootloaders/secureboot.html Dealing with Secure Boot] Rod Smith による
* [https://www.rodsbooks.com/efi-bootloaders/controlling-sb.html Controlling Secure Boot] by Rod Smith
+
* [https://www.rodsbooks.com/efi-bootloaders/controlling-sb.html Controlling Secure Boot] Rod Smith による
* [https://mjg59.dreamwidth.org/5850.html UEFI secure booting (part 2)] by Matthew Garrett
+
* [https://mjg59.dreamwidth.org/5850.html UEFI secure booting (part 2)] Matthew Garrett による
* [https://blog.hansenpartnership.com/uefi-secure-boot/ UEFI Secure Boot] by James Bottomley
+
* [https://blog.hansenpartnership.com/uefi-secure-boot/ UEFI Secure Boot] James Bottomley による
 
* [https://git.kernel.org/cgit/linux/kernel/git/jejb/efitools.git/tree/README efitools README]
 
* [https://git.kernel.org/cgit/linux/kernel/git/jejb/efitools.git/tree/README efitools README]
 
* [https://www.fsf.org/campaigns/secure-boot-vs-restricted-boot Will your computer's "Secure Boot" turn out to be "Restricted Boot"?] — Free Software Foundation
 
* [https://www.fsf.org/campaigns/secure-boot-vs-restricted-boot Will your computer's "Secure Boot" turn out to be "Restricted Boot"?] — Free Software Foundation
* [https://www.fsf.org/campaigns/secure-boot-vs-restricted-boot/statement/campaigns/secure-boot-vs-restricted-boot/whitepaper-web Free Software Foundation recommendations for free operating system distributions considering Secure Boot]
+
* [https://www.fsf.org/campaigns/secure-boot-vs-restricted-boot/statement/campaigns/secure-boot-vs-restricted-boot/whitepaper-web フリーなオペレーティングシステムディストリビューションにおけるセキュアブートに関する Free Software Foundation による推奨事項]
* [https://web.archive.org/web/20150928202110/https://firmware.intel.com/messages/219 Intel's UEFI Secure Boot Tutorial]
+
* [https://web.archive.org/web/20150928202110/https://firmware.intel.com/messages/219 Intel UEFI セキュアブートチュートリアル]
* [http://dreamhack.it/linux/2015/12/03/secure-boot-signed-modules-and-signed-elf-binaries.html Secure Boot, Signed Modules and Signed ELF Binaries]
+
* [https://web.archive.org/web/20200205044007/http://dreamhack.it/linux/2015/12/03/secure-boot-signed-modules-and-signed-elf-binaries.html Secure Boot, Signed Modules and Signed ELF Binaries]
* 国家安全保障局のドキュメント: [https://www.nsa.gov/Portals/70/documents/what-we-do/cybersecurity/professional-resources/ctr-uefi-defensive-practices-guidance.pdf UEFI Defensive Practices Guidance] 機密れた[https://media.defense.gov/2020/Sep/15/2002497594/-1/-1/0/CTR-UEFI-SECURE-BOOT-CUSTOMIZATION-20200915.PDF/CTR-UEFI-SECURE-BOOT-CUSTOMIZATION-20200915.PDF UEFI Secure Boot customization]
+
* 国家安全保障局のドキュメント: [https://www.nsa.gov/Portals/70/documents/what-we-do/cybersecurity/professional-resources/ctr-uefi-defensive-practices-guidance.pdf UEFI Defensive Practices Guidance] 及び機密解除された [https://media.defense.gov/2020/Sep/15/2002497594/-1/-1/0/CTR-UEFI-SECURE-BOOT-CUSTOMIZATION-20200915.PDF/CTR-UEFI-SECURE-BOOT-CUSTOMIZATION-20200915.PDF UEFI Secure Boot customization]
* [http://jk.ozlabs.org/docs/sbkeysync-maintaing-uefi-key-databases/ sbkeysync & maintaining uefi key databases] by Jeremy Kerr
+
* [http://jk.ozlabs.org/docs/sbkeysync-maintaing-uefi-key-databases/ sbkeysync & maintaining uefi key databases] Jeremy Kerr による
 
* [https://nwildner.com/posts/2020-07-04-secure-your-boot-process/ Secure your boot process: UEFI + Secureboot + EFISTUB + Luks2 + lvm + Arch Linux] (2020-07)
 
* [https://nwildner.com/posts/2020-07-04-secure-your-boot-process/ Secure your boot process: UEFI + Secureboot + EFISTUB + Luks2 + lvm + Arch Linux] (2020-07)
 
* [https://security.stackexchange.com/questions/29122/how-is-hibernation-supported-on-machines-with-uefi-secure-boot How is hibernation supported, on machines with UEFI Secure Boot?] (Security StackExchange)
 
* [https://security.stackexchange.com/questions/29122/how-is-hibernation-supported-on-machines-with-uefi-secure-boot How is hibernation supported, on machines with UEFI Secure Boot?] (Security StackExchange)
* [http://0pointer.net/blog/authenticated-boot-and-disk-encryption-on-linux.html Authenticated Boot and Disk Encryption on Linux] by Lennart Poettering (2021-09-23)
+
* [https://0pointer.net/blog/authenticated-boot-and-disk-encryption-on-linux.html Authenticated Boot and Disk Encryption on Linux] Lennart Poettering による (2021-09-23)
  +
* {{AUR|cryptboot}} ツールは、(セキュアブートのための) プロセス全体を簡略化し、簡単に使えるようにします。
   
{{TranslationStatus|Unified Extensible Firmware Interface/Secure Boot|2023-06-29|781881}}
+
{{TranslationStatus|Unified Extensible Firmware Interface/Secure Boot|2024-03-28|804762}}

2024年4月24日 (水) 20:24時点における最新版

関連記事

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

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

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

目次

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

OS の起動前

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

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

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

OS の起動後

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

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

ここでは、セキュアブートが (ユーザモードで) 有効化され強制されていることがわかります。他に取りうる値としては、Setup Mode の場合は disabled (setup)、セキュアブートが無効化されている場合は disabled (disabled)、ファームウェアにセキュアブートのサポートがない場合は disabled (unsupported) があります。

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

$ 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 インストールメディアのセキュアブートサポートは 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 製ノートパソコンや最近の Xiaomi ノートパソコン) では、管理者パスワードを設定しないとセキュアブートを無効化できません (無効化した後に管理者パスワードは消去できます)。Rod Smith の Secure Boot 無効化に関する記事 も参照。

インストールイメージを再パックする

#ISO の再パック を見てください。

インストールメディアを編集する

USB インストールメディアを使用している場合、そのメディア上の EFI システムパーティションを手動で編集してセキュアブートのサポートを追加することが可能です。

USB ドライブを挿入し、EFI システムパーティションをマウントしてください:

# mount /dev/disk/by-label/ARCHISO_EFI /mnt

そして、#署名済みのブートローダを使う の指示に従って、署名済みのブートローダをインストールしてください。例えば、#PreLoader をインストールするには:

# mv /mnt/EFI/BOOT/BOOTx64.EFI /mnt/EFI/BOOT/loader.efi
# cp /usr/share/preloader-signed/PreLoader.efi /mnt/EFI/BOOT/BOOTx64.EFI
# cp /usr/share/preloader-signed/HashTool.efi /mnt/EFI/BOOT/HashTool.efi

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

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

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

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

GRUB ブートローダを使うには、セキュアブートを有効化する前に追加の手順が必要になります。詳細は GRUB#セキュアブートサポート を参照してください。

自分の鍵を使う

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

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

Platform Key (PK)
トップレベル鍵
Key Exchange Key (KEK)
Signature Database や Forbidden Signatures Database の更新に署名するのに使われる鍵
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 は自分自身で署名することができます。

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

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

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

$ for var in PK KEK db dbx ; do efi-readvar -v $var -o old_${var}.esl ; done

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

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

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

sbctl でより簡単に行う

sbctl は、セキュアブートをセットアップしたりファイルを署名したりするユーザーフレンドリーな方法です。

ノート: sbctl はすべてのハードウェアで動作するわけではありません。このツールがうまく動作するかはハードウェアの製造元に掛かっています。

使用するには sbctlインストールしてください。upstream READMEsbctl(8) も参照してください。

キーを作成・登録する

始める前に、ファームウェアの設定画面に行き、セキュアブートのモードを Setup mode にしてください。これはデバイスごとに異なります。

ログインし直したら、セキュアブートの状態を確認してください:

$ sbctl status

sbctl がインストールされておらず、セキュアブートが無効化されていることを確認できるはずです。

次に、カスタムのセキュアブート鍵を作成してください:

# sbctl create-keys

あなたの鍵を Microsoft の鍵と一緒に UEFI に登録してください:

# sbctl enroll-keys -m
警告: 一部のファームウェアは Microsoft の鍵で署名されており、セキュアブートが有効化されると Microsoft の鍵によって検証されます。デバイスが検証できないと、そのデバイスが文鎮化してしまう可能性があります。Microsoft の鍵抜きであなたの鍵を登録するには、# sbctl enroll-keys を実行してください。ただし、あなたが何をしようとしているのか理解している場合に限り、これを行ってください。

セキュアブートの状態を再び確認してください:

$ sbctl status

sbctl がインストールされているはずです。しかし、あなたの鍵でブートファイルを署名するまで、セキュアブートは動作しません。

署名

セキュアブートを動作させるために署名が必要なファイルを確認します:

# sbctl verify

次に、署名されていないすべてのファイルに署名します。通常、カーネルブートローダーには署名が必要です。例えば:

# sbctl sign -s /boot/vmlinuz-linux
# sbctl sign -s /boot/EFI/BOOT/BOOTX64.EFI

署名が必要なファイルは、システムのレイアウト、カーネル、ブートローダーによって異なります。

ヒント: 特に Windows とデュアルブートしている場合は、署名する必要のあるファイルが多い場合があります。sed を使えば、sbctl によるファイルの署名を全て済ませることができます:
# sbctl verify | sed 's/✗ /sbctl sign -s /e'

この例では、出力されたファイルのパスが /boot からの相対パスであると仮定しています。

これで完了です! システムを再起動し、ファームウェアの設定でセキュアブートをオンに戻してください。ブートローダーとOSがロードされれば、セキュアブートは機能しているはずです。以下のコマンドで確認してください:

$ sbctl status
pacman フックを使って自動的に署名する

sbctl には、Linux カーネルsystemdブートローダーがアップデートされたときに自動的にすべての新規ファイルを署名する pacman フックが同梱されています。

ヒント: Systemd-bootsystemd-boot-update.service を使用している場合、ブートローダーは再起動後にしかアップデートされないので、sbctl の pacman フックはその新しいファイルを署名しません。回避策としては、/usr/lib/ 内のブートローダーを直接署名すると良いかもしれません。bootctl installupdate は自動的に、通常の .efi ではなく .efi.signed ファイルを認識し、ESP にコピーします。bootctl(1) を参照してください。
# sbctl sign -s -o /usr/lib/systemd/boot/efi/systemd-bootx64.efi.signed /usr/lib/systemd/boot/efi/systemd-bootx64.efi

手動による手順

efitools をインストールする

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

鍵の生成

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

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

.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 noPK.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
ヘルパースクリプト

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

スクリプトを使うには、安全な場所にフォルダを作成し(例えば、後で sbupdate-gitAUR を使ってユニファイドカーネルイメージを作成し署名する予定なのであれば /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")

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

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

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 --keystore /etc/secureboot/keys --pk --dry-run --verbose

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

# sbkeysync --keystore /etc/secureboot/keys --verbose
# sbkeysync --keystore /etc/secureboot/keys --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 でフォーマットされたファイルシステム (EFI システムパーティション が使えます) に noPK.auth ファイルを除いて *.cer*.esl*.auth をすべてコピーしてください。

警告: noPK.authEFI システムパーティション (ESP) にコピーしないでください! そうしてしまうと、例えば誰かがあなたの PC を盗んだ場合に、その人が EFI セキュアブートファームウェア内のあなたの Platform Key を削除し、"Setup Mode" を有効化して、セキュアブート鍵(PK, KEK, db, dbx)をその人のものに置き換えることができてしまいます。これでは UEFI セキュアブートの意味がありません。あなただけが Platform Key を置き換えられるようにするべきです。なので、あなたの以外の人が noPK.auth ファイルにアクセスできないようにするべきなのです。以上の理由から、noPK.auth ファイルは、あなただけがアクセスできる秘密の安全な場所に保管してください。noPK.auth ファイルの保管場所として安全なのは:

UEFI 仕様に従って PC 上の EFI システムパーティションは暗号化されていてはならず、(あなたの PC が盗まれた場合や、ハードドライブが抜き取られて他の PC に接続された場合に)他の PC 上でマウントかつ読み込み可能です。また、noPK.auth ファイルをあなたの PC の ESP にコピーして、後で削除することも推奨されません。なぜなら、FAT32 の EFI システムパーティション上で削除されたファイルは、PhotoRec のようなツールで復元できてしまうからです。

ファームウェアのセットアップユーティリティを起動し、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 を見てください。

EFI バイナリに署名する

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

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 で手動で署名できる結合イメージを生成する方法はユニファイドカーネルイメージ を見てください。
mkinitcpio のポストフックでカーネルに署名する

mkinitcpio のポストフックを使って、initramfs の生成時にカーネルイメージに署名することもできます。

以下のファイルを作成し、実行可能属性を付与してください:

/etc/initcpio/post/kernel-sbsign
#!/usr/bin/env bash

kernel="$1"
[[ -n "$kernel" ]] || exit 0

# use already installed kernel if it exists
[[ ! -f "$KERNELDESTINATION" ]] || kernel="$KERNELDESTINATION"

keypairs=(/path/to/db.key /path/to/db.crt)

for (( i=0; i<${#keypairs[@]}; i+=2 )); do
    key="${keypairs[$i]}" cert="${keypairs[(( i + 1 ))]}"
    if ! sbverify --cert "$cert" "$kernel" &>/dev/null; then
        sbsign --key "$key" --cert "$cert" --output "$kernel" "$kernel"
    fi
done

/path/to/db.key/path/to/db.crt の部分は、カーネルの署名に使用するキーペアへのパスに置き換えてください。

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

mkinitcpio のポストフックで ユニファイドカーネルイメージに署名する

ユニファイドカーネルイメージ#セキュアブート用の UKI への署名 章を参照してください。

sbupdate による完全に自動化されたユニファイドカーネルの生成と署名
ノート: sbupdate が作成されたのは、mkinitcpio やその他の initramfs ジェネレータにユニファイドカーネルイメージの生成機能が追加されて以前は面倒であった作業が非常に簡単になる前です。今日では、#sbctl でより簡単に行う にあるように sbctl を使用することを検討してください。

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

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

ヒント: 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?)。これらは無害で、安全に無視できます。[5]

鍵をアップデートする

一度セキュアブートを "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 が作成されたら登録してください。

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

Microsoft Windows

"Microsoft Windows Production PCA 2011" 鍵を UEFI セキュアブート変数に登録しない場合、カスタム、個人の鍵で Windows のブートローダー (EFI/Microsoft/Boot/bootmgfw.efi) を署名しても、Windows を起動することは通常不可能です:

  • bootmgfw.efi に "Microsoft Windows Production PCA 2011" とあなたの独自のセキュアブート db 鍵の両方の署名 (つまり、2つの署名) が含まれている場合、INSYDE Corp. 4096.01 (UEFI Version 2.31, Version F.70, Release Date: 07/18/2016, BIOS Revision 15.112, Firmware Revision: 29.66) のような UEFI ファームウェア実装は、bootmgfw.efi を起動せず、セキュリティ違反エラー (Selected boot image did not authenticate. Press ENTER to continue.) を発生させます: このような UEFI ファームウェア実装は、おそらく1番目の署名だけは読み込むことができるでしょうが、2番目の署名は無理でしょう。2番目の署名の証明書だけが UEFI セキュアブート変数に登録されているので、セキュアブートの検証が失敗するのです。
  • bootmgfw.efi ファイルの "Microsoft Windows Production PCA 2011" 証明書が strip/削除されていて、さらにあなたの独自のセキュアブート db 鍵の署名だけがそのファイルに追加されている場合、UEFI はそのファイルを起動するでしょう。しかし、Windows はリカバリ/回復環境を起動してしまいます: Windows は Windows 環境が破損していると報告するでしょう (bootmgfw.efi ファイルの "Microsoft Windows Production PCA 2011" 署名が存在しないからです)。

なので、Windows とデュアルブートするには

  • 選択肢1: bootmgfw.efi のハッシュを db 変数の許可ハッシュリストに追加する必要があります。そして、Windows アップデートが bootmgfw.efi を変更するたびに毎回 db 変数をアップデートする必要があります。これはかなり面倒くさいうえ、エラーが発生しやすく、Microsoft によってサポートされている方法ではありません。さらに、このようなセットアップでは Bitlocker は正しく動作しないでしょう (Windows パーティションを復号化するために毎回 Bitlocker が回復パスワードを尋ねてきます)。
  • 選択肢2: Micosoft の証明書を UEFI セキュアブート変数に追加する必要があります。Microsoft は4つの db 証明書と2つの KEK 証明書を持っています (日本語訳ページ):

Microsoft の GUID (77fa9abd-0359-4d32-bd60-28f4e78f784b) を使用して Microsoft の DER 形式 db 証明書の EFI Signature Lists を作成し、それらのリストを1つのファイルにまとめてください:

$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_db_2011.esl MicWinProPCA2011_2011-10-19.crt
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_db_2023.esl 'windows uefi ca 2023.crt'
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_UEFI_db_2011.esl MicCorUEFCA2011_2011-06-27.crt
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_UEFI_db_2023.esl 'microsoft uefi ca 2023.crt'
$ cat MS_Win_db_2011.esl MS_Win_db_2023.esl MS_UEFI_db_2011.esl MS_UEFI_db_2023.esl > MS_db.esl

任意 (Microsoft の UEFI セキュアブート要件を厳密に満たすために): Microsoft の GUID (77fa9abd-0359-4d32-bd60-28f4e78f784b) を使って Microsoft の DER 形式 KEK 証明書の EFI Signature List を作成してください:

$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_KEK_2011.esl MicCorKEKCA2011_2011-06-24.crt
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_KEK_2023.esl 'microsoft corporation kek 2k ca 2023.crt'
$ cat MS_Win_KEK_2011.esl MS_Win_KEK_2023.esl > MS_Win_KEK.esl

db 変数のアップデートを KEK を使って署名してください。sign-efi-sig-list-a オプションで使用してください (-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

任意 (Microsoft の UEFI セキュアブート要件を厳密に満たすために): KEK 変数のアップデートを PK で署名してください。sign-efi-sig-list-a オプションで使用してください (-a オプションは KEK 証明書を置き換えるのではなく 追加 します):

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

#ファームウェアに鍵を登録する に従い、UEFI セキュアブートデータベース変数に add_MS_db.auth を登録してください。Microsoft の UEFI セキュアブート要件を厳密に満たしたい場合は、add_MS_Win_KEK.auth も登録してください。

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

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

警告: Microsoft が "Secured-core PC" と呼ぶものには Microsoft 3rd Party UEFI CA 証明書 (Microsoft Corporation UEFI CA 2011 または Microsoft UEFI CA 2023) が登録されていません。[6] (日本語訳ページ)。唯一登録されている DB 証明書は Microsoft Windows Production PCA 2011 証明書で、これは Windows ブートローダーを署名するためだけに使用されます。

Microsoft 3rd Party UEFI CA 証明書で署名された EFI バイナリや OpROM を起動するには、Microsoft 3rd Party UEFI CA 証明書の登録をファームウェアの設定で有効化する必要があります。

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 --unicode --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 --unicode --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 --unicode --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:2048 -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
ノート: shim は 4096 RSA キーを MokList に追加できないようです (grubx64.efi バイナリをロードして検証する際にフリーズするかもしれません)。なので、今の時点では 2048 キーを使用してください。Debian:SecureBoot#Generating a new key を参照してください。

(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

ブートローダーとカーネルをアップデートするたびに上記の署名が必要です。カーネルの署名は mkinitpcio のポストフックで自動化できます。以下のファイルを作成し、実行可能にしてください:

/etc/initcpio/post/kernel-sbsign
#!/usr/bin/env bash

kernel="$1"
[[ -n "$kernel" ]] || exit 0

# use already installed kernel if it exists
[[ ! -f "$KERNELDESTINATION" ]] || kernel="$KERNELDESTINATION"

keypairs=(/path/to/MOK.key /path/to/MOK.crt)

for (( i=0; i<${#keypairs[@]}; i+=2 )); do
    key="${keypairs[$i]}" cert="${keypairs[(( i + 1 ))]}"
    if ! sbverify --cert "$cert" "$kernel" &>/dev/null; then
        sbsign --key "$key" --cert "$cert" --output "$kernel" "$kernel"
    fi
done

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

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

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

shim で鍵と GRUB を使う

手順は GRUB#Shim-lock を見てください。

登録されたハッシュ/鍵を削除する

MOK データベースに登録されたハッシュ/鍵のエントリは、NVRAM の領域を少しずつ圧迫していきます。領域を節約し、古いプログラムがブートされないようにするために、使っていないハッシュ/鍵は削除すると良いかもしれません。

MOK データベースは mokutil で管理できます。

登録された鍵とハッシュを一覧表示する:

# mokutil --list-enrolled

データベースからハッシュを削除する。ここで入力するパスワードは、MOK マネージャで削除の確認を行う際に再び尋ねられます。

# mokutil --delete-hash <削除するハッシュ>
Input password:

データベースから鍵を削除する:

# mokutil --delete MOK.cer

次回のブート時に削除されるハッシュ/鍵を一覧表示する:

# mokutil --list-delete

次回のブート時に、登録/削除するハッシュ/鍵のオプション付きで MOK マネージャが初期化されます。詳細は mokutil(1) を参照してください。

shim を除去する

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

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

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

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

ヒントとテクニック

ISO の再パック

libisoburnmtools を使うことで、公式のインストールイメージを展開したり、再パックしたりできます。この方法で、カスタムの鍵か署名済みのブートローダを使ってセキュアブートをサポートするイメージを作成することができます。

公式の ISO をカスタムの鍵で署名する

ブートローダー (BOOTx64.EFIBOOTIA32.EFI)、カーネル、UEFI シェルを ISO から抽出し、それらを署名し、署名済みファイルを ISO に再パックすることで、カスタムの鍵で公式の ISO にセキュアブートサポートを追加できます。

まず、関連するファイルと El Torito ブートイメージを抽出してください:

$ osirrox -indev archlinux-YYYY.MM.DD-x86_64.iso \
	-extract_boot_images ./ \
	-extract /EFI/BOOT/BOOTx64.EFI BOOTx64.EFI \
	-extract /EFI/BOOT/BOOTIA32.EFI BOOTIA32.EFI \
	-extract /shellx64.efi shellx64.efi \
	-extract /shellia32.efi shellia32.efi \
	-extract /arch/boot/x86_64/vmlinuz-linux vmlinuz-linux

mkarchiso によって使用されている xorrisofs(1) のオプション -rational-rock は、ISO 9660 のファイルを読み取り専用にし、これは抽出後も維持されます。ファイルを書き込み可能にし、変更できるようにしましょう:

$ chmod +w BOOTx64.EFI BOOTIA32.EFI shellx64.efi shellia32.efi vmlinuz-linux

ファイルを署名してください。sbsigntools を使って署名する場合、以下のようにできます:

$ sbsign --key db.key --cert db.crt --output BOOTx64.EFI BOOTx64.EFI
$ sbsign --key db.key --cert db.crt --output BOOTIA32.EFI BOOTIA32.EFI
$ sbsign --key db.key --cert db.crt --output shellx64.efi shellx64.efi
$ sbsign --key db.key --cert db.crt --output shellia32.efi shellia32.efi
$ sbsign --key db.key --cert db.crt --output vmlinuz-linux vmlinuz-linux

ブートローダーと UEFI シェルを eltorito_img2_uefi.img にコピーしてください。これは EFI システムパーティションとして使用され、El Torito UEFI ブートイメージとしてリストアップされます。eltorito_img2_uefi.img のサイズは固定されていますが、丸め/アライメントのためや予約済みセクタに対処するために mkarchiso によって 1 MiB の空き領域が追加されています。なので、署名によるサイズ増は問題にはならないはずです。

$ mcopy -D oO -i eltorito_img2_uefi.img BOOTx64.EFI BOOTIA32.EFI ::/EFI/BOOT/
$ mcopy -D oO -i eltorito_img2_uefi.img shellx64.efi shellia32.efi ::/

変更された El Torito UEFI ブートイメージを使って ISO を再パックし、署名されたブートローダーのファイル、UEFI シェル、カーネルを ISO 9660 に追加してください:

$ xorriso -indev archlinux-YYYY.MM.DD-x86_64.iso \
	-outdev archlinux-YYYY.MM.DD-x86_64-Secure_Boot.iso \
	-map vmlinuz-linux /arch/boot/x86_64/vmlinuz-linux \
	-map_l ./ /EFI/BOOT/ BOOTx64.EFI BOOTIA32.EFI -- \
	-map_l ./ / shellx64.efi shellia32.efi -- \
	-boot_image any replay \
	-append_partition 2 0xef eltorito_img2_uefi.img

完成した archlinux-YYYY.MM.DD-x86_64-Secure_Boot.iso を起動してみてください。

ブートローダを PreLoader に置き換える

公式の ISO イメージにセキュアブートのサポートを追加するもう一つの方法は、ブートローダを抽出し、それを #PreLoader で置き換えることです。

ノート: ISO の GRUB EFI バイナリ (EFI/BOOT/BOOTx64.EFI) は --disable-shim-lock でビルドされているため、shim で使用することはできません。これは GRUB の制限であり、GRUB に shim かカスタムの署名のどちらか一方との互換性を持たせることはできますが、同時に両方との互換性を持たせることはできません。

まず、ブートローダと El Torito ブートイメージを抽出してください。

$ osirrox -indev archlinux-YYYY.MM.DD-x86_64.iso \
	-extract_boot_images ./ \
	-cpx /EFI/BOOT/BOOTx64.EFI ./

BOOTx64.efi ファイルを PreLoader に置き換えてください:

$ mv BOOTx64.EFI loader.efi
$ cp /usr/share/preloader-signed/PreLoader.efi BOOTx64.EFI
$ cp /usr/share/preloader-signed/HashTool.efi HashTool.efi

新しいファイルをブートイメージに追加してください:

$ mcopy -D oO -i eltorito_img2_uefi.img BOOTx64.EFI loader.efi HashTool.efi ::/EFI/BOOT/

最後に、変更されたブートイメージと新しいブートローダファイルを使って ISO を再パックしてください。

$ xorriso -indev archlinux-YYYY.MM.DD-x86_64.iso \
	-outdev archlinux-YYYY.MM.DD-x86_64-Secure_Boot.iso \
	-map_l ./ /EFI/BOOT/ BOOTx64.EFI loader.efi HashTool.efi -- \
	-boot_image any replay \
	-append_partition 2 0xef eltorito_img2_uefi.img

オプション ROM のダイジェスト値を登録する

オプション ROM (OpROM: ブート中に実行されるデバイスファームウェア) は、セキュアブートのために署名されている必要があります。さもないと、デバイスが初期化されません。たいてい、OpROM は Microsoft 3rd Party UEFI CA 証明書で署名されています。このせいで、あなた独自の鍵のみによるセキュアブートができないことがあります。代わりに、OpROM の SHA256 ダイジェスト値 (ハッシュ値) を登録することで、この問題を解決できます。

警告: Microsoft 3rd Party UEFI CA 証明書を削除して必須のデバイスが初期化されなくなってしまうと、一部のデバイス (ノート PC も含む) においてはハードウェアが文鎮化してしまい、ファームウェアの設定画面にすら入れなくなって問題解決が不可能になる恐れがあります。

TPM のあるシステムでは、TPM イベントログからオプション ROM の SHA256 ダイジェスト値を得ることができます。

tpm2-toolsdigest-to-efi-sig-listAURインストールしてください。

tpm2_eventlog(1) を使い、/sys/kernel/security/tpm0/binary_bios_measurements から BOOT_SERVICES_DRIVER のダイジェスト値を探してください。[7]

例えば:

# tpm2_eventlog /sys/kernel/security/tpm0/binary_bios_measurements
...
- EventNum: 9
  PCRIndex: 2
  EventType: EV_EFI_BOOT_SERVICES_DRIVER
  DigestCount: 1
  Digests:
  - AlgorithmId: sha256
    Digest: "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
...
- EventNum: 10
  PCRIndex: 2
  EventType: EV_EFI_BOOT_SERVICES_DRIVER
  DigestCount: 1
  Digests:
  - AlgorithmId: sha256
    Digest: "fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210"
...

探し出したそれぞれの OpROM ダイジェスト値に対する EFI 署名リストを作成するには、digest-to-efi-sig-list を使用してください:

$ digest-to-efi-sig-list 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef OpROM1.esl
$ digest-to-efi-sig-list fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210 OpROM2.esl

複数の OpROM がある場合は、それぞれの EFI 署名リストを1つにまとめて、単一のファイルとして署名できるようにしてください:

$ cat OpROM1.esl OpROM2.esl > OpROM.esl

EFI 署名リストに署名して、Signature Database に追加してください:

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

そして、登録してください

最も危険な最後のステップは、Microsoft 3rd Party UEFI CA 証明書を Signature Database から削除することです。削除後もシステムが起動し、全てのデバイスが機能することを確認してください。

参照

翻訳ステータス: このページは en:Unified Extensible Firmware Interface/Secure Boot の翻訳バージョンです。最後の翻訳日は 2024-03-28 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。