---
title: Secure Boot 설정
description: CachyOS 설치 후 sbctl로 Secure Boot 설정하기
tableOfContents:
  minHeadingLevel: 1
  maxHeadingLevel: 4
---

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

## 사전 설정

### GRUB 부트 매니저

GRUB을 사용 중이라면, CA 키를 사용해 GRUB에서 Secure Boot 지원을 활성화하려면 다음 명령어를 실행하세요.

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

:::note
부트 매니저에 불필요한 모듈을 로드하면 보안 위험이 생길 수 있습니다.
실제로 Secure Boot가 필요한 경우에만 이 명령어를 실행하세요.
:::

### UEFI에서 Setup Mode 활성화

먼저 펌웨어 설정으로 들어가 Secure Boot 모드를 "Setup Mode"로 설정해야 합니다. 이미 실행 중인 시스템에서는 다음 명령어로 펌웨어 설정으로 재부팅할 수 있습니다.

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

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

위 이미지는 Lenovo Ideapad 5 Pro의 BIOS 화면 예시입니다. Setup Mode로 초기화하거나 공장 키를 복원한 뒤 시스템으로 다시 재부팅하세요.

하지만 일부 MSI 메인보드에는 Setup Mode가 없습니다. 같은 효과를 얻으려면 아래 이미지의 두 단계를 따르세요.
<br />
<ImageComponent imgsrc={import('~/assets/images/MSI-bios-secure-boot.jpg')} />

일부 Asus 메인보드도 전용 Setup Mode가 없기 때문에 위에서 언급한 MSI 메인보드와 비슷하게 동작합니다.

Boot → Secure Boot로 이동해 Secure Boot Mode를 Custom으로 설정한 다음, Key Management를 열고 "Delete all Secure Boot Variables"를 선택하세요. 

#### sbctl 설치 및 키 등록

진행하기 전에 `sbctl`이 설치되어 있는지 확인하세요.

