Por que obtenho a “chave necessária não disponível” ao instalar módulos de kernel de terceiros ou após uma atualização do kernel?

79

Esse problema ocorre apenas em sistemas UEFI com a Inicialização segura ativada.

Quando tento instalar módulos DKMS, como os drivers VirtualBox, Nvidia ou Broadcom, eles não são instalados e eu recebo Required key not availablequando os tento modprobe.

O VirtualBox reclama que vboxdrvnão está carregado.

O wldriver Broadcom é mostrado lspci -kcomo um módulo do kernel, mas não está em uso. sudo modprobe wljoga Required key not available.

Além disso, esse problema pode ocorrer quando eu instalo alguns módulos do kernel a partir de fontes git.

Esse problema pode aparecer após uma atualização do kernel como adaptador sem fio desabilitado, tela preta após uma reinicialização etc.

Como posso corrigir isso?

Pilot6
fonte
Parecido com askubuntu.com/questions/760671/…
Tor Klingberg

Respostas:

85

Desde o Ubuntu kernel 4.4.0-20, a EFI_SECURE_BOOT_SIG_ENFORCEconfiguração do kernel foi ativada. Isso impede o carregamento de módulos de terceiros não assinados, se o UEFI Secure Boot estiver ativado.

A maneira mais fácil de corrigir esse problema é desabilitar a Inicialização segura nas configurações da UEFI (BIOS).

Na maioria dos casos, você pode acessar as configurações da UEFI usando o menu grub. Pressione o ESCbotão na inicialização, entre no menu grub e selecione Configuração do sistema. A opção Inicialização segura deve estar na seção "Segurança" ou "Inicialização" do UEFI.

Você pode entrar no UEFI diretamente, mas isso depende do seu hardware. Leia o manual do computador para ver como chegar lá. Pode ser Del, ou F2na inicialização, ou qualquer outra coisa.

Uma maneira alternativa é desativar o Secure Boot usando mokutil.

Como o kernel do Ubuntu constrói 4.4.0-21.37, isso pode ser corrigido executando

sudo apt install mokutil
sudo mokutil --disable-validation

Será necessário criar uma senha. A senha deve ter pelo menos 8 caracteres. Após a reinicialização, a UEFI perguntará se você deseja alterar as configurações de segurança. Escolha "Sim".

Em seguida, você será solicitado a inserir a senha criada anteriormente. Alguns firmware UEFI solicitam não a senha completa, mas inserem alguns caracteres, como 1º, 3º, etc. Tenha cuidado. Algumas pessoas não entendem isso. Também não o recebi da primeira tentativa ;-)

Atualização: Agora, essa configuração do kernel está ativada em todos os kernels suportados do Ubuntu. Ubuntu 16.04, 15.10 e 14.04 são afetados.

Pilot6
fonte
Isso não funciona para mim. Resposta @Sputnik faz. Ainda assim, eu gostaria de saber por que o mokutil está me pedindo uma senha e quando eu preciso dela?
Alwin Kesler
8
@AlwinKesler Ele pede uma senha que será validada após a reinicialização, antes que as alterações no banco de dados MOK sejam efetivamente realizadas. Sem isso, um processo não autorizado pode alterar as chaves no banco de dados MOK, que se tornam efetivas após a próxima reinicialização. Além disso, agora a plataforma 'sabe' que a pessoa que está solicitando a alteração é a mesma pessoa que está fisicamente presente após a reinicialização e, portanto, aprovou medidas de segurança de hardware, como ter acesso físico à máquina e saber a senha do sistema no momento da inicialização .
Zwets
@ Pilot6: Ainda estou no Ubuntu 14.04 LTS devido a alguns problemas técnicos. Muito obrigado por atualizar a resposta.
Ravi Joshi
3
Trabalhou para mim no Ubuntu 18.04. Não foi possível descobrir por toda a minha vida por que a instalação dos drivers da nvidia não estava funcionando de forma alguma, ou mesmo revertendo para 16.04. Gah! Isso consertou. Tanto tempo perdido.
Nate
1
Meu sistema Ubuntu estava realmente lento. Não fazia sentido, pois era um laptop novinho em folha. Agora percebo que a CPU estava fazendo tudo e minha placa de vídeo estava ociosa o tempo todo. Este link também ajudou - linuxbabe.com/ubuntu/install-nvidia-driver-ubuntu-18-04
Peter Drinnan 23/01
32

Conforme sugerido pelo usuário @zwets, estou copiando (com edições) uma resposta aqui:

Desde a versão 4.4.0-20 do kernel, foi imposto que os módulos não assinados do kernel não poderão executar com o Secure Boot ativado. Se você deseja manter o Secure Boot e também executar esses módulos, a próxima etapa lógica é assinar esses módulos.

