다시 컴파일하지 않고 커널의 시스템 키링에 공개 키를 어떻게 추가합니까?

다시 컴파일하지 않고 커널의 시스템 키링에 공개 키를 어떻게 추가합니까?

커널 모듈 서명에 사용된 키 쌍의 공개 키를 system_keyring에 추가하고 싶습니다. 그러나 문제가 있습니다.

명령을 통해 cat /proc/keys | grep system_keyringsystem_keyring 항목(ID)을 얻었습니다. 그러나 다음을 사용하여 공개 키를 추가하려고 하면 keyctl padd asymmetric "" 0xXXXXXXXX</test/signing_key.x509"권한 거부" 오류가 발생합니다.

이는 "module_signing.txt"에 설명된 제한 사항 때문인 것 같습니다.https://01.org/linuxgraphics/gfx-docs/drm/admin-guide/module-signing.html:

하지만 커널에서는 .system_keyring에만 키를 추가할 수 있다는 점에 유의하세요.만약에새 키에 대한 X.509 래퍼는 키가 추가될 때 .system_keyring에 이미 있던 키로 유효하게 서명됩니다.

그러나 이미 .system_keyring에 있는 키를 사용하여 "X.509 래퍼"에 서명하는 방법을 설명하는 문서를 찾을 수 없습니다.

그리고 그 키링에 있는 키는 그냥 공개키인 것 같아요. 따라서 키링에서 공개 키를 추출하고 해당 공개 키를 사용하여 "X.509 래퍼"에 서명할 수 있더라도 작동하지 않을 것이라고 생각합니다.

어쨌든 여기에는 도움이 필요합니다. 아니면 커널을 다시 빌드하지 않고도 RedHat에서 서명하고 사용자 설치에 설치할 수 있도록 커널 모듈을 RedHat에 제출하는 방법에 대한 힌트를 줄 수 있는 것이 있다고 하더라도 어떻게 해야 할까요?

답변1

시스템 키링은 다음 다섯 가지 소스에서 콘텐츠를 가져옵니다.

  • 컴파일 타임에 커널에 내장된 키(분명히 재컴파일 없이는 변경할 수 없습니다)
  • UEFI 보안 부팅 변수 db- 펌웨어에 따라 이 변수를 변경하지 못할 수도 있습니다.
  • UEFI 보안 부팅 변수 dbx- 이전 변수와 동일하지만 블랙리스트이므로 여기에 키를 추가하고 싶지 않습니다.
  • 내장 키 shim.efi- 재컴파일하지 않고는 변경할 수 없으며 이미 보안 부팅을 제어할 수 있는 경우가 아니면 나중에 심에 다시 서명해야 할 수도 있습니다. PK= 너무 많은 문제
  • UEFI 변수 MOK(by shim.efi) - 이것이 아마도 최선의 희망일 것입니다.

키를 MOK로 가져오려면 먼저 해당 키가 shim.efi부팅 프로세스에 참여하는지 확인해야 합니다(참고자료 참조 efibootmgr -v).

그런 다음 DER 형식의 모듈에서 서명한 키/인증서를 얻고 다음을 mokutil사용하여 가져오기 프로세스를 시작합니다.

mokutil --import your_signing_key.pub.der

이 명령은 새 가져오기 비밀번호를 설정하라는 메시지를 표시합니다. 이 비밀번호는 다음 단계에서 사용되며 이전에 존재했던 비밀번호가 아닙니다. 평소와 마찬가지로 새 비밀번호를 설정할 때 mokutil비밀번호를 두 번 입력하라는 메시지가 표시됩니다.

그런 다음 다음에 시스템을 재부팅하면 shim.efi새 MOK 키를 가져올 준비가 된 것을 볼 수 있습니다.가져오기 비밀번호를 입력하라는 메시지가 표시됩니다.이전 단계에서 설정했습니다. 이 작업이 한 번 완료되면 새 키가 UEFI MOK 변수에 영구적으로 저장되고 커널이 자동으로 이를 시스템 키링에 포함합니다.

UEFI를 사용하지 않는 경우 커널을 다시 컴파일하지 않으면 시스템 키링에 새 키를 추가할 수 없습니다. 그러나 반면에 보안 부팅이 활성화되지 않은 경우 커널은 서명이 없거나 서명을 확인할 수 없는 커널 모듈을 로드하도록 허용합니다. 이는 단순히 커널 오염 플래그를 설정하여 비릴리스 커널임을 표시하기만 합니다. 모듈이 로드되었습니다. 짐을 실은.

원천:RHEL 7 커널 관리 가이드, 2.8장 "보안 부팅을 위한 커널 모듈 서명"

관련 정보