「Unified Extensible Firmware Interface/セキュアブート」の版間の差分
(→セキュアブートを保護する: 追加) |
(「セキュアブートを実現する」を追加し、競合するセクションを削除。) |
||
82行目: | 82行目: | ||
[[インストール ISO のリマスタリング|インストール ISO をリマスタリング]]する必要があるかもしれません。例えば、[[#PreLoader]] の署名済み EFI アプリケーション {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} が使えます。他の手段としては、セキュアブートをサポートする他の GNU+Linux ディストリビューションのインストールメディアから {{ic|BOOTx64.EFI}} (shim) と {{ic|grubx64.efi}} を拝借するというものがあります。この場合、セキュアブートの認証チェーンは {{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 を作成する]])。 |
[[インストール ISO のリマスタリング|インストール ISO をリマスタリング]]する必要があるかもしれません。例えば、[[#PreLoader]] の署名済み EFI アプリケーション {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} が使えます。他の手段としては、セキュアブートをサポートする他の GNU+Linux ディストリビューションのインストールメディアから {{ic|BOOTx64.EFI}} (shim) と {{ic|grubx64.efi}} を拝借するというものがあります。この場合、セキュアブートの認証チェーンは {{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 を作成する]])。 |
||
− | == |
+ | == セキュアブートを実現する == |
+ | ''セキュアブート''の理想的なセットアップを実現するにはいくつか条件があります: |
||
− | 署名済みのブートローダーを使うというのは Microsoft の鍵で署名されたブートローダーを使うということです。署名済みのブートローダーとしては PreLoader と shim が存在します。どちらも他の EFI バイナリ (通常の[[ブートローダー]]) をチェインロードします。Microsoft は未署名のあらゆるバイナリを自動起動するブートローダーに署名しないことになっているため、PreLoader と shim は Machine Owner Key リストと呼ばれるホワイトリストを使っています。バイナリの SHA256 ハッシュあるいはバイナリの署名鍵が MokList に存在する場合、バイナリが起動されますが、存在しない場合はハッシュや鍵を登録するための鍵管理ユーティリティが起動します。 |
||
+ | # UEFI がほぼ信頼されていて(しかし、いくつかのよく知られた[[Wikipedia:Unified_Extensible_Firmware_Interface#Criticism|批判]]と脆弱性[https://www.uefi.org/sites/default/files/resources/UEFI%20Firmware%20-%20Security%20Concerns%20and%20Best%20Practices.pdf]がある)、必ず[[#セキュアブートを保護する|強力なパスワードで保護されている]]こと。 |
||
− | === archiso の起動 === |
||
+ | # メーカー/サードパーティーのデフォルトの鍵は、セキュアブートのセキュリティモデルを大幅に弱化させることが判明しているので、使用しないこと。[https://habr.com/ru/post/446238/] |
||
− | EFI アプリケーション {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} が archiso に追加されたことで Secure Boot を有効にして archiso を起動することが可能になりました。{{ic|Failed to Start loader... I will now execute HashTool}} というメッセージが表示されます。HashTool を使って {{ic|loader.efi}} と {{ic|vmlinzu.efi}} のハッシュを登録するには、以下の手順に従って下さい: |
||
+ | # セキュアブートによって確立された信頼の鎖をブート中に維持して攻撃面を減らすために、マイクロコード(必要な場合)と initramfs を含む、ユーザ署名済み結合 [[EFISTUB]] カーネルイメージ(ブートマネージャ無し)を UEFI が直接ロードすること。 |
||
− | * {{ic|OK}} を選択してください |
||
+ | # マシンへ物理的にアクセスできる誰かが、カーネルイメージの作成と署名プロセスで使用されるツールとファイルにアクセスしたり改ざんしたりできないようにするために、[[dm-crypt/システム全体の暗号化|ドライブの完全暗号化]]を使用すること。 |
||
− | * HashTool のメインメニューから {{ic|Enroll Hash}} を選択し、{{ic|\loader.efi}} を選んで {{ic|Yes}} で確定します。また、{{ic|Enroll Hash}} と {{ic|archiso}} を選択して archiso のディレクトリに入り、{{ic|vmlinuz-efi}} を選んで {{ic|Yes}} で確定してください。それから {{ic|Exit}} を選択してブートデバイスの選択メニューに戻って下さい。 |
||
+ | # [[TPM]] を使うことでさらに改善することができるかもしれませんが、ツールやサポートの問題がこれを難しくしています。 |
||
− | * ブートデバイスの選択メニューから {{ic|Arch Linux archiso x86_64 UEFI CD}} を選択して下さい |
||
− | archiso が起動し、シェルプロンプトが表示され、自動的に root でログインがされます。archiso が Secure Boot で起動しているかどうか確認するには、次のコマンドを使って下さい (1234 という所はマシンによって異なります。タブ補完を使ったり efi 変数を表示することで調べることができます): |
||
+ | シンプルかつ完全に自立したセットアップは [[#自分の鍵を使う]] で説明されています。一方、[[#署名済みのブートローダーを使う]] では、サードパーティにより署名された中間ツールを使用します。 |
||
− | $ od -An -t u1 /sys/firmware/efi/efivars/SecureBoot-1234abcde-5678- |
||
+ | === 自分で署名した鍵を使う === |
||
− | このコマンドで返ってくるリストの最後が {{ic|1}} ならば Secure Boot で起動しています。例: |
||
+ | {{Warning|プラットフォームの鍵をあなたの鍵で置き換えると、一部のマシン(ノート PC を含む)でハードウェアを文鎮化してしまう可能性があります。そうなると、修正するために UEFI/BIOS の設定画面に入ることが不可能になります。これは、一部のデバイス(GPU など)の、起動中に実行されるファームウェア([[Wikipedia:OpROM|OpROMs]])が、[[#Microsoft Windows|Microsoft の鍵]]を使って署名されているためです。}} |
||
− | 6 0 0 0 1 |
||
+ | セキュアブートでは以下の鍵が使われます: |
||
− | 次のコマンドを実行すると、詳しい状態を表示できます: |
||
− | # bootctl status |
||
+ | ; Platform Key (PK): トップレベル鍵 |
||
− | === PreLoader === |
||
+ | ; Key Exchange Key (KEK): 署名データベースや EFI バイナリに署名するのに使われる鍵 |
||
+ | ; Signature Database (db): EFI バイナリに署名するのに使われる鍵やハッシュが含まれます |
||
+ | ; Forbidden Signatures Database (dbx): EFI バイナリを拒否リストに追加するために使われる鍵やハッシュが含まれます |
||
+ | より詳細な説明は [https://blog.hansenpartnership.com/the-meaning-of-all-the-uefi-keys/ The Meaning of all the UEFI Keys] を見てください。 |
||
− | 起動時に PreLoader は {{ic|loader.efi}} を実行しようとします。MokList に {{ic|loader.efi}} のハッシュが存在しない場合、PreLoader は {{ic|HashTool.efi}} を起動します。HashTool で起動したい EFI バイナリのハッシュ、つまり[[ブートローダー]] ({{ic|loader.efi}}) とカーネルを登録する必要があります。 |
||
+ | セキュアブートをを使用するには最低でも '''PK''', '''KEK''', '''db''' 鍵が必要です。KEK, db, dbx 証明書は複数追加できますが、Platform Key はひとつしか使えません。 |
||
− | {{Note|バイナリ (ブートローダーやカーネル) をアップデートするたびに新しいハッシュの登録が必要です。}} |
||
+ | Secure Boot を "User Mode" にすると、上位の鍵を使用してアップデートに署名しないかぎり鍵を更新できなくなります (''sign-efi-sig-list'' を使用)。Platform key は自分自身で署名することができます。 |
||
− | ==== PreLoader の設定 ==== |
||
+ | ==== efitools をインストールする ==== |
||
− | {{Warning|{{Pkg|efitools}} パッケージに含まれている {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} は署名されていないため、使い道は限られています。署名済みの {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} を入手するには {{AUR|preloader-signed}} をインストールするか [https://blog.hansenpartnership.com/linux-foundation-secure-boot-system-released/ 手動でダウンロード] します。}} |
||
+ | 以下のほぼ全てのセクションで、{{Pkg|efitools}} パッケージが[[インストール]]されている必要があります。 |
||
− | {{AUR|preloader-signed}} パッケージを[[インストール]]して {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} を[[ブートローダー]]のディレクトリにコピーしてください。[[systemd-boot]] の場合、以下を実行: |
||
+ | ==== 現在の変数をバックアップする ==== |
||
− | # cp /usr/share/preloader-signed/{PreLoader,HashTool}.efi ''esp''/EFI/systemd |
||
+ | 新しい鍵を作成したり EFI 変数を変更したりする前に、現在の変数をバックアップしておくことを推奨します。そうすれば、エラーが発生した場合に変数を復元できます。 |
||
− | そしてブートローダーのバイナリをコピーして {{ic|loader.efi}} に名前を変更します。[[systemd-boot]] の場合、以下を実行: |
||
+ | 主要なセキュアブートの変数4つを全てバックアップするには、以下のコマンドを実行してください: |
||
− | # cp ''esp''/EFI/systemd/systemd-bootx64.efi ''esp''/EFI/systemd/loader.efi |
||
+ | $ efi-readvar -v PK -o old_PK.esl |
||
− | 最後に、{{ic|PreLoader.efi}} を起動する NVRAM エントリを新しく作成してください: |
||
+ | $ efi-readvar -v KEK -o old_KEK.esl |
||
+ | $ efi-readvar -v db -o old_db.esl |
||
+ | $ efi-readvar -v dbx -o old_dbx.esl |
||
+ | 新しいコンピュータやマザーボードでこれらのコマンドを実行する場合、抽出される変数はおそらくマイクロソフトにより提供されたものでしょう。 |
||
− | # efibootmgr --disk /dev/sd'''X''' --part '''Y''' --create --label "PreLoader" --loader /EFI/systemd/PreLoader.efi |
||
+ | ==== 鍵を作成する ==== |
||
− | {{ic|X}} は [[EFI システムパーティション]]のドライブ文字に、{{ic|Y}} は同じくパーティション番号に置き換えてください。 |
||
+ | ===== 手動による手順 ===== |
||
− | 上記のエントリは起動リストの一番最初に追加する必要があります。{{ic|efibootmgr}} コマンドで確認して、必要であればブートローダーの設定を変更してください。 |
||
+ | 鍵を生成するには以下の手順を行ってください: |
||
− | ===== フォールバック ===== |
||
+ | 秘密鍵と複数の形式の証明書を作成する必要があります: |
||
− | カスタム NVRAM エントリの起動に問題が発生する場合、{{ic|HashTool.efi}} と {{ic|loader.efi}} を UEFI によって自動的に起動されるデフォルトのブートローダーの場所にコピーしてください: |
||
+ | ; {{ic|.key}}: EFI バイナリと EFI 署名リストの署名に必要な PEM 形式の''秘密''鍵。 |
||
− | # cp /usr/share/preloader-signed/HashTool.efi ''esp''/EFI/Boot |
||
+ | ; {{ic|.crt}}: {{man|1|sbsign}}、{{man|1|sbvarsign}}、{{man|1|sign-efi-sig-list}} で必要な PEM 形式の証明書。 |
||
− | # cp ''esp''/EFI/systemd/systemd-bootx64.efi ''esp''/EFI/Boot/loader.efi |
||
+ | ; {{ic|.cer}}: ファームウェアが使用する DER 形式の証明書。 |
||
+ | ; {{ic|.esl}}: {{man|1|sbvarsign}} や {{man|1|efi-updatevar}}、''KeyTool''、ファームウェアのための EFI 署名リストの証明書。 |
||
+ | ; {{ic|.auth}}: {{man|1|efi-updatevar}} や ''sbkeysync''、''KeyTool''、ファームウェアのための認証ヘッダが付いた EFI 署名リストの証明書 (つまり、署名済みの証明書アップデートファイル)。 |
||
+ | 所有者を識別する [[Wikipedia:Globally unique identifier|GUID]] を作成してください: |
||
− | {{ic|PreLoader.efi}} をコピーして名前を変更します: |
||
+ | $ uuidgen --random > GUID.txt |
||
− | # cp /usr/share/preloader-signed/PreLoader.efi ''esp''/EFI/Boot/bootx64.efi |
||
+ | Platform key: |
||
− | Windows にしか対応しない非協力的な UEFI 実装の場合、{{ic|PreLoader.efi}} を Windows で使用されるデフォルトローダーの場所にコピーしてください: |
||
+ | $ openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days ''3650'' -subj "/CN=''my Platform Key''/" -out PK.crt |
||
− | # mkdir -p ''esp''/EFI/Microsoft/Boot |
||
+ | $ openssl x509 -outform DER -in PK.crt -out PK.cer |
||
− | # cp /usr/share/preloader-signed/PreLoader.efi ''esp''/EFI/Microsoft/Boot/bootmgfw.efi |
||
+ | $ 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 を削除できるようにするために空のファイルを署名してください: |
||
− | {{Note|Windows とデュアルブートする場合、元の {{ic|bootmgfw.efi}} はバックアップしておいてください。ファイルを置き換えると Windows のアップデートで問題が発生する可能性があります。}} |
||
+ | $ sign-efi-sig-list -g "$(< GUID.txt)" -c PK.crt -k PK.key PK /dev/null rm_PK.auth |
||
− | 上と同じように、{{ic|HashTool.efi}} と {{ic|loader.efi}} を {{ic|''esp''/EFI/Microsoft/Boot}} にコピーしてください。 |
||
+ | Key Exchange Key: |
||
− | Secure Boot を有効にした状態でシステムを起動したら、上のセクションの手順に従って {{ic|loader.efi}} と {{ic|/vmlinuz-linux}} (あるいは使用している他のカーネルイメージ) を登録します。 |
||
+ | $ openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days ''3650'' -subj "/CN=''my Key Exchange Key''/" -out KEK.crt |
||
− | ==== PreLoader の削除 ==== |
||
+ | $ 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: |
||
− | {{Note|以下を実行する前にバックアップを作成すると良いでしょう。}} |
||
+ | $ openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days ''3650'' -subj "/CN=''my Signature Database key''/" -out db.crt |
||
− | インストールした {{AUR|preloader-signed}} パッケージやコピーしたファイルを削除して、設定を元に戻します。[[systemd-boot]] の場合、以下を実行: |
||
+ | $ 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 |
||
+ | ===== ヘルパースクリプト ===== |
||
− | # rm ''esp''/EFI/systemd/{PreLoader,HashTool}.efi |
||
− | # rm ''esp''/EFI/systemd/loader.efi |
||
− | # efibootmgr -b ''N'' -B |
||
− | # bootctl update |
||
+ | 便利なヘルパースクリプトがこのトピックの参照メージの著者により提供されています[https://www.rodsbooks.com/efi-bootloaders/controlling-sb.html#creatingkeys]([[python]] が必要です)。簡単に編集されたバージョンも {{AUR|sbkeys}} としてパッケージングされています。 |
||
− | {{ic|N}} は {{ic|PreLoader.efi}} を起動するために作成した NVRAM のブートエントリに置き換えてください。{{ic|efibootmgr}} コマンドで確認を行なって、必要に応じてブート順序を修正してください。 |
||
+ | スクリプトを使うには、安全な場所にフォルダを作成し(例えば、後で {{AUR|sbupdate-git}} を使って unified カーネルイメージを作成し署名する予定なのであれば {{ic|/etc/efi-keys/}})、スクリプトを実行してください: |
||
− | {{Note|上記のコマンドは一番簡単な場合です。他のファイルを作成した場合はそれらも削除する必要があります。}} |
||
+ | # mkdir /etc/efi-keys |
||
− | === shim === |
||
+ | # cd !$ |
||
+ | # curl -L -O https://www.rodsbooks.com/efi-bootloaders/mkkeys.sh |
||
+ | # chmod +x mkkeys.sh |
||
+ | # ./mkkeys.sh |
||
+ | <鍵に埋め込む Common Name を入力(例: "Secure Boot")> |
||
+ | これは様々な形式で必要なファイルを生成します。 |
||
− | 起動時に shim は {{ic|grubx64.efi}} を実行しようとします。MokList に {{ic|grubx64.efi}} のハッシュあるいは署名鍵が存在しない場合、shim は {{ic|mmx64.efi}} を起動します。MokManager で起動したい EFI バイナリ ([[ブートローダー]] ({{ic|grubx64.efi}}) とカーネル) のハッシュか署名鍵を登録する必要があります。 |
||
+ | ===== 鍵をアップデートする ===== |
||
− | {{Note|ハッシュを使用する場合、バイナリ (ブートローダーやカーネル) をアップデートするたびに新しいハッシュの登録が必要です。}} |
||
+ | 一度セキュアブートを "User Mode" にしたら、KEK, db, dbx を変更するには上位の鍵による署名が必要です。 |
||
− | ==== shim の設定 ==== |
||
+ | 例えば、db 鍵を新しいものに置き換えたい場合: |
||
− | {{AUR|shim-signed}} を[[インストール]]してください。 |
||
+ | # [[#鍵を作成する|新しい鍵を作成]] |
||
− | 使用している [[ブートローダー]]の名前を {{ic|grubx64.efi}} に変更してください: |
||
+ | # EFI 署名リストに変換 |
||
+ | # EFI 署名リストに署名 |
||
+ | # 署名された証明書アップデートファイルを登録 |
||
+ | $ cert-to-efi-sig-list -g "$(< GUID.txt)" ''new_db''.crt ''new_db''.esl |
||
− | # mv ''esp''/EFI/BOOT/BOOTX64.efi ''esp''/EFI/BOOT/grubx64.efi |
||
+ | $ sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db ''new_db''.esl ''new_db''.auth |
||
+ | db 鍵を置き換えるかわりに Signature Database に別の鍵を'''追加'''したい場合、{{ic|-a}} オプションを使う必要があります ({{man|1|sign-efi-sig-list}} を参照): |
||
− | ''shim'' と ''MokManager'' を ESP のブートローダーディレクトリにコピーします。ブートローダーの元の名前を {{ic|shimx64.efi}} の名前として使います: |
||
+ | $ sign-efi-sig-list '''-a''' -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db ''new_db''.esl ''new_db''.auth |
||
− | # cp /usr/share/shim-signed/shimx64.efi ''esp''/EFI/BOOT/BOOTX64.efi |
||
− | # cp /usr/share/shim-signed/mmx64.efi ''esp''/EFI/BOOT/ |
||
+ | {{ic|''new_db''.auth}} が作成されたら[[#ファームウェアに鍵を登録する|登録]]してください。 |
||
− | ''shim'' は Machine Owner Key と MokList に保存されたハッシュでバイナリを認証できます: |
||
− | + | ==== EFI バイナリに署名する ==== |
|
− | ; ハッシュ: EFI バイナリの SHA256 ハッシュ。 |
||
+ | ''セキュアブート''を有効化(つまり "User Mode" に)すると、署名した EFI バイナリ(例: アプリケーション、[[Unified Extensible Firmware Interface#UEFI ドライバ|ドライバ]]、[[Unified カーネルイメージ]])しか起動できなくなります。 |
||
− | ハッシュを使うほうが簡単ですが、ブートローダーやカーネルのアップデートのたびに MokManager でハッシュを追加する必要があります。MOK を使用する場合、鍵の追加は一度だけですが、ブートローダーやカーネルをアップデートするたびに署名が必要です。 |
||
− | ===== |
+ | ===== sbsigntools を使って手動で行う ===== |
+ | {{Pkg|sbsigntools}} を[[インストール]]して、{{man|1|sbsign}} で EFI バイナリに署名してください。 |
||
− | ''shim'' は MokList に {{ic|grubx64.efi}} の SHA256 ハッシュが存在しない場合、{{ic|mmx64.efi}} を起動します。 |
||
+ | {{Tip| |
||
− | ''MokManager'' で ''Enroll hash from disk'' を選択してから {{ic|grubx64.efi}} を探して MokList に追加してください。同じようにカーネルの {{ic|vmlinuz-linux}} も追加してください。完了したら ''Continue boot'' を選択してください。ブートローダーが起動してカーネルが起動します。 |
||
+ | * バイナリが署名されたかどうか確認したり署名を一覧表示したりするには: {{ic|$ sbverify --list ''/path/to/binary''}}。 |
||
+ | * [[rEFInd]] ブートマネージャの {{ic|refind-install}} スクリプトで rEFInd EFI バイナリを署名し、[[ESP]] へ db 証明書と一緒にコピーできます。手順は [[rEFInd#自分の鍵を使う]] を見てください。 |
||
+ | }} |
||
+ | {{Note|''sbsign'' を {{ic|--output}} 無しで実行すると、出力されるファイルは {{ic|''filename''.signed}} となります。詳細は {{man|1|sbsign}} を見てください。}} |
||
− | ===== shim で鍵を使う ===== |
||
+ | カーネルとブートマネージャに署名するには、''sbsign'' を使用してください。例えば: |
||
− | {{Pkg|sbsigntools}} をインストールしてください。 |
||
+ | # 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 |
||
+ | {{Warning|カーネル以外を署名しなかったら initramfs を改ざんから守ることはできません。''sbsign'' で手動で署名できる結合イメージを生成する方法は [[Unified カーネルイメージ]] を見てください。}} |
||
− | ; {{ic|.key}}: EFI バイナリに署名するための PEM 形式の''秘密''鍵。 |
||
− | ; {{ic|.crt}}: ''sbsign'' で使うための PEM 形式の証明書。 |
||
− | ; {{ic|.cer}}: ''MokManager'' で使うための DER 形式の証明書。 |
||
+ | ===== pacman フックでカーネルに署名する ===== |
||
− | Machine Owner Key を作成: |
||
+ | mkinitcpio の [[pacman フック]]を使って、インストール時とアップデート時にカーネルに署名することもできます。 |
||
− | $ 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 |
||
+ | {{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}} にコピーしてください。 |
||
− | ({{ic|grubx64.efi}} という名前の) ブートローダーとカーネルに署名: |
||
+ | {{ic|/etc/pacman.d/hooks/90-mkinitcpio-install.hook}} 内の |
||
− | # 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 |
||
+ | Exec = /usr/share/libalpm/scripts/mkinitcpio-install |
||
− | ブートローダーとカーネルをアップデートするたびに上記の署名が必要です。 |
||
+ | を |
||
− | {{ic|MOK.cer}} を FAT でフォーマットされたファイルシステムにコピーしてください ([[EFI System Partition]] を使うことができます)。 |
||
+ | Exec = /usr/local/share/libalpm/scripts/mkinitcpio-install |
||
− | 再起動してセキュアブートを有効にしてください。''shim'' は MokList に {{ic|grubx64.efi}} を署名するときに使った証明書がない場合、{{ic|mmx64.efi}} を起動します。 |
||
+ | に置き換えてください。 |
||
− | ''MokManager'' で ''Enroll key from disk'' を選択してから {{ic|MOK.cer}} を探して MokList に追加してください。完了したら ''Continue boot'' を選択してください。ブートローダーが起動して、Machine Owner Key で署名されたバイナリを起動できるようになります。 |
||
+ | {{ic|/usr/local/share/libalpm/scripts/mkinitcpio-install}} 内の |
||
− | ==== shim の削除 ==== |
||
+ | install -Dm644 "${line}" "/boot/vmlinuz-${pkgbase}" |
||
− | {{AUR|shim-signed}} を[[アンインストール]]して、コピーした ''shim'' と ''MokManager'' のファイルを削除してブートローダーを元の名前に戻してください。 |
||
+ | |||
+ | を |
||
+ | |||
+ | sbsign --key ''/path/to/''db.key --cert ''/path/to/''db.crt --output "/boot/vmlinuz-${pkgbase}" "${line}" |
||
+ | |||
+ | に置き換えてください。 |
||
+ | |||
+ | systemd-boot を使用している場合、この作業を半自動的に行う[[systemd-boot#自動で更新|専用の pacman フック]]が存在します。 |
||
+ | |||
+ | ===== sbupdate による完全に自動化された unified カーネルの生成と署名 ===== |
||
+ | |||
+ | [https://github.com/andreyv/sbupdate sbupdate] は、Arch Linux で unified カーネルイメージの生成と署名を自動化するために特別に作られたツールです。このツールは、[[pacman フック]]を通してカーネルのインストール・削除・アップデートを処理します。 |
||
+ | |||
+ | {{AUR|sbupdate-git}} をインストールして、プロジェクトのホームページにある手順に従って設定してください。[https://github.com/andreyv/sbupdate#sbupdate] |
||
+ | |||
+ | {{Tip|[[systemd-boot]] を使用している場合、設定の必要とせずにに署名済みのカーネルイメージを直接認識させるために {{ic|1=OUT_DIR="EFI/Linux"}} を設定してください。{{man|7|systemd-boot|FILES}} と [[Systemd-boot#ローダーの追加]] を参照してください。}} |
||
+ | |||
+ | 設定したら、イメージを生成するために {{ic|sbupdate}} を root として実行してください。 |
||
+ | |||
+ | {{Note|''sbupdate'' の出力にはしばしばエラーを含んでいます(例えば {{ic|warning: data remaining[26413568 vs 26423180]: gaps between PE/COFF sections?}})。これらは無害で、安全に無視できます。[https://github.com/andreyv/sbupdate/issues/30]}} |
||
+ | |||
+ | ==== ファームウェアを "Setup Mode" にする ==== |
||
+ | |||
+ | Platform Key が削除されると、セキュアブートは Setup Mode になります。ファームウェアを Setup Mode にするには、ファームウェア設定ユーティリティに入り、証明書を削除/クリアするオプションを探してください。設定ユーティリティに入る方法は [[#OS の起動前]] で説明されています。 |
||
+ | |||
+ | ==== ファームウェアに鍵を登録する ==== |
||
+ | |||
+ | '''db'''、'''KEK'''、'''PK''' 証明書を登録するには、以下に述べる方法のうち1つを使ってください。 |
||
+ | |||
+ | {{Tip|'''dbx''' (forbidden signatures db) は空なので、以下の手順では省いても安全です。}} |
||
+ | |||
+ | {{Warning|Platform Key を登録するとセキュアブートは "Setup Mode" から "User Mode" になります。なので、Platform Key は最後に登録する必要があります。}} |
||
+ | |||
+ | ===== sbkeysync を使う ===== |
||
+ | |||
+ | {{Pkg|sbsigntools}} をインストールしてください。そして、以下のディレクトリ構造を持つ {{ic|/etc/secureboot/keys}} ディレクトリを作成してください: |
||
+ | |||
+ | /etc/secureboot/keys |
||
+ | ├── db |
||
+ | ├── dbx |
||
+ | ├── KEK |
||
+ | └── PK |
||
+ | |||
+ | 例えば、以下のように: |
||
+ | |||
+ | # mkdir -p /etc/secureboot/keys/{db,dbx,KEK,PK} |
||
+ | |||
+ | そして、先程生成した ''.auth'' ファイルをそれぞれの場所にコピーしてください(例えば、{{ic|PK.auth}} は {{ic|/etc/secureboot/keys/PK}} へといった感じです)。 |
||
+ | |||
+ | {{ic|sbkeysync}} がシステムの UEFI に加える変更を確認したい場合は、以下を使用してください: |
||
+ | |||
+ | # sbkeysync --pk --dry-run --verbose |
||
+ | |||
+ | 最後に、{{ic|sbkeysync}} を使って鍵を登録してください。 |
||
+ | |||
+ | # sbkeysync --verbose |
||
+ | # sbkeysync --verbose --pk |
||
− | == 自分で署名した鍵を使う == |
||
{{Tip| |
{{Tip| |
||
+ | * {{ic|sbkeysync}} で書き込みエラーが発生した場合、{{ic|sbkeysync}} のコマンドの前にまず {{ic|1=chattr -i /sys/firmware/efi/efivars/{PK,KEK,db}*}} を実行して、ファイルの属性を一時的に変更してください。これで、{{ic|efivars}} ディレクトリ内の EFI 鍵を書き込むことができます。{{man|1|chattr}} を参照してください。 |
||
− | * [http://www.rodsbooks.com/efi-bootloaders/controlling-sb.html Rod Smith's Controlling Secure Boot] を読むことを推奨します。 |
||
+ | * {{ic|PK.auth}} で {{ic|permission denied}} エラーが発生する場合、次のコマンドでその鍵を登録できます: {{ic|efi-updatevar -f /etc/secureboot/keys/PK/PK.auth PK}} |
||
− | * {{AUR|cryptboot}} パッケージに含まれている {{ic|cryptboot-efikeys}} スクリプトを使うことで鍵の作成・登録・ブートローダーの署名・署名の検証が簡単に行なえます。}} |
||
+ | }} |
||
+ | 次の起動時に、UEFI は User Mode に戻り、セキュアブートポリシーを強制するはずです。 |
||
− | Secure Boot では以下の鍵が使われます: |
||
− | ;Platform Key (PK): トップレベル鍵 |
||
− | ;Key Exchange Key (KEK): 署名データベースや EFI バイナリに署名するのに使われる鍵 |
||
− | ;Signature Database (db): EFI バイナリに署名するのに使われる鍵やハッシュが含まれます |
||
− | ;Forbidden Signatures Database (dbx): EFI バイナリをブラックリスト化するのに使われる鍵やハッシュが含まれます |
||
+ | ===== ファームウェアのセットアップユーティリティを使う ===== |
||
− | 詳しい説明は [https://blog.hansenpartnership.com/the-meaning-of-all-the-uefi-keys/ The Meaning of all the UEFI Keys] を見てください。 |
||
+ | [[FAT]] でフォーマットされたファイルシステムに {{ic|*.cer}}、{{ic|*.esl}}、{{ic|*.auth}} をすべてコピーしてください(このために [[EFI システムパーティション]]を使うことができます)。 |
||
− | === カスタム鍵 === |
||
+ | ファームウェアのセットアップユーティリティを起動し、'''db'''、'''KEK'''、'''PK''' 証明書を登録してください。ファームウェアのインターフェイスは様々です。鍵を登録する例は [https://www.rodsbooks.com/efi-bootloaders/controlling-sb.html#setuputil Replacing Keys Using Your Firmware's Setup Utility] を見てください。 |
||
− | Secure Boot を使用するには最低でも '''PK''', '''KEK''', '''db''' 鍵が必要です。KEK, db, dbx 証明書は複数追加できますが、Platform Key はひとつしか使えません。 |
||
− | + | 使用するツールがサポートしていれば、''.cer'' よりも ''.auth'' と ''.esl'' を使用することを推奨します。 |
|
− | === |
+ | ===== KeyTool を使う ===== |
+ | {{ic|KeyTool.efi}} は {{Pkg|efitools}} パッケージに含まれています。それを ESP にコピーしてください。鍵を登録した後にこのツールを使うには、{{ic|sbsign}} で署名してください。 |
||
− | 鍵を生成するには、{{Pkg|efitools}} の[[インストール]]が必要です。 |
||
+ | # sbsign --key db.key --cert db.crt --output ''esp''/KeyTool-signed.efi /usr/share/efitools/efi/KeyTool.efi |
||
− | 鍵と複数の形式の証明書を作成する必要があります: |
||
− | # 鍵を作成して {{ic|sbsign}} のための '''PEM''' 形式の証明書を作成 |
||
− | # ファームウェア用に証明書を '''DER''' 形式に変換 |
||
− | # {{ic|KeyTool}} のために証明書を '''EFI Signature List''' に変換 |
||
+ | ファームウェアのセットアップユーティリティかブートローダか [[Unified Extensible Firmware Interface#UEFI シェル|UEFI シェル]]を使って {{ic|KeyTool-signed.efi}} を起動して、鍵を登録してください。 |
||
− | ; {{ic|.key}}: EFI バイナリと EFI 署名リストの署名に必要な PEM 形式の''秘密''鍵。 |
||
− | ; {{ic|.crt}}: ''sbsign'' で必要な PEM 形式の証明書。 |
||
− | ; {{ic|.cer}}: ファームウェアが使用する DER 形式の証明書。 |
||
− | ; {{ic|.esl}}: ''KeyTool'' やファームウェアのための EFI 署名リストの証明書。 |
||
− | ; {{ic|.auth}}: ''KeyTool'' やファームウェアのための認証ヘッダが付いた EFI 署名リストの証明書 (署名済みの証明書アップデートファイル)。 |
||
+ | KeyTool メニューオプションの説明は [https://www.rodsbooks.com/efi-bootloaders/controlling-sb.html#keytool Replacing Keys Using KeyTool] を見てください。 |
||
− | 所有者を識別する [[Wikipedia:Globally unique identifier|GUID]] を作成: |
||
− | $ uuidgen --random > GUID.txt |
||
+ | ==== 他のオペレーティングシステムとデュアルブートする ==== |
||
− | Platform Key: |
||
− | $ openssl req -newkey rsa:2048 -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 |
||
+ | ===== Microsoft Windows ===== |
||
− | 空のファイルを使って "User Mode" で Platform Key を削除できるように署名: |
||
− | $ sign-efi-sig-list -g "$(< GUID.txt)" -c PK.crt -k PK.key PK /dev/null rm_PK.auth |
||
+ | {{Expansion|Is it possible to boot Windows by signing its bootloader with a [[#Creating keys|custom key]]?|section=Booting Windows with custom bootloader signature}} |
||
− | Key Exchange Key: |
||
− | $ openssl req -newkey rsa:2048 -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 |
||
+ | [[Windows と Arch のデュアルブート|Windows のデュアルブート]]をするには、Microsoft の証明書を Signature Database に追加する必要があります。[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つの db 証明書を用意しています]: |
||
− | Signature Database: |
||
− | $ openssl req -newkey rsa:2048 -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 |
||
+ | * [https://www.microsoft.com/pkiops/certs/MicWinProPCA2011_2011-10-19.crt Microsoft Windows Production PCA 2011] (Windows 用) |
||
− | ==== 鍵のアップデート ==== |
||
+ | * [https://www.microsoft.com/pkiops/certs/MicCorUEFCA2011_2011-06-27.crt Microsoft Corporation UEFI CA 2011] (UEFI ドライバーやオプション ROM などサードパーティ製のバイナリ用) |
||
+ | Microsoft の GUID ({{ic|77fa9abd-0359-4d32-bd60-28f4e78f784b}}) を使って EFI 署名リストを作成してひとつのファイルにまとめます: |
||
− | 一度 Secure Boot を "User Mode" にしたら KEK, db, dbx を変更するには上位の鍵による署名が必要です。 |
||
+ | $ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_db.esl MicWinProPCA2011_2011-10-19.crt |
||
− | 例えば、db 鍵を新しく置き換えたい場合: |
||
+ | $ 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 アップデートに署名してください。{{ic|sign-efi-sig-list}} に {{ic|-a}} オプションを付けて db 証明書を'''追加'''します(置き換えるのではありません): |
||
− | # [[#鍵の作成|新しい鍵を作成]] |
||
− | # EFI 署名リストに変換 |
||
− | # EFI 署名リストに署名 |
||
− | # 署名された証明書アップデートファイルを登録 |
||
− | $ |
+ | $ 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 -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db ''new_db''.esl ''new_db''.auth |
||
+ | [[#ファームウェアに鍵を登録する]]に従って {{ic|add_MS_db.auth}} を Signature Database に追加してください。 |
||
− | db 鍵を置き換えるかわりに Signature Database に別の鍵を追加したい場合、{{ic|-a}} オプションを使う必要があります ({{man|1|sign-efi-sig-list}} を参照): |
||
+ | === 署名済みのブートローダを使う === |
||
− | $ sign-efi-sig-list '''-a''' -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db ''new_db''.esl ''new_db''.auth |
||
+ | 署名済みのブートローダーを使うというのは Microsoft の鍵で署名されたブートローダーを使うということです。署名済みのブートローダーとしては PreLoader と shim が存在します。どちらも他の EFI バイナリ (通常の[[ブートローダー]]) をチェインロードします。Microsoft は未署名のあらゆるバイナリを自動起動するブートローダーに署名しないことになっているため、PreLoader と shim は Machine Owner Key リストと呼ばれるホワイトリストを使っています。バイナリの SHA256 ハッシュあるいはバイナリの署名鍵が MokList に存在する場合、バイナリが起動されますが、存在しない場合はハッシュや鍵を登録するための鍵管理ユーティリティが起動します。 |
||
− | {{ic|''new_db''.auth}} が作成されたら[[#ファームウェアに鍵を登録|登録]]してください。 |
||
+ | ==== PreLoader ==== |
||
− | === ブートローダーとカーネルの署名 === |
||
+ | 起動時に PreLoader は {{ic|loader.efi}} を実行しようとします。MokList に {{ic|loader.efi}} のハッシュが存在しない場合、PreLoader は {{ic|HashTool.efi}} を起動します。HashTool で起動したい EFI バイナリのハッシュ、つまり[[ブートローダー]] ({{ic|loader.efi}}) とカーネルを登録する必要があります。 |
||
− | Secure Boot を有効にすると ("User Mode")、署名したバイナリしか起動できなくなるため、カーネルと[[ブートローダー]]に署名が必要です。 |
||
+ | {{Note|バイナリ (ブートローダーやカーネル) をアップデートするたびに新しいハッシュの登録が必要です。}} |
||
− | {{Pkg|sbsigntools}} をインストールしてください。 |
||
+ | {{Tip|[[rEFInd]] ブートマネージャの {{ic|refind-install}} スクリプトは rEFInd と PreLoader EFI バイナリを ESP にコピーできます。手順は [[rEFInd#PreLoader を使う]] を見てください。}} |
||
− | {{Note|{{ic|--output}} を付けずに ''sbsign'' を実行すると作成されるファイルは {{ic|''filename''.signed}} となります。詳しくは {{man|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 |
||
+ | ===== PreLoader をセットアップする ===== |
||
− | {{Tip| |
||
+ | |||
− | * バイナリが署名されたかどうか確認するには: {{ic|$ sbverify --list ''/path/to/binary''}}。 |
||
+ | {{Note|{{Pkg|efitools}} パッケージに含まれている {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} は署名されていないため、使い道は限られています。署名済みの {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} を入手するには {{AUR|preloader-signed}} をインストールするか [https://blog.hansenpartnership.com/linux-foundation-secure-boot-system-released/ 手動でダウンロード] します。}} |
||
− | * {{AUR|sbupdate-git}} を使うことでアップデート時にカーネルを自動的に署名できます。保護されていない initramfs とカーネルコマンドラインが署名済みの UEFI イメージに組み込まれてしまう可能性があるため注意してください。 |
||
+ | |||
+ | {{AUR|preloader-signed}} パッケージを[[インストール]]して {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} を[[ブートローダー]]のディレクトリにコピーしてください。[[systemd-boot]] の場合、以下を実行: |
||
+ | |||
+ | # cp /usr/share/preloader-signed/{PreLoader,HashTool}.efi ''esp''/EFI/systemd |
||
+ | |||
+ | そしてブートローダーのバイナリをコピーして {{ic|loader.efi}} に名前を変更します。[[systemd-boot]] の場合、以下を実行: |
||
+ | |||
+ | # cp ''esp''/EFI/systemd/systemd-bootx64.efi ''esp''/EFI/systemd/loader.efi |
||
+ | |||
+ | 最後に、{{ic|PreLoader.efi}} を起動する NVRAM エントリを新しく作成してください: |
||
+ | |||
+ | # efibootmgr --verbose --disk /dev/sd'''''X''''' --part '''''Y''''' --create --label "PreLoader" --loader /EFI/systemd/PreLoader.efi |
||
+ | |||
+ | {{ic|X}} は [[EFI システムパーティション]]のドライブ文字に、{{ic|Y}} は同じくパーティション番号に置き換えてください。 |
||
+ | |||
+ | 上記のエントリは起動リストの一番最初に追加する必要があります。{{ic|efibootmgr}} コマンドで確認して、必要であればブートローダーの設定を変更してください。 |
||
+ | |||
+ | ====== フォールバック ====== |
||
+ | |||
+ | カスタム NVRAM エントリの起動に問題が発生する場合、{{ic|HashTool.efi}} と {{ic|loader.efi}} を UEFI によって自動的に起動されるデフォルトのブートローダーの場所にコピーしてください: |
||
+ | |||
+ | # cp /usr/share/preloader-signed/HashTool.efi ''esp''/EFI/BOOT/ |
||
+ | # cp ''esp''/EFI/systemd/systemd-bootx64.efi ''esp''/EFI/BOOT/loader.efi |
||
+ | |||
+ | {{ic|PreLoader.efi}} をコピーして名前を変更します: |
||
+ | |||
+ | # cp /usr/share/preloader-signed/PreLoader.efi ''esp''/EFI/BOOT/BOOTx64.EFI |
||
+ | |||
+ | Windows にしか対応しない非協力的な UEFI 実装の場合、{{ic|PreLoader.efi}} を Windows で使用されるデフォルトローダーの場所にコピーしてください: |
||
+ | |||
+ | # mkdir -p ''esp''/EFI/Microsoft/Boot |
||
+ | # cp /usr/share/preloader-signed/PreLoader.efi ''esp''/EFI/Microsoft/Boot/bootmgfw.efi |
||
+ | |||
+ | {{Note|Windows とデュアルブートする場合、元の {{ic|bootmgfw.efi}} はバックアップしておいてください。ファイルを置き換えると Windows のアップデートで問題が発生する可能性があります。}} |
||
+ | |||
+ | 上と同じように、{{ic|HashTool.efi}} と {{ic|loader.efi}} を {{ic|''esp''/EFI/Microsoft/Boot}} にコピーしてください。 |
||
+ | |||
+ | セキュアブートを有効にした状態でシステムを起動したら、上のセクションの手順に従って {{ic|loader.efi}} と {{ic|/vmlinuz-linux}} (あるいは使用している他のカーネルイメージ) を登録します。 |
||
+ | |||
+ | ===== 起動途中で使用するには? ===== |
||
+ | |||
+ | {{ic|Failed to Start loader... I will now execute HashTool.}} というメッセージが表示されるでしょう。{{ic|loader.efi}} と {{ic|vmlinuz.efi}} のハッシュを登録するために HashTool を使用するには、以下の手順を踏んでください。以下の手順では、リマスタリングされた archiso インストールメディアのタイトルについて仮定をおいています。実際のタイトルはブートローダのセットアップに依存します。 |
||
+ | |||
+ | * ''OK'' を選択してください |
||
+ | * HashTool のメインメニューで、''Enroll Hash'' を選択し、{{ic|\loader.efi}} を選んで ''Yes'' で確定してください。再び ''Enroll Hash'' と {{ic|archiso}} を選択し archiso のディレクトリに入って、{{ic|vmlinuz.efi}} を選択し、''Yes'' で確定してください。そして、''Exit'' を選択してブートデバイスの選択メニューに戻ってください。 |
||
+ | * ブートデバイスの選択メニューで、''Arch Linux archiso x86_64 UEFI CD'' を選んでください。 |
||
+ | |||
+ | ===== PreLoader を除去する ===== |
||
+ | |||
+ | {{Note|以下を実行する前にバックアップを作成すると良いでしょう。}} |
||
+ | |||
+ | {{AUR|preloader-signed}} を[[アンインストール]]し、コピーしたファイルを削除して、設定を元に戻します。[[systemd-boot]] の場合、以下を実行: |
||
+ | |||
+ | # rm ''esp''/EFI/systemd/{PreLoader,HashTool}.efi |
||
+ | # rm ''esp''/EFI/systemd/loader.efi |
||
+ | # efibootmgr --verbose --bootnum ''N'' --delete-bootnum |
||
+ | # bootctl update |
||
+ | |||
+ | {{ic|N}} は {{ic|PreLoader.efi}} を起動するために作成した NVRAM のブートエントリに置き換えてください。{{ic|efibootmgr}} コマンドで確認を行なって、必要に応じてブート順序を修正してください。 |
||
+ | |||
+ | {{Note|上記のコマンドは一番簡単な場合です。他にもファイルを作成したり、コピーしたり、ファイル名を変更したり、編集したりした場合、おそらくそれらも処理する必要があります。PreLoader をブートエントリとして使用していた場合、明らかに[[#セキュアブートを無効化する]]必要もあります。 |
||
}} |
}} |
||
− | ==== |
+ | ===== 登録したハッシュを削除する ===== |
+ | MOK データベースに登録されたハッシュのエントリは NVRAM の容量を少し圧迫します。空き容量を増やしたり、時代遅れなプログラムが起動しないようにしたりするために、場合によっては使用しないハッシュを削除する必要があるでしょう。 |
||
− | pacman フックを使ってカーネルのインストール・アップデート時に署名することも可能です。 |
||
+ | {{Pkg|efitools}} を[[インストール]]し、{{ic|KeyTool.efi}} をコピーしてください: |
||
− | {{hc|/etc/pacman.d/hooks/99-secureboot.hook|2= |
||
− | [Trigger] |
||
− | Operation = Install |
||
− | Operation = Upgrade |
||
− | Type = Package |
||
− | Target = linux |
||
+ | # cp /usr/share/efitools/efi/KeyTool.efi ''esp''/EFI/systemd/KeyTool.efi |
||
− | [Action] |
||
+ | |||
− | Description = Signing Kernel for SecureBoot |
||
+ | PreLoader を起動するよう設定すれば、KeyTool のエントリが現れます。これで、MOK データベース内のハッシュを編集することができます。 |
||
− | When = PostTransaction |
||
+ | |||
− | Exec = /usr/bin/sbsign --key db.key --cert db.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux |
||
+ | ==== shim ==== |
||
− | Depends = sbsigntools |
||
+ | |||
+ | {{Expansion|Testing needed.|section=shim}} |
||
+ | |||
+ | 起動時に shim は {{ic|grubx64.efi}} を実行しようとします。MokList に {{ic|grubx64.efi}} のハッシュあるいは署名鍵が存在しない場合、shim は {{ic|mmx64.efi}} を起動します。MokManager で起動したい EFI バイナリ ([[ブートローダー]] ({{ic|grubx64.efi}}) とカーネル) のハッシュか署名鍵を登録する必要があります。 |
||
+ | |||
+ | {{Note| |
||
+ | * [[#shim でハッシュを使う]] を使う場合、バイナリ(例: ブートローダやカーネル)を更新するたびに、新しいハッシュをを登録する必要があります。 |
||
+ | * バージョン 15.3 以降、shim は、有効な {{ic|.sbat}} セクションが無いと EFI バイナリを起動しません。EFI バイナリが {{ic|.sbat}} セクションを持っているか確認するには、{{ic|objdump -j .sbat -s ''/path/to/binary.efi''}} を実行してください。詳細は [https://github.com/rhboot/shim/blob/main/SBAT.md SBAT ドキュメント] を見てください。 |
||
+ | * セキュアブートがもたらすセキュリティには興味がなく、Windows 11 の要件のためだけにセキュアブートを有効化する場合、{{ic|mokutil --disable-validation}} で shim の認証プロセスを無効化すると良いかもしれません。その場合、grub(sbat は依然として必要でしょう)やカーネルイメージを署名する必要はありません。それと同時に、grub の {{ic|chainloader}} で Windows を起動することができます。 |
||
}} |
}} |
||
− | === |
+ | ===== shim をセットアップする ===== |
+ | {{Tip|[[rEFInd]] ブートマネージャの {{ic|refind-install}} スクリプトは rEFInd EFI バイナリを署名することができ、shim や MOK 証明書と一緒にバイナリを ESP にコピーできます。手順は [[rEFInd#shim を使う]] を見てください。}} |
||
− | Platform Key を削除するとき Secure Boot は Setup Mode になります。ファームウェアを Setup Mode にするには、ファームウェアのセットアップユーティリティを起動して証明書を削除・消去するオプションを探して下さい。 |
||
+ | {{AUR|shim-signed}} を[[インストール]]してください。 |
||
− | === ファームウェアに鍵を登録 === |
||
+ | 現在の[[ブートローダー]]の名前を {{ic|grubx64.efi}} に変更してください: |
||
− | {{ic|*.cer}}, {{ic|*.esl}}, {{ic|*.auth}} を全て FAT でフォーマットされたファイルシステムにコピーしてください ([[EFI システムパーティション]]を使うことができます)。 |
||
+ | # mv ''esp''/EFI/BOOT/BOOTx64.EFI ''esp''/EFI/BOOT/grubx64.efi |
||
− | ファームウェアのセットアップユーティリティあるいは KeyTool を起動して '''db''', '''KEK''', '''PK''' 証明書を登録してください。 |
||
+ | ''shim'' と ''MokManager'' を ESP 上のブートローダーのディレクトリにコピーしてください; {{ic|shimx64.efi}} はブートローダの以前のファイル名を使ってください: |
||
− | 使用しているツールが {{ic|.auth}} や {{ic|.esl}} をサポートしている場合 {{ic|.cer}} よりも優先して使って下さい。 |
||
+ | {{Note| |
||
− | {{Warning|Platform Key を登録すると Secure Boot が "User Mode" になるため、Platform Key は最後に登録してください。}} |
||
+ | * 有効な 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/ |
||
+ | 最後に、{{ic|BOOTx64.EFI}} を起動する新しい NVRAM エントリを作成してください: |
||
− | ファームウェアには様々なインターフェイスがあります。鍵を登録する例が [http://www.rodsbooks.com/efi-bootloaders/controlling-sb.html#setuputil Replacing Keys Using Your Firmware's Setup Utility] に載っています。 |
||
+ | # efibootmgr --verbose --disk /dev/sd'''''X''''' --part '''''Y''''' --create --label "Shim" --loader /EFI/BOOT/BOOTx64.EFI |
||
− | ==== KeyTool を使う ==== |
||
+ | ''shim'' は、MokList に格納されている Machine Owner Key やハッシュによってバイナリを認証することができます。 |
||
− | {{ic|KeyTool.efi}} は {{Pkg|efitools}} パッケージに含まれているので、ESP にコピーしてください。鍵を登録した後に使用するには、{{ic|sbsign}} で署名する必要があります: |
||
+ | ; Machine Owner Key (MOK): EFI バイナリに署名するためにユーザが生成し利用する鍵 |
||
− | # sbsign --key db.key --cert db.crt --output ''esp''/EFI/KeyTool-signed.efi /usr/share/efitools/efi/KeyTool.efi |
||
+ | ; hash: EFI バイナリの SHA256 ハッシュ |
||
+ | ハッシュを用いるのは単純ですが、ブートローダやカーネルをアップデートするたびに、MokManager 内のそれらのハッシュを追加する必要があります。MOK では鍵を一度追加するだけで済みますが、ブートローダとカーネルをアップデートするたびに、それらに署名する必要があります。 |
||
− | ファームウェアのセットアップユーティリティやブートローダー、あるいは [[Unified Extensible Firmware Interface#UEFI シェル|UEFI シェル]]で {{ic|KeyTool-signed.efi}} を起動して鍵を登録してください。 |
||
+ | ====== shim でハッシュを使う ====== |
||
− | KeyTool のメニューオプションの解説は [http://www.rodsbooks.com/efi-bootloaders/controlling-sb.html#keytool Replacing Keys Using KeyTool] を参照。 |
||
+ | ''shim'' は、MokList に {{ic|grubx64.efi}} の SHA256 ハッシュが存在しない場合、{{ic|mmx64.efi}} を起動します。 |
||
− | === 他のオペレーティングシステムとのデュアルブート === |
||
+ | ''MokManager'' で ''Enroll hash from disk'' を選択してから {{ic|grubx64.efi}} を探して MokList に追加してください。同じようにカーネルの {{ic|vmlinuz-linux}} も追加してください。完了したら ''Continue boot'' を選択してください。ブートローダーが起動してカーネルが起動します。 |
||
− | ==== Microsoft Windows ==== |
||
+ | ====== shim で鍵を使う ====== |
||
− | [[Windows と Arch のデュアルブート|Windows のデュアルブート]]をするには、Microsoft の証明書を Signature Database に追加する必要があります。Microsoft は2つの db 証明書を用意しています: |
||
+ | {{Pkg|sbsigntools}} をインストールしてください。 |
||
− | * [https://www.microsoft.com/pkiops/certs/MicWinProPCA2011_2011-10-19.crt Microsoft Windows Production PCA 2011] (Windows 用) |
||
− | * [https://www.microsoft.com/pkiops/certs/MicCorUEFCA2011_2011-06-27.crt Microsoft Corporation UEFI CA 2011] (UEFI ドライバーやオプション ROM などサードパーティ製のバイナリ用) |
||
+ | 以下のファイルが必要です: |
||
− | Microsoft の証明書は DER 形式なので、''openssl'' で PEM 形式に変換してください: |
||
+ | ; {{ic|.key}}: EFI バイナリに署名するための PEM 形式の''秘密''鍵。 |
||
− | $ openssl x509 -inform DER -outform PEM -in MicWinProPCA2011_2011-10-19.crt -out MicWinProPCA2011_2011-10-19.crt.pem |
||
+ | ; {{ic|.crt}}: ''sbsign'' で使うための PEM 形式の証明書。 |
||
− | $ openssl x509 -inform DER -outform PEM -in MicCorUEFCA2011_2011-06-27.crt -out MicCorUEFCA2011_2011-06-27.crt.pem |
||
+ | ; {{ic|.cer}}: ''MokManager'' で使うための DER 形式の証明書。 |
||
+ | Machine Owner Key を作成: |
||
− | Microsoft の GUID ({{ic|77fa9abd-0359-4d32-bd60-28f4e78f784b}}) を使って EFI 署名リストを作成してひとつのファイルにまとめます: |
||
+ | $ openssl req -newkey rsa:4096 -nodes -keyout MOK.key -new -x509 -sha256 -days ''3650'' -subj "/CN=''my Machine Owner Key''/" -out MOK.crt |
||
− | $ cert-to-efi-sig-list -g 77fa9abd-0359-4d32-bd60-28f4e78f784b MicWinProPCA2011_2011-10-19.crt.pem MS_Win_db.esl |
||
+ | $ openssl x509 -outform DER -in MOK.crt -out MOK.cer |
||
− | $ cert-to-efi-sig-list -g 77fa9abd-0359-4d32-bd60-28f4e78f784b MicCorUEFCA2011_2011-06-27.crt.pem MS_UEFI_db.esl |
||
− | $ cat MS_Win_db.esl MS_UEFI_db.esl > MS_db.esl |
||
+ | ({{ic|grubx64.efi}} という名前の) ブートローダーとカーネルに署名: |
||
− | KEK を使って db アップデートに署名してください。{{ic|sign-efi-sig-list}} に {{ic|-a}} オプションを付けて db 証明書を追加します: |
||
+ | # sbsign --key MOK.key --cert MOK.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux |
||
− | $ 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 |
||
+ | # sbsign --key MOK.key --cert MOK.crt --output ''esp''/EFI/BOOT/grubx64.efi ''esp''/EFI/BOOT/grubx64.efi |
||
+ | ブートローダーとカーネルをアップデートするたびに上記の署名が必要です。カーネルの署名は [[pacman フック]] で自動化できます。例えば: |
||
− | [[#ファームウェアに鍵を登録]]に従って {{ic|add_MS_db.auth}} を Signature Database に追加してください。 |
||
+ | |||
+ | {{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 |
||
+ | |||
+ | [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 |
||
+ | }} |
||
+ | |||
+ | {{ic|MOK.cer}} を FAT でフォーマットされたファイルシステムにコピーしてください ([[EFI システムパーティション]] を使うことができます)。 |
||
+ | |||
+ | 再起動してセキュアブートを有効にしてください。''shim'' は MokList に {{ic|grubx64.efi}} を署名するときに使った証明書がない場合、{{ic|mmx64.efi}} を起動します。 |
||
+ | |||
+ | ''MokManager'' で ''Enroll key from disk'' を選択してから {{ic|MOK.cer}} を探して MokList に追加してください。完了したら ''Continue boot'' を選択してください。ブートローダーが起動して、Machine Owner Key で署名されたバイナリを起動できるようになります。 |
||
+ | |||
+ | ====== shim で鍵と GRUB を使う ====== |
||
+ | |||
+ | まず、前のセクションの作業を完了してください。 |
||
+ | |||
+ | {{ic|TPM}} モージュールを有効化して {{ic|/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 を除去する ===== |
||
+ | |||
+ | {{AUR|shim-signed}} を[[アンインストール]]して、コピーした ''shim'' と ''MokManager'' のファイルを削除してブートローダーを元の名前に戻してください。 |
||
== セキュアブートを保護する == |
== セキュアブートを保護する == |
2022年7月15日 (金) 11:43時点における版
セキュアブートとは、UEFI 規格に含まれているセキュリティ機能であり、プリブートプロセスへの保護レイヤを追加するために設計されました。起動時の実行を許可または禁止されているバイナリの暗号署名されたリストを保持することにより、マシンのコアブートコンポーネント(ブートマネージャ、カーネル、initramfs)が改ざんされていないという信頼性を高めるのに役立ちます。
なので、セキュアブートは、コンピュータ環境をセキュアに保つ試みの一環、あるいはそれを補完するものであるとみなせます。システムの暗号化のような他のソフトウェアのセキュリティ対策では簡単にカバーできない攻撃面を減らしますが、完全に異なったものであり、それらに依存していません。セキュアブートは、独自の長所と短所を備えた、現在のセキュリティ慣例の一つの要素として独立しています。
目次
セキュアブートの状態を確認する
OS の起動前
OS の起動前にセキュアブートの状態を確認するには、ファームウェアのセットアップ画面を見る必要があります。すでにマシンが起動済みであれば、ほとんどの場合再起動する必要があります。
起動プロセス中に特別なキーを押すことでファームウェアのセットアップ画面にアクセスできます。どのキーかはファームウェアに依りますが、通常 Esc
、F2
、Del
、のどれかです。もしかすると、他のファンクションキーかもしれません。ファームウェアによっては、どのキー押すべきかが起動プロセスの開始時に短い時間表示されます。通常、マザーボードのマニュアルにキーが記載されています。マシンの電源を入れたらすぐに(スクリーンが表示されるよりも前に)キーを押して、そのまま押し続ける必要があるかもしれません。
ファームウェアのセットアップ画面に入ったら、意図せずに設定を変更してしまわないよう気をつけてください。通常、セットアップ画面の下部に案内指示や設定の短いヘルプがあります。セットアップ自体はいくつかのページから構成されているかもしれません。それらのページの中から正しい場所に移動する必要があります。設定は単に「セキュアブート」と表示されるかもしれません(これでオン/オフを設定できます)。
OS の起動後
systemd を使用するシステム上では、systemd-boot でセキュアブートの状態を簡単に確認できます:
$ 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]。
マシンがセキュアブートで起動されているかどうかを調べる他の方法は、以下のコマンドを使用することです:
$ 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 インストールメディアのセキュアブートサポートは 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.efi
と HashTool.efi
が使えます。他の手段としては、セキュアブートをサポートする他の GNU+Linux ディストリビューションのインストールメディアから BOOTx64.EFI
(shim) と grubx64.efi
を拝借するというものがあります。この場合、セキュアブートの認証チェーンは grubx64.efi
で途絶える必要がありますUbuntu の例)。そうすることで、GRUB は archiso の未署名のカーネルと initramfs を起動できます。気をつけるべきなのは、この時点でマシンの ESP にアクセス可能であると仮定していることです。しかし、OS の存在しないマシン上にインストールする際は、ESP が存在しません。この状況にどう対処すべきかは他の記事を参照してください(例えば Unified Extensible Firmware Interface#ISO から UEFI ブータブル USB を作成する)。
セキュアブートを実現する
セキュアブートの理想的なセットアップを実現するにはいくつか条件があります:
- UEFI がほぼ信頼されていて(しかし、いくつかのよく知られた批判と脆弱性[2]がある)、必ず強力なパスワードで保護されていること。
- メーカー/サードパーティーのデフォルトの鍵は、セキュアブートのセキュリティモデルを大幅に弱化させることが判明しているので、使用しないこと。[3]
- セキュアブートによって確立された信頼の鎖をブート中に維持して攻撃面を減らすために、マイクロコード(必要な場合)と initramfs を含む、ユーザ署名済み結合 EFISTUB カーネルイメージ(ブートマネージャ無し)を UEFI が直接ロードすること。
- マシンへ物理的にアクセスできる誰かが、カーネルイメージの作成と署名プロセスで使用されるツールとファイルにアクセスしたり改ざんしたりできないようにするために、ドライブの完全暗号化を使用すること。
- TPM を使うことでさらに改善することができるかもしれませんが、ツールやサポートの問題がこれを難しくしています。
シンプルかつ完全に自立したセットアップは #自分の鍵を使う で説明されています。一方、#署名済みのブートローダーを使う では、サードパーティにより署名された中間ツールを使用します。
自分で署名した鍵を使う
セキュアブートでは以下の鍵が使われます:
- 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) や sbkeysync、KeyTool、ファームウェアのための認証ヘッダが付いた 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 鍵を新しいものに置き換えたい場合:
- 新しい鍵を作成
- EFI 署名リストに変換
- EFI 署名リストに署名
- 署名された証明書アップデートファイルを登録
$ 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 バイナリに署名してください。
カーネルとブートマネージャに署名するには、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
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]
設定したら、イメージを生成するために sbupdate
を root として実行してください。
ファームウェアを "Setup Mode" にする
Platform Key が削除されると、セキュアブートは Setup Mode になります。ファームウェアを Setup Mode にするには、ファームウェア設定ユーティリティに入り、証明書を削除/クリアするオプションを探してください。設定ユーティリティに入る方法は #OS の起動前 で説明されています。
ファームウェアに鍵を登録する
db、KEK、PK 証明書を登録するには、以下に述べる方法のうち1つを使ってください。
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
次の起動時に、UEFI は User Mode に戻り、セキュアブートポリシーを強制するはずです。
ファームウェアのセットアップユーティリティを使う
FAT でフォーマットされたファイルシステムに *.cer
、*.esl
、*.auth
をすべてコピーしてください(このために EFI システムパーティションを使うことができます)。
ファームウェアのセットアップユーティリティを起動し、db、KEK、PK 証明書を登録してください。ファームウェアのインターフェイスは様々です。鍵を登録する例は Replacing Keys Using Your Firmware's Setup Utility を見てください。
使用するツールがサポートしていれば、.cer よりも .auth と .esl を使用することを推奨します。
KeyTool を使う
KeyTool.efi
は efitools パッケージに含まれています。それを 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 Windows Production PCA 2011 (Windows 用)
- Microsoft Corporation UEFI CA 2011 (UEFI ドライバーやオプション ROM などサードパーティ製のバイナリ用)
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
) とカーネルを登録する必要があります。
PreLoader をセットアップする
preloader-signedAUR パッケージをインストールして PreLoader.efi
と HashTool.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
X
は EFI システムパーティションのドライブ文字に、Y
は同じくパーティション番号に置き換えてください。
上記のエントリは起動リストの一番最初に追加する必要があります。efibootmgr
コマンドで確認して、必要であればブートローダーの設定を変更してください。
フォールバック
カスタム NVRAM エントリの起動に問題が発生する場合、HashTool.efi
と loader.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
上と同じように、HashTool.efi
と loader.efi
を esp/EFI/Microsoft/Boot
にコピーしてください。
セキュアブートを有効にした状態でシステムを起動したら、上のセクションの手順に従って loader.efi
と /vmlinuz-linux
(あるいは使用している他のカーネルイメージ) を登録します。
起動途中で使用するには?
Failed to Start loader... I will now execute HashTool.
というメッセージが表示されるでしょう。loader.efi
と vmlinuz.efi
のハッシュを登録するために HashTool を使用するには、以下の手順を踏んでください。以下の手順では、リマスタリングされた archiso インストールメディアのタイトルについて仮定をおいています。実際のタイトルはブートローダのセットアップに依存します。
- OK を選択してください
- HashTool のメインメニューで、Enroll Hash を選択し、
\loader.efi
を選んで Yes で確定してください。再び Enroll Hash とarchiso
を選択し 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
N
は PreLoader.efi
を起動するために作成した NVRAM のブートエントリに置き換えてください。efibootmgr
コマンドで確認を行なって、必要に応じてブート順序を修正してください。
登録したハッシュを削除する
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 をセットアップする
shim-signedAUR をインストールしてください。
現在のブートローダーの名前を grubx64.efi
に変更してください:
# mv esp/EFI/BOOT/BOOTx64.EFI esp/EFI/BOOT/grubx64.efi
shim と MokManager を ESP 上のブートローダーのディレクトリにコピーしてください; shimx64.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
を起動します。
MokManager で Enroll 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
を起動します。
MokManager で Enroll 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 をアンインストールして、コピーした shim と MokManager のファイルを削除してブートローダーを元の名前に戻してください。
セキュアブートを保護する
マシンに物理アクセスできる者がセキュアブートを無効化してしまうことを阻止する唯一の方法は、ファームウェアの設定をパスワードで保護することです。
ほとんどの UEFI ファームウェアはそのような機能を提供します。通常、ファームウェア設定の「セキュリティ」セクションにその項目があるはずです。
参照
- Wikipedia:ja:Unified Extensible Firmware Interface#セキュアブート
- Dealing with Secure Boot by Rod Smith
- Controlling Secure Boot by Rod Smith
- UEFI secure booting (part 2) by Matthew Garrett
- UEFI Secure Boot by James Bottomley
- efitools README
- Will your computer's "Secure Boot" turn out to be "Restricted Boot"? — Free Software Foundation
- Free Software Foundation recommendations for free operating system distributions considering Secure Boot