1.9. 보안 부팅을 위해 커널 모듈에 서명
Red Hat Enterprise Linux 7에는 UEFI Secure Boot 기능이 포함되어 있으므로 UEFI Secure Boot가 활성화된 시스템에서 Red Hat Enterprise Linux 7을 설치하고 실행할 수 있습니다. Red Hat Enterprise Linux 7에는 UEFI 시스템에서 Secure Boot를 사용할 필요가 없습니다.
Secure Boot가 활성화된 경우 UEFI 운영 체제 부트 로더, Red Hat Enterprise Linux 커널 및 모든 커널 모듈은 개인 키로 서명되고 해당 공개 키로 인증되어야 합니다. 서명 및 인증되지 않은 경우 시스템은 부팅 프로세스를 완료할 수 없습니다.
Red Hat Enterprise Linux 7 배포에는 다음이 포함됩니다.
- 서명된 부트 로더
- 서명된 커널
- 서명된 커널 모듈
또한 서명된 첫 번째 단계 부트 로더와 서명된 커널에는 Red Hat 공개 키가 포함됩니다. 서명된 실행 파일 바이너리 및 임베디드 키를 사용하면 Red Hat Enterprise Linux 7이 UEFI 펌웨어에서 UEFI Secure Boot를 지원하는 시스템의 UEFI 펌웨어에서 제공하는 Microsoft UEFI Secure Boot 인증 기관 키를 설치, 부팅 및 실행할 수 있습니다.
일부 UEFI 기반 시스템에는 Secure Boot 지원이 포함되어 있지 않습니다.
다음 섹션에서 제공되는 정보는 Secure Boot가 활성화된 UEFI 기반 빌드 시스템에서 Red Hat Enterprise Linux 7과 함께 사용하기 위해 개인 빌드 커널 모듈을 자체 서명하는 단계를 설명합니다. 이러한 섹션에서는 공개 키를 커널 모듈을 배포하려는 대상 시스템으로 가져오기 위한 사용 가능한 옵션에 대한 개요도 제공합니다.
커널 모듈에 서명하고 로드하려면 다음을 수행해야 합니다.
1.9.1. 사전 요구 사항
외부에서 빌드된 커널 모듈에 로그인할 수 있으려면 빌드 시스템에 다음 표에 나열된 유틸리티를 설치합니다.
유틸리티 | 패키지에 의해 제공 | 에서 사용됨 | 목적 |
---|---|---|---|
|
| 빌드 시스템 | 공개 및 개인 X.509 키 쌍 생성 |
|
| 빌드 시스템 | 커널 모듈에 서명하는 데 사용되는 Perl 스크립트 |
|
| 빌드 시스템 | 서명 스크립트를 실행하는 데 사용되는 Perl 인터프리터 |
|
| 대상 시스템 | 공개 키 수동 등록에 사용되는 선택적 유틸리티 |
|
| 대상 시스템 | 시스템 키 링에 공개 키를 표시하는 데 사용되는 선택적 유틸리티 |
커널 모듈을 빌드하고 서명하는 빌드 시스템은 UEFI Secure Boot를 활성화할 필요가 없으며 UEFI 기반 시스템도 필요하지 않습니다.
1.9.2. 커널 모듈 인증
Red Hat Enterprise Linux 7에서 커널 모듈이 로드되면 커널의 시스템 키 링에서 공개 X.509 키를 사용하여 모듈의 서명을 확인하고 커널의 시스템 차단 키 링에 있는 키를 제외하고 모듈 서명을 확인합니다. 다음 섹션에서는 키/키링의 소스, 시스템의 다른 소스에서 로드된 키의 예를 보여줍니다. 또한 사용자는 커널 모듈을 인증하는 데 필요한 사항을 확인할 수 있습니다.
1.9.2.1. 커널 모듈을 인증하는 데 사용되는 공개 키의 소스
부팅 중에 커널은 아래 표에 표시된 대로 일련의 영구 키 저장소 집합에서 X.509 키를 시스템 키 링 또는 시스템 black-list 키 링으로 로드합니다.
X.509 키의 소스 | 키를 추가하는 사용자 기능 | UEFI Secure Boot 상태 | 부팅 중 로드된 키 |
---|---|---|---|
커널 내에 포함 | 없음 | - |
|
UEFI Secure Boot "db" | 제한됨 | 활성화되지 않음 | 없음 |
활성화됨 |
| ||
UEFI Secure Boot "dbx" | 제한됨 | 활성화되지 않음 | 없음 |
활성화됨 |
| ||
| 없음 | 활성화되지 않음 | 없음 |
활성화됨 |
| ||
MOK(Machine Owner Key) 목록 | 있음 | 활성화되지 않음 | 없음 |
활성화됨 |
|
시스템이 UEFI 기반이 아니거나 UEFI Secure Boot가 활성화되지 않은 경우 커널에 포함된 키만 시스템 키 링에 로드됩니다. 이 경우 커널을 다시 빌드하지 않고 해당 키 세트를 보강할 수 없습니다.
시스템 차단 목록 키 링은 취소된 X.509 키 목록입니다. 모듈이 블랙 리스트의 키로 서명되면 공개 키가 시스템 키 링에 있는 경우에도 인증이 실패합니다.
keyctl
유틸리티를 사용하여 시스템 키 링에 키에 대한 정보를 표시할 수 있습니다. 다음은 UEFI Secure Boot가 활성화되지 않은 Red Hat Enterprise Linux 7 시스템의 출력 예를 단축한 것입니다.
# keyctl list %:.system_keyring 3 keys in keyring: ...asymmetric: Red Hat Enterprise Linux Driver Update Program (key 3): bf57f3e87... ...asymmetric: Red Hat Enterprise Linux kernel signing key: 4249689eefc77e95880b... ...asymmetric: Red Hat Enterprise Linux kpatch signing key: 4d38fd864ebe18c5f0b7...
다음은 UEFI Secure Boot가 활성화된 Red Hat Enterprise Linux 7 시스템의 출력 예를 단축한 것입니다.
# keyctl list %:.system_keyring 6 keys in keyring: ...asymmetric: Red Hat Enterprise Linux Driver Update Program (key 3): bf57f3e87... ...asymmetric: Red Hat Secure Boot (CA key 1): 4016841644ce3a810408050766e8f8a29... ...asymmetric: Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed... ...asymmetric: Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e... ...asymmetric: Red Hat Enterprise Linux kernel signing key: 4249689eefc77e95880b... ...asymmetric: Red Hat Enterprise Linux kpatch signing key: 4d38fd864ebe18c5f0b7...
위의 출력에서는 shim.efi
부트 로더에 포함된 Red Hat Secure Boot "db" 키와 Red Hat Secure Boot (CA 키 1)
에서 두 개의 키를 추가하는 것을 보여줍니다. UEFI Secure Boot 관련 소스에서 키를 식별하는 커널 콘솔 메시지도 찾을 수 있습니다. 여기에는 UEFI Secure Boot db, shim 및 MOK 목록이 포함됩니다.
# dmesg | grep 'EFI: Loaded cert' [5.160660] EFI: Loaded cert 'Microsoft Windows Production PCA 2011: a9290239... [5.160674] EFI: Loaded cert 'Microsoft Corporation UEFI CA 2011: 13adbf4309b... [5.165794] EFI: Loaded cert 'Red Hat Secure Boot (CA key 1): 4016841644ce3a8...
1.9.2.2. 커널 모듈 인증 요구사항
이 섹션에서는 UEFI Secure Boot 기능이 활성화된 시스템에 커널 모듈을 로드하기 위해 충족해야 하는 조건을 설명합니다.
UEFI Secure Boot가 활성화되어 있거나 module.sig_enforce
커널 매개 변수가 지정된 경우 시스템 키 링의 키를 사용하여 인증된 서명된 커널 모듈만 로드할 수 있습니다. 또한 공개 키는 시스템 차단 목록 키 링에 없어야 합니다.
UEFI Secure Boot가 비활성화되고 module.sig_enforce
커널 매개 변수가 지정되지 않은 경우 공개 키 없이 서명되지 않은 커널 모듈과 서명된 커널 모듈을 로드할 수 있습니다. 이는 아래 표에 요약되어 있습니다.
모듈 서명 | 공개 키 및 서명이 유효한 경우 | UEFI Secure Boot 상태 | sig_enforce | 모듈 로드 | 커널 테인트 |
---|---|---|---|---|---|
서명되지 않음 | - | 활성화되지 않음 | 활성화되지 않음 | 성공 | 있음 |
활성화되지 않음 | 활성화됨 | 실패 | - | ||
활성화됨 | - | 실패 | - | ||
signed | 없음 | 활성화되지 않음 | 활성화되지 않음 | 성공 | 있음 |
활성화되지 않음 | 활성화됨 | 실패 | - | ||
활성화됨 | - | 실패 | - | ||
signed | 있음 | 활성화되지 않음 | 활성화되지 않음 | 성공 | 없음 |
활성화되지 않음 | 활성화됨 | 성공 | 없음 | ||
활성화됨 | - | 성공 | 없음 |
1.9.3. 공개 및 개인 X.509 키 쌍 생성
Secure Boot 지원 시스템에서 커널 모듈을 사용하는 데 성공하려면 공개 및 개인 X.509 키 쌍을 생성해야 합니다. 나중에 개인 키를 사용하여 커널 모듈에 서명합니다. 또한 보안 부팅에 대해 해당 공개 키를 MOK(Machine Owner Key)에 추가하여 서명된 모듈의 유효성을 검사해야 합니다. 이에 대한 지침은 1.9.4.2절. “시스템 관리자가 MOK 목록에 공개 키를 수동으로 추가” 을 참조하십시오.
이 키 쌍 생성의 일부 매개변수는 구성 파일을 사용하여 가장 잘 지정됩니다.
키 쌍 생성에 대한 매개 변수를 사용하여 구성 파일을 생성합니다.
# cat << EOF > configuration_file.config [ req ] default_bits = 4096 distinguished_name = req_distinguished_name prompt = no string_mask = utf8only x509_extensions = myexts [ req_distinguished_name ] O = Organization CN = Organization signing key emailAddress = E-mail address [ myexts ] basicConstraints=critical,CA:FALSE keyUsage=digitalSignature subjectKeyIdentifier=hash authorityKeyIdentifier=keyid EOF
다음 예와 같이 X.509 공개 및 개인 키 쌍을 만듭니다.
# openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 \ -batch -config configuration_file.config -outform DER \ -out my_signing_key_pub.der \ -keyout my_signing_key.priv
공개 키는
my_signing_key_pub.der
파일에 기록되고 개인 키는my_signing_key.priv
파일에 기록됩니다.커널 모듈을 인증하고 로드하려는 모든 시스템에 공개 키를 등록합니다.
자세한 내용은 1.9.4절. “대상 시스템에 공개 키 등록”의 내용을 참조하십시오.
강력한 보안 조치 및 액세스 정책을 적용하여 개인 키의 콘텐츠를 보호합니다. 잘못된 손에서 키는 해당 공개 키로 인증된 시스템을 손상시키는 데 사용할 수 있습니다.
1.9.4. 대상 시스템에 공개 키 등록
Red Hat Enterprise Linux 7이 Secure Boot가 활성화된 UEFI 기반 시스템에서 부팅되면 커널은 Secure Boot db 키 데이터베이스에 있는 모든 공개 키를 링하지만 취소된 키의 dbx 데이터베이스에는 작동하지 않습니다. 아래 섹션에서는 시스템 키 링에서 공개 키를 사용하여 커널 모듈을 인증할 수 있도록 대상 시스템에서 공개 키를 가져오는 다양한 방법에 대해 설명합니다.
1.9.4.1. 공개 키를 포함한 팩토리 펌웨어 이미지
시스템에서 커널 모듈을 쉽게 인증하려면 시스템 벤더에 공개 키를 해당 팩토리 펌웨어 이미지의 UEFI Secure Boot 키 데이터베이스에 통합하도록 요청하는 것이 좋습니다.
1.9.4.2. 시스템 관리자가 MOK 목록에 공개 키를 수동으로 추가
MOK(Machine Owner Key) 기능 기능을 사용하여 UEFI Secure Boot 키 데이터베이스를 확장할 수 있습니다. Red Hat Enterprise Linux 7이 Secure Boot가 활성화된 UEFI 지원 시스템에서 부팅되면 MOK 목록의 키 외에도 키 데이터베이스의 키 외에 MOK 목록의 키도 시스템 키 링에 추가됩니다. MOK 목록 키는 Secure Boot 데이터베이스 키와 동일한 방식으로 영구적으로 안전하게 저장되지만, 두 가지 별도의 시설입니다. MOK 기능은 shim.efi
,MokManager.efi
,grubx64.efi
및 Red Hat Enterprise Linux 7 mokutil
유틸리티에서 지원됩니다.
MOK 키를 등록하려면 각 대상 시스템의 UEFI 시스템 콘솔에서 사용자의 수동 상호 작용이 필요합니다. 그러나 MOK 기능은 새로 생성된 키 쌍을 테스트하고 서명한 커널 모듈을 테스트하는 편리한 방법을 제공합니다.
MOK 목록에 공개 키를 추가하려면 다음을 수행합니다.
MOK 목록에 공개 키를 추가합니다.
# mokutil --import my_signing_key_pub.der
MOK 등록 요청에 대한 암호를 입력하고 암호를 확인하라는 메시지가 표시됩니다.
시스템을 재부팅합니다.
shim.efi
에서 보류 중인 MOK 키 등록 요청을 알 수 있으며, UEFI 콘솔에서 등록을 완료할 수 있도록MokManager.efi
를 시작합니다.이전에 이 요청과 연결된 암호를 입력하고 등록을 확인합니다.
공개 키가 MOK 목록에 추가되며 이는 영구적입니다.
키가 MOK 목록에 있으면 자동으로 시스템 키 링으로 전파되고 UEFI Secure Boot가 활성화되면 부팅됩니다.
1.9.5. 개인 키를 사용하여 커널 모듈 서명
커널 모듈이 준비되었다고 가정합니다.
Perl 스크립트를 사용하여 커널 모듈에 개인 키로 서명합니다.
# perl /usr/src/kernels/$(uname -r)/scripts/sign-file \ sha256 \ my_signing_key.priv\ my_signing_key_pub.der\ my_module.ko
참고Perl 스크립트를 사용하려면 개인 키와 공개 키가 포함된 파일과 서명할 커널 모듈 파일을 모두 제공해야 합니다.
커널 모듈은 ELF 이미지 형식이며 Perl 스크립트가 컴퓨팅되며 커널 모듈 파일의 ELF 이미지에 직접 서명을 추가합니다.
modinfo
유틸리티를 사용하여 커널 모듈 서명에 대한 정보를 표시할 수 있습니다(있는 경우).modinfo
사용에 대한 자세한 내용은 1.4절. “모듈에 대한 정보 표시” 을 참조하십시오.추가된 서명은 ELF 이미지 섹션에 포함되지 않으며 ELF 이미지의 공식적인 부분이 아닙니다. 따라서
readelf
와 같은 유틸리티에서는 커널 모듈에 서명을 표시할 수 없습니다.이제 커널 모듈을 로드할 준비가 되었습니다. 서명된 커널 모듈은 UEFI Secure Boot가 비활성화된 시스템 또는 UEFI가 아닌 시스템에서도 로드할 수 있습니다. 즉, 서명된 버전과 서명되지 않은 버전의 커널 모듈을 모두 제공할 필요가 없습니다.
1.9.6. 서명된 커널 모듈 로드
공개 키가 등록되어 시스템 키 링에 있으면 mokutil
을 사용하여 MOK 목록에 공개 키를 추가합니다. 그런 다음 modprobe
명령을 사용하여 커널 모듈을 수동으로 로드합니다.
선택적으로 공개 키를 등록하기 전에 커널 모듈이 로드되지 않는지 확인합니다.
현재 로드된 커널 모듈을 나열하는 방법에 대한 자세한 내용은 1.3절. “현재 로드된 모듈 나열” 을 참조하십시오.
현재 부팅의 시스템 키 링에 추가된 키를 확인합니다.
# keyctl list %:.system_keyring
공개 키가 아직 등록되지 않았으므로 명령의 출력에 표시되지 않아야 합니다.
공개 키 등록을 요청합니다.
# mokutil --import my_signing_key_pub.der
UEFI 콘솔을 재부팅하고 등록을 완료합니다.
# reboot
시스템 키 링의 키를 다시 확인합니다.
# keyctl list %:.system_keyring
모듈을 원하는 커널의
/extra/
디렉터리에 복사합니다.# cp my_module.ko /lib/modules/$(uname -r)/extra/
모듈식 종속성 목록을 업데이트합니다.
# depmod -a
커널 모듈을 로드하고 성공적으로 로드되었는지 확인합니다.
# modprobe -v my_module # lsmod | grep my_module
부팅 시 모듈을 로드하려면 선택적으로
/etc/modules-loaded.d/my_module.conf
파일에 추가합니다.# echo "my_module" > /etc/modules-load.d/my_module.conf