Então, vamos tentar.

  1. Criar chaves de assinatura

    openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"
    
  2. Assine o módulo

    sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /path/to/module
    

Nota 1 : Pode haver vários arquivos a serem assinados para um único driver / módulo; portanto, /path/to/modulepode ser necessário substituí-lo por $(modinfo -n <modulename>), por exemplo,$(modinfo -n vboxdrv)

Nota 2 : sudo kmodsign sha512 ./MOK.priv ./MOK.der /path/to/moduleé uma alternativa se sign-filenão estiver disponível.

  1. Registre as chaves no Secure Boot

    sudo mokutil --import MOK.der
    

    Forneça uma senha para uso posterior após a reinicialização

  2. Reboote siga as instruções para registrar o MOK (chave do proprietário da máquina). Aqui está uma amostra com fotos. O sistema irá reiniciar mais uma vez.

Se a chave foi registrada corretamente, ela será exibida em sudo mokutil --list-enrolled.

Por favor, deixe-me saber se seus módulos seriam executados dessa maneira no Ubuntu 16.04 (no kernel 4.4.0-21, acredito).

Recursos: Artigo detalhado do site para implementação do Fedora e Ubuntu da assinatura de módulos. (eles estão trabalhando nisso) ;-)

Recurso adicional: criei um script bash para meu próprio uso sempre que virtualbox-dkmsatualizações e, assim, substitui os módulos assinados. Confira meu vboxsignoriginalmente no GitHub .

Nota adicional para a segurança (extra) consciente: ;-)

Como a chave privada que você criou ( MOK.privneste exemplo) pode ser usada por qualquer pessoa que possa ter acesso a ela, é uma boa prática mantê-la segura. Você pode chmodcriptografar ( gpg) ou armazená-lo em outro lugar seguro (r). Ou, conforme observado neste comentário , remova a opção -nodesna etapa número 1. Isso criptografará a chave com uma senha.

Majal
fonte
No Ubuntu 14.10, continuei vendo a 'chave necessária não disponível' tentando instalar um driver broadcom compilado a partir da fonte, apesar de pré-registrar a chave e assinar o driver. A desativação da validação funcionou.
Mark
1
Isso funcionou para mim no VirtualBox e no Ubuntu 16.04.
YtvwlD 04/08/19
1
Eu recebo o seguinte erro na etapa 3: "As variáveis ​​EFI não são suportadas neste sistema". "dmesg" não possui entradas efi ("dmesg | grep efi" não possui resultados) O que mais posso fazer? Obrigado
musbach
Você pode substituir o caminho com US $ (modinfo -n modulename)
Shane
No Ubuntu 18.04 aqui, o módulo insmod para talpa_syscallhook.ko continua dizendo "Chave necessária não disponível", apesar de eu ter assinado esse módulo e todos os outros módulos no mesmo diretório do Sophos AV, apenas por precaução. A chave foi registrada com sucesso, como posso ver quando listo todas as chaves mok. Alguma idéia de como proceder?
Fran Marzoa 15/03
6

Você pode desativar o Secure Boot (UEFI) no BIOS com as seguintes etapas:

  1. Reinicie sua máquina e entre no menu BIOS (no meu caso, pressione F2)

  2. Procure Inicialização Segura e mude para Legado

Em uma placa mãe ASUS:

  • Vá para o modo avançado (F7)
  • Vá na opção Inicialização segura na seção Inicialização
  • Altere o "modo UEFI do Windows" por "Outro SO"
  • Salve e reinicie para aplicar as configurações (F10)
Sputnik
fonte
2
Inicialização segura e "Legado" são configurações diferentes.
precisa saber é o seguinte
Mas se você tiver a "inicialização herdada" ativada em vez da UEFI, isso implica que a Inicialização Segura não está ativada?
Supernormal
@ Supernormal, sim, é isso que eu entendo.
Sputnik
3

Você também pode desativar o Secure Boot na execução com shim-assinado sudo update-secureboot-policy. Esta página wiki explica este método:

  • Abra um terminal (Ctrl + Alt + T), execute sudo update-secureboot-policy e selecione Sim.
  • Digite uma senha temporária entre 8 e 16 dígitos. (Por exemplo, 12345678, usaremos essa senha posteriormente
  • Digite a mesma senha novamente para confirmar.
  • Reinicie o sistema e pressione qualquer tecla quando aparecer a tela azul (gerenciamento MOK
  • Selecione Alterar estado de inicialização segura
  • Digite a senha que você selecionou na Etapa 2 e pressione Enter.
  • Selecione Sim para desativar a Inicialização segura no shim-assinado.
  • Pressione a tecla Enter para concluir todo o procedimento.

Você ainda pode ativar a Inicialização segura no shim-assinado novamente. Apenas execute

sudo update-secureboot-policy --enable e siga as etapas acima

Kent Lin
fonte