---
title: セキュアブートの設定
description: CachyOS のインストール後に sbctl でセキュアブートを設定する
tableOfContents:
  minHeadingLevel: 1
  maxHeadingLevel: 4
---

import ImageComponent from '~/components/image-component.astro';
import { Tabs, TabItem, Steps } from '@astrojs/starlight/components';

## 事前準備

### GRUB ブートマネージャー

GRUB を使用している場合は、以下のコマンドを実行して CA キーを使用する GRUB のセキュアブートに対応する設定を有効にしてください。

```bash
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=cachyos --modules="tpm" --disable-shim-lock
```

:::note
不要なモジュールをブートマネージャーに読み込むとセキュリティリスクになる可能性があります。
実際にセキュアブートが必要な場合のみこのコマンドを実行してください。
:::

### UEFI でセットアップモードを有効化

まず、ファームウェア設定に移動してセキュアブートモードを「セットアップモード」に設定する必要があります。起動中のシステムから以下のコマンドでファームウェア設定に再起動できます。

```bash
systemctl reboot --firmware-setup
```

<br />
<ImageComponent imgsrc={import('~/assets/images/ideapad-bios-secure-boot.jpg')} />

これは Lenovo Ideapad 5 Pro の BIOS の画面です。セットアップモードにリセットするかファクトリーキーを復元し、システムに再起動してください。

一部の MSI 製マザーボードにはセットアップモードがありません。同様の操作を行うには、セキュアブートモードを "custom" に設定し、互換性オプションを "maximum security" に指定してください (デフォルトモードのままだと、ブートローダーから CachyOS を起動することができなくなります)。その後、"key management" 画面で以下の画像にしたがって操作を行ってください。
<br />
<ImageComponent imgsrc={import('~/assets/images/MSI-bios-secure-boot.jpg')} />

また、一部の ASUS 製マザーボードも同様に独立したセットアップモードが実装されていません。

Boot → Secure Boot に移動し、セキュアブートモードを Custom にしてから、Key Management を開き "Delete all Secure Boot Variables" をクリックしてください。

#### sbctl のインストールとキーの登録

作業を始める前に、`sbctl` がインストールされているかどうかを確認してください。