[sbctl](https://github.com/Foxboron/sbctl)은 Secure Boot 설정, 키 관리 기능 제공, 부트 체인에서 서명해야 하는 파일 추적을 수행할 수 있는 사용자 친화적인 Secure Boot 키 관리자입니다.

<details>
    <summary>sbctl 설치 방법</summary>
    ```bash title='터미널을 열고 다음 명령어를 실행하세요'
    sudo pacman -S sbctl
    ```
</details>

이제 `sbctl`이 설치되었으므로 sbctl을 설정하고 키를 펌웨어에 등록해야 합니다. 이 과정은 매우 간단하며, 아래 단계를 따르면 됩니다.

<Steps>
1. Setup Mode가 활성화되어 있는지 확인합니다.
    ```bash
    sudo sbctl status
    ```
    <details>
        <summary>예상 출력</summary>
        ```bash
        Installed:      ✘ sbctl is not installed
        Setup Mode:     ✘ Enabled
        Secure Boot     ✘ Disabled
        ```
    </details>
2. 사용자 지정 Secure Boot 키를 생성합니다.
    ```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 메인보드 — `--firmware-builtin`을 사용하지 마세요]
    일부 ASUS 메인보드에서는 `--firmware-builtin` 플래그를 사용하면 EFI 키 변수에 중복 항목이 생깁니다.
    예를 들어 `Vendor Keys`에 `builtin-db`가 여러 번 나타날 수 있습니다.
    이후 UEFI 설정에서 Secure Boot를 활성화하면, 보드가 이 일관되지 않은 키 구조를 감지해 부트
    매니저가 로드되기 전에 **Secure Boot Violation**을 발생시킵니다.

    ASUS 보드에서는 `--microsoft`만 사용하세요.

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

    `Vendor Keys`에 `microsoft builtin-db builtin-db ...`가 표시된다면 키를 다시 등록해야 합니다.
    UEFI에서 Setup Mode로 다시 진입한 뒤, 모든 키를 삭제하고 `--firmware-builtin` 없이
    `sbctl enroll-keys --microsoft`를 다시 실행하세요.
    :::


4. 키가 등록되고 Setup Mode가 비활성화되었는지 확인하기 위해 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>
</Steps>

## 커널 이미지와 부트 매니저 서명

<Tabs>
<TabItem label='Limine'>
Limine은 부팅 중 사용하는 커널 이미지와 기타 파일의 해시를 확인할 수 있는 특수한 부트 매니저입니다.
이 기능이 활성화되어 있으면, 예를 들어 `sbctl-batch-sign`으로 이미지를 서명하는 것처럼 사용자가 수동으로 수행한
모든 구성 변경이 해당 파일의 해시를 수정하게 되어 Limine의 체크섬 검증이 실패합니다.

하지만 Limine에서는 이러한 파일을 서명할 필요가 없습니다. Limine에는 EFI 체인로딩과 서명 검사를 우회하는 특수한
부팅 과정이 있기 때문입니다. 서명해야 하는 유일한 EFI 바이너리는 Limine 자체입니다.

:::caution[Limine >= 11.2.0]
Limine 11.2.0부터는 UEFI Secure Boot가 활성화되어 있을 때 Secure Boot 정책이 **엄격하게 적용**됩니다.

- BLAKE2B 구성 체크섬이 Limine EFI 바이너리에 **반드시** 등록되어 있어야 합니다. 그렇지 않으면 Limine이 `SECURE BOOT IS ACTIVE BUT NO CONFIG CHECKSUM IS ENROLLED` 메시지와 함께 패닉을 일으킵니다.
- `limine.conf`의 모든 파일 경로, 예를 들어 kernel, initramfs 등에는 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`은 **항상** `/boot`에서
`vmlinuz-*` 파일을 스캔하여 이 문제를 우회합니다.
:::

```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 Settings로 들어가 Secure Boot를 활성화하세요.**

:::caution[ASUS 메인보드 — Secure Boot 활성화]
일부 ASUS 메인보드는 Secure Boot를 활성화할 때 다른 제조사의 보드와 다르게 동작합니다.

- **`Other OS`가 아니라 `Windows UEFI Mode`를 사용하세요.**
  이름은 오해를 부를 수 있지만, 이 설정은 Secure Boot 적용 여부를 제어합니다.
  ASUS 보드에서 `OS Type`을 `Other OS`로 설정하면 다른 설정과 관계없이 Secure Boot가 **실제로 비활성화**됩니다.
  재부팅 후에도 `sbctl status`에는 계속 `Secure Boot: Disabled`로 표시됩니다.

- 일부 ASUS 보드에는 별도의 Secure Boot 켜기/끄기 토글이 없습니다.
  Secure Boot는 `Windows UEFI Mode`를 선택하면 암묵적으로 활성화됩니다.

이 경우 Secure Boot를 활성화하기 위한 올바른 ASUS BIOS 구성은 다음과 같습니다.
```
Boot → Secure Boot
  OS Type          → Windows UEFI Mode
  Secure Boot Mode → Custom
```
:::

참고하려면 [이 부분](/configuration/secure_boot_setup#enabling-setup-mode-in-uefi)을 확인하세요.

`-s` 플래그로 파일에 서명하면 해당 파일이 `sbctl` 데이터베이스에 저장되므로, 이 과정은 한 번만 수행하면 됩니다.

:::tip[알림]
`sbctl`에는 [pacman hook](https://wiki.archlinux.org/title/Pacman_hook)이 포함되어 있으므로, 커널이나 부트 매니저가 업데이트될 때 새 파일이 자동으로 서명됩니다.
:::

CachyOS는 재부팅 시 부트 매니저를 업데이트하기 위해 systemd에서 제공하는 `systemd-boot-update.service`를 사용합니다. 즉, `sbctl`
pacman hook은 업데이트된 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>

## Secure Boot 상태 확인

Secure Boot가 실제로 활성화되었는지 확인하려면 다음 명령어 중 하나를 실행하면 됩니다.

```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
```

## 링크 및 크레딧

- [The Arch Wiki](https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#Assisted_process_with_sbctl)는 이 가이드의 기반을 마련했습니다. 여기 있는 내용 대부분은 해당 문서를 참고했습니다.
- [sbctl](https://github.com/Foxboron/sbctl) - Secure Boot 지원을 활성화하는 이 쉬운 가이드는 이 소프트웨어를 만들기 위해 이루어진 훌륭한 작업이 없었다면 가능하지 않았을 것입니다.
- [Improving the Secure Boot Experience by Morten linderud](https://linderud.dev/blog/improving-the-secure-boot-user-experience/) - Morten
"Foxboron" Linderud가 `sbctl` 이전의 Secure Boot 경험이 얼마나 복잡했는지 설명한 블로그 글입니다.
