Secure Boot — 부팅 체인 검증으로 부트킷 막기
Secure Boot의 신뢰 체인 구조(PK·KEK·db·dbx), shim과 GRUB의 역할, mokutil·sign-file을 이용한 MOK 관리, 커널 lockdown 모드를 설명합니다.
지난 글에서 auditd로 시스템 이벤트를 감사하는 방법을 살펴봤습니다. 이번에는 OS가 로드되기 전 단계를 보호하는 Secure Boot — UEFI의 부팅 체인 검증 메커니즘을 다룹니다.
Secure Boot가 필요한 이유
부트킷은 OS가 로드되기 전 MBR이나 EFI 파티션에 위치합니다. OS 안의 어떤 도구로도 감지할 수 없고, 안티바이러스가 시작되기 전에 이미 제어권을 잡습니다. Secure Boot는 각 부팅 단계의 바이너리에 디지털 서명을 요구해서 변조된 코드가 실행되지 못하도록 차단합니다.
신뢰 체인 구조
UEFI 펌웨어는 4개의 키 데이터베이스를 가집니다.
| 변수 | 역할 |
|---|---|
| PK (Platform Key) | 하드웨어 제조사 최상위 키 |
| KEK (Key Exchange Key) | db/dbx를 업데이트할 수 있는 키 |
| db (Signature Database) | 허용된 서명자 목록 (MS, Canonical 등) |
| dbx (Forbidden Database) | 폐기된 서명 목록 (블랙리스트) |
부팅 순서는 UEFI → shim.efi → GRUB 2 → 커널입니다. 각 단계에서 다음 단계의 서명을 검증합니다.
shim의 역할
대부분의 Linux 배포판은 shim이라는 중간 로더를 사용합니다. shim은 Microsoft가 서명한 바이너리이므로 기본 UEFI DB에서 신뢰합니다. shim 안에는 배포판 키(예: Canonical 키)가 내장되어 있어, GRUB과 커널에 대한 검증을 이어받습니다.
Secure Boot 상태 확인
# mokutil로 확인 (가장 간단)
mokutil --sb-state
# efivar로 직접 확인
ls /sys/firmware/efi/efivars/ | grep SecureBoot
# bootctl (systemd-boot 환경)
bootctl status | grep "Secure Boot"
# dmesg에서 확인
sudo dmesg | grep "Secure boot"
SecureBoot enabled 또는 Secure boot: enabled 출력이면 활성화된 상태입니다.
MOK — Machine Owner Key
직접 빌드한 커널 모듈이나 드라이버는 Secure Boot 환경에서 서명 없이는 로드되지 않습니다. MOK는 사용자가 추가하는 자체 서명 키입니다.
# 1. RSA 키 쌍과 인증서 생성
openssl req -new -x509 -newkey rsa:2048 -nodes \
-keyout /root/mok.key \
-out /root/mok.crt \
-days 3650 \
-subj "/CN=My Module Signing Key/"
# 2. MOK 등록 (재부팅 시 MOKManager에서 비밀번호 입력)
sudo mokutil --import /root/mok.crt
# 3. 재부팅 → MOKManager 화면에서 키 등록 확인
sudo reboot
# 4. 등록 확인
mokutil --list-enrolled | grep Subject
커널 모듈 서명
# sign-file로 모듈 서명
/usr/lib/linux-kbuild-$(uname -r)/scripts/sign-file sha256 \
/root/mok.key /root/mok.crt \
/lib/modules/$(uname -r)/updates/mymodule.ko
# 서명 확인
modinfo mymodule | grep signer
DKMS와 자동 서명
DKMS 모듈은 /etc/dkms/framework.conf에서 MOK 키 경로를 설정하면 빌드 시 자동으로 서명됩니다.
# /etc/dkms/framework.conf
mok_signing_key="/root/mok.key"
mok_certificate="/root/mok.crt"
sign_tool="/etc/dkms/sign_helper.sh"
커널 Lockdown 모드
Secure Boot가 활성화되면 리눅스 커널이 lockdown 모드로 진입합니다. 이 모드에서는 다음이 차단됩니다.
/dev/mem,/dev/kmem직접 접근- eBPF JIT 로 커널 메모리 쓰기
- 서명 없는 커널 모듈 로드
kexec_load(서명 없는 커널로 교체)- Hibernation (resume 이미지 무결성 불보장)
# lockdown 모드 확인
cat /sys/kernel/security/lockdown
# 예: [none] integrity confidentiality
실전 운영 팁
1. Secure Boot 비활성화가 필요한 경우
VirtualBox, VMware, Nvidia 독점 드라이버 일부는 MOK 서명이 번거롭습니다. 이 경우 MOK 등록이 권장 대안이고, UEFI에서 비활성화는 마지막 수단입니다.
2. dbx 업데이트
# Ubuntu: fwupd로 dbx 업데이트
sudo fwupdmgr get-devices
sudo fwupdmgr update
3. 서명 검증 실패 대응
부팅 중 서명 실패가 발생하면 UEFI 셸로 들어가 bcfg boot로 부팅 순서를 확인하거나, Secure Boot를 일시 비활성화 후 원인을 파악합니다.
정리
Secure Boot는 부팅 전 단계를 보호하는 UEFI 표준입니다. OS가 로드된 이후의 런타임 보안은 SELinux, AppArmor, auditd 등 별도 레이어가 담당합니다. 두 레이어를 모두 갖추어야 공격 표면을 최소화할 수 있습니다.
지난 글: auditd — 리눅스 감사 시스템 완전 정리
다음 글: LUKS — 디스크 전체 암호화
읽어주셔서 감사합니다. 😊