[sbctl](https://github.com/Foxboron/sbctl) は使いやすさを重視したセキュアブートキーマネージャーです。セキュアブートの設定やキー管理、ブートチェーンで署名が必要なファイルの追跡ができます。

<details>
    <summary>sbctl のインストール方法</summary>
    ```bash title='ターミナルを開き以下のコマンドを実行'
    sudo pacman -S sbctl
    ```
</details>

`sbctl` のインストールが完了したら、sbctl のセットアップとファームウェアへのキー登録を行います。以下の手順にしたがってください。

<Steps>
1. セットアップモードが有効かどうかを確認してください。
    ```bash
    sudo sbctl status
    ```
    <details>
        <summary>正しい出力の例</summary>
        ```bash
        Installed:      ✘ sbctl is not installed
        Setup Mode:     ✘ Enabled
        Secure Boot     ✘ Disabled
        ```
    </details>
2. カスタムのセキュアブートキーを作成してください。
    ```bash
    sudo sbctl create-keys
    ```
    <details>
        <summary>キー作成成功時の出力例</summary>
        ```bash
        Created Owner UUID a9fbbdb7-a05f-48d5-b63a-08c5df45ee70
        Creating secure boot keys...✔
        Secure boot keys created!
        ```
    </details>
3. Microsoft および OEM ファームウェアの組み込みキーとともにキーを登録してください。
    ```bash
    sudo sbctl enroll-keys --microsoft --firmware-builtin
    ```
    <details>
        <summary>成功時の出力例</summary>
        ```bash
        Enrolling keys to EFI variables...✔
        Enrolled keys to the EFI variables!
        ```
    </details>

    :::caution[ASUS 製や Gigabyte 製マザーボードで `--firmware-builtin` は使用しないでください]
    一部の ASUS 製や Gigabyte 製マザーボードでは `--firmware-builtin` フラグを使用すると、EFI キー変数に重複エントリが発生します。(例: `Vendor Keys` に `builtin-db` が複数回表示される) \
    その後 UEFI 設定からセキュアブートを有効化すると、マザーボードが不適切なキーを検知し、ブートマネージャーが読み込まれる前に **Secure Boot Violation** エラーが発生します。

    ASUS 製や Gigabyte 製マザーボードでは `--microsoft` を使用してください。

    ```bash
    sudo sbctl enroll-keys --microsoft
    ```

    `Vendor Keys` に `microsoft builtin-db builtin-db ...` と表示されている場合は、キーを再登録する必要があります。すべてのキーを削除することで UEFI のセットアップモードに戻ることができるため、その後 `--firmware-builtin` を除いた `sbctl enroll-keys --microsoft` でもう一度実行してください。
    :::


4. キーが登録され、セットアップモードが無効になっていることを確認するために、sbctl のステータスをもう一度確認してください。
    ```bash
    sudo sbctl status
    ```
    <details>
        <summary>成功時の出力例</summary>
        ```bash
        Installed:      ✔ sbctl is installed
        Owner GUID:     a9fbbdb7-a05f-48d5-b63a-08c5df45ee70
        Setup Mode:     ✔ Disabled
        Secure Boot     ✘ Disabled
        Vendor Keys:    microsoft
        ```
    </details>

    :::note[セットアップモードが Enabled と表示されるときは]
    `Setup Mode` が **Enabled** と表示されている場合は、ファームウェア設定で**一時的にセキュアブートを無効化してください**。
    その後システムを再起動し、sbctl のステータスをもう一度確認したら、以下の[カーネルイメージとブートマネージャーへの署名](#カーネルイメージとブートマネージャーへの署名)に進んでください。作業が終わって再起動したら、ファームウェア設定でセキュアブートを再度有効化してください。
    :::

</Steps>

## カーネルイメージとブートマネージャーへの署名

<Tabs>
<TabItem label='Limine'>
Limine は特殊なブートマネージャーで、ブート時に使用するカーネルイメージやその他のファイルのハッシュを検証できます。この機能が有効な場合、`sbctl-batch-sign` による署名など、ユーザーが手動で行った変更はファイルのハッシュを変更するため、Limine のチェックサム検証の失敗につながります。

ただし、Limine は EFI チェーンロードと署名チェックをバイパスする特殊なブートプロセスを持つため、これらのファイルへの署名は必要ありません。署名が必要な EFI バイナリは Limine 自身だけです。

:::caution[Limine 11.2.0 以降について]
Limine 11.2.0 より、UEFI セキュアブートが有効な場合は、セキュアブートポリシーが**すべてのファイルに対して強制的に適用される**ようになりました。

- 設定ファイルの BLAKE2B チェックサムを Limine EFI バイナリに**かならず登録**する必要があります。登録されていない場合、Limine で `SECURE BOOT IS ACTIVE BUT NO CONFIG CHECKSUM IS ENROLLED` エラーが発生します。
- カーネルや initramfs など、`limine.conf` 内のすべてのファイルパスの末尾に、BLAKE2B ハッシュを**かならず書き加える**必要があります。(例: `boot():/vmlinuz-linux#<hash>`)
- 設定エディターはすべての環境で無効化されます。
- ハッシュが一致しないときにはかならずエラーが発生します。
:::

設定ファイルのチェックサムを自動で登録するよう設定するには、`/etc/default/limine` に以下の行を追加してください。

```sh
ENABLE_ENROLL_LIMINE_CONFIG=yes
```

次に、Limine のスプラッシュ画像のハッシュを生成します。

:::note[以下の手順には root 権限が必要です。sudo を使用するか、作業前に root ユーザーに切り替えてください。]
:::

<Steps>

1. 設定ファイルでスプラッシュ画像の現在の名前とパスを確認してください。
    ```sh title="ターミナルを開き以下のコマンドを実行"
    sudo cat /boot/limine.conf
    ```
    以下のような行が見つかるはずです。
    ```sh
    wallpaper: boot():/limine-splash.png
    ```
2. スプラッシュ画像の BLAKE2B ハッシュを生成し、設定ファイル内でファイルパスの末尾に書き加えてください。
    ```sh title="以下のコマンドを、パスは前の手順で確認したものに置き換えて実行"
    sudo b2sum /boot/limine-splash.png
    ```
    ハッシュが出力されます。以下はハッシュの例です。
    ```sh
    75205d08fa9c61599897857e861d6b2f6da25465183fc4cc9efecffb22ee630efb510f2ef1b17677db94c28d5c69ad2ceb4d3892f5bec9cfa65c97b5ba16f52f
    ```
3. 前の手順で生成したハッシュをコピーしたのち、テキストエディターで設定ファイルを開き、スプラッシュ画像のパスの末尾にハッシュを書き加えてください。
    :::note[上記のハッシュ例をそのまま使用せず、かならず前の手順で生成したハッシュを使用してください。]
    :::
    ```sh
    wallpaper: boot():/limine-splash.png#75205d08fa9c61599897857e861d6b2f6da25465183fc4cc9efecffb22ee630efb510f2ef1b17677db94c28d5c69ad2ceb4d3892f5bec9cfa65c97b5ba16f52f
    ```
    このとおりにパスの末尾に `#` 記号からはじめてハッシュを書き加えて、変更を保存してください。

</Steps>

設定ファイルのチェックサム自動登録を有効化し、スプラッシュ画像のハッシュを生成したら、以下のコマンドを実行して設定ファイルのチェックサムを登録し、Limine の EFI バイナリに署名してください。

```sh
# limine-enroll-config を使って設定ファイルのチェックサムを登録し、Limine の EFI バイナリに署名
# 内部では sbctl を使用しています
sudo limine-enroll-config
sudo limine-update
```
</TabItem>
<TabItem label='systemd-boot'>

CachyOS では `sudo sbctl verify` から署名が必要なファイルの一覧を取得し、一括で署名するスクリプトの [sbctl-batch-sign](https://github.com/CachyOS/CachyOS-Settings/blob/master/usr/bin/sbctl-batch-sign) を用意しています。

:::caution
`/boot` と `/boot/efi` を別々のパーティションに分けているシステムでは、`sbctl` が `/boot/efi` 内の EFI バイナリしかスキャンせず、`/boot` にあるカーネルイメージが検出されない可能性があります。`sbctl-batch-sign` ではこの問題を回避するために、`vmlinuz-*` ファイルを検出する際は**常に** `/boot` をスキャンしています。
:::

```bash
sudo sbctl verify
Verifying file database and EFI images in /boot...
✘ /boot/1c4b5246eef05ac3bc87339323cd5101/6.10.0-cn4.0.fc40.x86_64/linux is not signed
✘ /boot/EFI/BOOT/BOOTX64.EFI is not signed
✘ /boot/EFI/systemd/systemd-bootx64.efi is not signed
✘ /boot/1c4b5246eef05ac3bc87339323cd5101/0-rescue/linux is not signed
✘ /boot/1c4b5246eef05ac3bc87339323cd5101/6.10.0-cn3.0.fc40.x86_64/linux is not signed

sudo sbctl-batch-sign

sudo sbctl verify
Verifying file database and EFI images in /boot...
✔ /boot/1c4b5246eef05ac3bc87339323cd5101/6.10.0-cn4.0.fc40.x86_64/linux is signed
✔ /boot/EFI/BOOT/BOOTX64.EFI is signed
✔ /boot/EFI/systemd/systemd-bootx64.efi is signed
✔ /boot/1c4b5246eef05ac3bc87339323cd5101/0-rescue/linux is signed
✔ /boot/1c4b5246eef05ac3bc87339323cd5101/6.10.0-cn3.0.fc40.x86_64/linux is signed
```

これにてすべてのファイルへの署名が完了しました。**システムを再起動して UEFI 設定でセキュアブートを有効にしてください。**

:::caution[ASUS 製マザーボードでセキュアブートを有効にするときは]
一部の ASUS 製マザーボードでは、セキュアブートを有効化する際にほかのメーカーとは異なる動作をします。

- **`Other OS` ではなく `Windows UEFI Mode` を使用してください。**
  名前が悪くまぎらわしいですが、この設定はセキュアブートの強制を制御するものです。
  `OS Type` を `Other OS` に設定すると、ASUS 製マザーボードではほかの設定にかかわらず、セキュアブートが**無効化されます**。
  そのため、再起動後も `sbctl status` では `Secure Boot: Disabled` と表示され続けます。

- **一部の ASUS 製マザーボードにはセキュアブートのオン/オフを独立して切り替えられる設定はありません。**
  セキュアブートは `Windows UEFI Mode` を選択することで暗黙的に有効化されるようになっています。

この場合、ASUS BIOS でセキュアブートを有効化するための正しい設定は以下のとおりです。
```
Boot → Secure Boot
  OS Type          → Windows UEFI Mode
  Secure Boot Mode → Custom
```
:::

参考として[こちら](/ja/configuration/secure_boot_setup#uefi-でセットアップモードを有効化)も確認してください。

`-s` フラグで署名されたファイルは `sbctl` のデータベースに保存されるため、これ以降同じ手順を行う必要はありません。

:::tip[補足]
`sbctl` には [pacman フック](https://wiki.archlinux.jp/index.php/Pacman_%E3%83%95%E3%83%83%E3%82%AF)が付属しているため、カーネルやブートマネージャーのアップデート時に新しいファイルに自動で署名を行います。
:::

CachyOS は systemd の `systemd-boot-update.service` を使って再起動時にブートマネージャーを更新します。そのため `sbctl` の pacman フックは更新された EFI バイナリに**署名しません**。回避策として、ブートマネージャーに直接署名することができます。

```sh
sudo sbctl sign -s -o /usr/lib/systemd/boot/efi/systemd-bootx64.efi.signed /usr/lib/systemd/boot/efi/systemd-bootx64.efi
```
</TabItem>
</Tabs>

## セキュアブート状態の確認方法

セキュアブートが有効かどうかを確認するには、以下のいずれかのコマンドを実行してください。

```bash
sudo sbctl status
Installed:      ✓ sbctl is installed
Owner GUID:     a9fbbdb7-a05f-48d5-b63a-08c5df45ee70
Setup Mode:     ✓ Disabled
Secure Boot:    ✓ Enabled
Vendor Keys:    microsoft

bootctl
System:
      Firmware: UEFI 2.80 (INSYDE Corp. 28724.16435)
 Firmware Arch: x64
   Secure Boot: enabled (user)
  TPM2 Support: yes
  Measured UKI: no
  Boot into FW: supported
```

## リンクとクレジット

- このガイドの基礎となった [Arch Wiki (クリックすると日本語版に飛びます)](https://wiki.archlinux.jp/index.php/Unified_Extensible_Firmware_Interface/%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%83%96%E3%83%BC%E3%83%88#sbctl_%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%82%A2%E3%82%B7%E3%82%B9%E3%83%88%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9) — ここに記載された内容の多くはここから引用しています。
- [sbctl](https://github.com/Foxboron/sbctl) — このセキュアブート設定ガイドは、このソフトウェアの素晴らしい開発があってこそ実現しました。
- [Improving the Secure Boot Experience by Morten linderud](https://linderud.dev/blog/improving-the-secure-boot-user-experience/) — `sbctl` が開発される以前のセキュアブート設定の複雑さについて書かれた Morten "Foxboron" Linderud のブログ記事です。
