Como adicionar uma chave pública no chaveiro do sistema para o kernel sem recompilar?

0

Eu quero adicionar uma chave pública do par de chaves que usei para assinar meu módulo do kernel, em system_keyring. No entanto, há um problema:

Com o comando cat /proc/keys | grep system_keyring , eu tenho a entrada (ID) de system_keyring. No entanto, ao tentar adicionar minha chave pública com este comando: keyctl padd asymmetric "" 0xXXXXXXXX</test/signing_key.x509 , recebi o erro "Permissão negada".

Acho que é devido à restrição descrita no "module_signing.txt" link :

Note, however, that the kernel will only permit keys to be added to .system_keyring if the new key's X.509 wrapper is validly signed by a key that is already resident in the .system_keyring at the time the key was added.

No entanto, não consigo encontrar nenhum documento para descrever como assinar o "X.509 wrapper" com a chave já residente no .system_keyring.

Além disso, acho que as chaves nesse chaveiro são apenas chaves públicas. Então, eu nem acho que vai funcionar, mesmo que eu possa extrair a chave pública do chaveiro e assinar o "X.509 wrapper" com essa chave pública.

De qualquer forma, precisamos de ajuda aqui. Ou, mesmo que algo possa me dar uma sugestão de como enviar meu módulo do kernel para o RedHat para que ele possa ser assinado pelo RedHat e instalado na instalação do usuário sem reconstruir o kernel?

    
por Weishan Yang 24.05.2018 / 16:43

1 resposta

1

O chaveiro do sistema obtém seu conteúdo de cinco fontes:

  • chaves incorporadas no kernel em tempo de compilação (obviamente não alteráveis sem recompilar)
  • Variável de inicialização segura da UEFI db - dependendo do seu firmware, você pode ou não conseguir alterar isso
  • Variável de inicialização segura da UEFI dbx - como a anterior, mas esta é uma lista negra, portanto, você não deseja adicionar sua chave aqui mesmo assim
  • chaves incorporadas em shim.efi - não alteráveis sem recompilar, e você provavelmente teria que reinscrever o shim posteriormente, a menos que tenha assumido o controle de sua inicialização segura PK = muito incômodo
  • Variável UEFI MOK (usada por shim.efi ) - essa pode ser sua melhor esperança.

Para importar sua chave para o MOK, você deve primeiro garantir que shim.efi esteja envolvido no seu processo de inicialização (veja efibootmgr -v ).

Em seguida, tenha a chave / certificado com o qual seu módulo está assinado no formato DER e inicie o processo de importação usando o comando mokutil :

mokutil --import your_signing_key.pub.der

O comando exigirá que você defina uma nova senha de importação: essa senha será usada na próxima etapa e não é uma senha anterior. Como de costume ao definir uma nova senha, mokutil exigirá que você digite essa senha duas vezes.

Então, da próxima vez que você reinicializar o sistema, shim.efi verá que uma nova chave MOK está pronta para importação e exigirá que você digite a senha de importação que você definiu na etapa anterior . Depois de fazer isso uma vez, a nova chave será armazenada na variável UEFI MOK de forma persistente, e o kernel a incluirá automaticamente no chaveiro do sistema.

Se você não estiver usando o UEFI, não poderá adicionar novas chaves ao chaveiro do sistema sem recompilar o kernel. Mas, por outro lado, se o Secure Boot não estiver habilitado, o kernel permitirá o carregamento de módulos do kernel sem assinatura ou com uma assinatura não verificável - ele apenas define um dos sinalizadores taint do kernel para marcar que um módulo do kernel não-distribuído foi carregado.

Fonte: Guia de Administração do Kernel do RHEL 7, Capítulo 2.8 "Assinando Módulos do Kernel para Boot Seguro"

    
por 25.05.2018 / 10:24