Dlaczego dostaję „Wymagany klucz niedostępny” podczas instalacji modułów jądra innych firm lub po aktualizacji jądra?

79

Ten problem występuje tylko w systemach UEFI z włączonym Bezpiecznym uruchomieniem.

Kiedy próbuję zainstalować moduły DKMS, takie jak VirtualBox, Nvidia lub sterowniki Broadcom, nie instalują się one i Required key not availablepojawia się, gdy próbuję modprobeje zainstalować .

VirtualBox narzeka, że vboxdrvnie jest załadowany.

Sterownik Broadcom wljest pokazany lspci -kjako moduł jądra, ale nie jest używany. sudo modprobe wlrzuca Required key not available.

Ten problem może również wystąpić, gdy instaluję niektóre moduły jądra ze źródeł git.

Ten problem może pojawić się po aktualizacji jądra jako wyłączony adapter bezprzewodowy, czarny ekran po ponownym uruchomieniu itp.

Jak mogę to naprawić?

Pilot 6
źródło
Podobne: askubuntu.com/questions/760671/…
Tor Klingberg

Odpowiedzi:

85

Od jądra Ubuntu 4.4.0-20 EFI_SECURE_BOOT_SIG_ENFORCEkonfiguracja jądra została włączona. Zapobiega to ładowaniu niepodpisanych modułów stron trzecich, jeśli włączony jest Bezpieczny rozruch UEFI.

Najłatwiejszym sposobem rozwiązania tego problemu jest wyłączenie Bezpiecznego rozruchu w ustawieniach UEFI (BIOS).

W większości przypadków możesz przejść do ustawień UEFI za pomocą menu grub. Naciśnij ESCprzycisk podczas uruchamiania, przejdź do menu grub i wybierz Ustawienia systemu. Opcja Bezpiecznego rozruchu powinna znajdować się w sekcji „Zabezpieczenia” lub „Uruchomienie” interfejsu UEFI.

Możesz dostać się bezpośrednio do UEFI, ale zależy to od twojego sprzętu. Przeczytaj instrukcję obsługi komputera, aby dowiedzieć się, jak się tam dostać. Może to być Delalbo F2przy rozruchu, albo coś innego.

Alternatywnym sposobem jest wyłączenie Bezpiecznego rozruchu za pomocą mokutil.

Ponieważ kompilacja jądra Ubuntu 4.4.0-21.37 można to naprawić, uruchamiając

sudo apt install mokutil
sudo mokutil --disable-validation

Będzie to wymagało utworzenia hasła. Hasło powinno mieć co najmniej 8 znaków. Po ponownym uruchomieniu UEFI zapyta, czy chcesz zmienić ustawienia zabezpieczeń. Wybierz „Tak”.

Następnie zostaniesz poproszony o wprowadzenie wcześniej utworzonego hasła. Niektóre oprogramowanie układowe UEFI prosi nie o pełne hasło, ale o wprowadzenie niektórych jego znaków, takich jak 1., 3. itd. Bądź ostrożny. Niektórzy ludzie tego nie rozumieją. Nie dostałem go od pierwszej próby ;-)

Aktualizacja: teraz ta konfiguracja jądra jest włączona we wszystkich obsługiwanych jądrach Ubuntu. Dotyczy to Ubuntu 16.04, 15.10 i 14.04.

Pilot 6
źródło
To mi nie działa. Odpowiedź @Sputnik ma. Ale nadal chciałbym wiedzieć, dlaczego mokutil prosi mnie o hasło i kiedy go potrzebuję?
Alwin Kesler
8
@AlwinKesler Pyta o hasło, które zweryfikuje po ponownym uruchomieniu, zanim zmiany w bazie danych MOK zostaną faktycznie wprowadzone. Bez tego nieuczciwy proces mógłby zmienić klucze w bazie danych MOK, które zaczną obowiązywać po następnym uruchomieniu. Ponadto platforma teraz „wie”, że osoba żądająca zmiany jest tą samą osobą, która jest fizycznie obecna po ponownym uruchomieniu komputera, a zatem przeszła środki bezpieczeństwa sprzętowego, takie jak fizyczny dostęp do komputera i znajomość hasła systemowego czasu rozruchu .
zwets
@ Pilot6: Nadal korzystam z systemu Ubuntu 14.04 LTS z powodu problemów technicznych. Wielkie dzięki za aktualizację odpowiedzi.
Ravi Joshi
3
Pracował dla mnie na Ubuntu 18.04. Nie mogłem zrozumieć przez całe życie, dlaczego instalowanie sterowników nvidii nie działało w żaden sposób, ani nawet przez powrót do 16.04. Gah! To naprawiło to. Tyle straconego czasu.
Nate,
1
Mój system Ubuntu był bardzo opóźniony. Nie miało to sensu, ponieważ był to nowy laptop. Teraz zdaję sobie sprawę, że procesor robił wszystko, a moja karta graficzna cały czas siedziała bezczynnie. Ten link również pomógł - linuxbabe.com/ubuntu/install-nvidia-driver-ubuntu-18-04
Peter Drinnan
32

Zgodnie z sugestią użytkownika @zwets, kopiuję (z edycjami) odpowiedź tutaj:

Od wersji jądra 4.4.0-20 wymuszono, że niepodpisane moduły jądra nie będą mogły działać przy włączonym Bezpiecznym rozruchu. Jeśli chcesz zachować bezpieczny rozruch, a także uruchomić te moduły, następnym logicznym krokiem jest podpisanie tych modułów.

Więc spróbujmy.

  1. Utwórz klucze do podpisywania

    openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"
    
  2. Podpisz moduł

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

Uwaga 1 : Może istnieć wiele plików do podpisania dla jednego sterownika / modułu, więc /path/to/modulemoże być konieczne zastąpienie go $(modinfo -n <modulename>)np$(modinfo -n vboxdrv)

Uwaga 2 : sudo kmodsign sha512 ./MOK.priv ./MOK.der /path/to/modulejest alternatywą, jeśli sign-filenie jest dostępna.

  1. Zarejestruj klucze do bezpiecznego rozruchu

    sudo mokutil --import MOK.der
    

    Podaj hasło do późniejszego użycia po ponownym uruchomieniu

  2. Rebooti postępuj zgodnie z instrukcjami, aby zarejestrować MOK (klucz właściciela maszyny). Oto próbka ze zdjęciami. System uruchomi się ponownie.

Jeśli klucz został poprawnie zarejestrowany, pojawi się pod sudo mokutil --list-enrolled.

Daj mi znać, jeśli twoje moduły będą działać w ten sposób na Ubuntu 16.04 (jak sądzę na jądrze 4.4.0-21).

Zasoby: Szczegółowy artykuł na stronie internetowej dotyczący implementacji podpisywania modułów przez Fedorę i Ubuntu . (pracowali nad tym) ;-)

Dodatkowy zasób: Utworzyłem skrypt bash na własny użytek za każdym razem, gdy przeprowadzana jest virtualbox-dkmsaktualizacja, i dlatego zastępuje podpisane moduły. Sprawdź mój vboxsignpierwotnie na GitHub .

Dodatkowa uwaga dla osób świadomych bezpieczeństwa: ;-)

Ponieważ utworzonego klucza prywatnego ( MOK.privw tym przykładzie) może używać każdy, kto może mieć do niego dostęp, dobrą praktyką jest zabezpieczenie go. Możesz chmodto, zaszyfrować ( gpg) lub zapisać w innym bezpiecznym miejscu (r). Lub, jak zauważono w tym komentarzu , usuń opcję -nodesw kroku 1. Spowoduje to zaszyfrowanie klucza za pomocą hasła.

Majal
źródło
Na Ubuntu 14.10 nadal widziałem „wymagany klucz niedostępny”, próbując zainstalować sterownik Broadcom skompilowany ze źródła, pomimo wcześniejszej rejestracji klucza i podpisania sterownika. Wyłączenie sprawdzania poprawności zadziałało.
Mark
1
To działało dla mnie dla VirtualBox i Ubuntu 16.04.
YtvwlD
1
W kroku 3 pojawia się następujący błąd: „Zmienne EFI nie są obsługiwane w tym systemie”. „dmesg” nie ma wpisów efi („dmesg | grep efi” nie ma wyników) Co jeszcze mogę zrobić? Dzięki
musbach,
Możesz zamienić ścieżkę na $ (modinfo -n modulename)
Shane,
Na Ubuntu 18.04 tutaj insmod dla modułu talpa_syscallhook.ko kontynuuje powiedzenie „Wymagany klucz niedostępny” pomimo podpisania tego modułu i wszystkich innych modułów w tym samym katalogu dla Sophos AV na wszelki wypadek. Klucz został pomyślnie zarejestrowany, ponieważ widzę go, gdy wyświetlam listę wszystkich kluczy Mok. Wszelkie pomysły, jak postępować?
Fran Marzoa,
6

Możesz wyłączyć Bezpieczny rozruch (UEFI) w systemie BIOS, wykonując następujące czynności:

  1. Uruchom ponownie urządzenie i wejdź do menu BIOS (w moim przypadku naciśnięcie F2)

  2. Wyszukaj Bezpieczny rozruch i zmień na Legacy

Na płycie głównej ASUS:

  • Przejdź do trybu zaawansowanego (F7)
  • Przejdź do opcji Bezpiecznego rozruchu w sekcji Boot
  • Zmień „Windows UEFI mode” za pomocą „Other OS”
  • Zapisz i uruchom ponownie, aby zastosować ustawienia (F10)
Sputnik
źródło
2
Bezpieczny rozruch i „Starsze” to różne ustawienia.
Pilot6,
Ale jeśli masz włączoną funkcję „starszego rozruchu” zamiast UEFI, czy oznacza to, że Bezpieczny rozruch nie jest włączony?
Supernormal
@ Supernormal, tak, właśnie to rozumiem.
Sputnik
3

Możesz także wyłączyć Bezpieczny rozruch podczas pracy z podpisem shim sudo update-secureboot-policy. Ta strona wiki wyjaśnia tę metodę:

  • Otwórz terminal (Ctrl + Alt + T) i uruchom sudo update-secureboot-policy, a następnie wybierz Tak.
  • Wprowadź tymczasowe hasło zawierające od 8 do 16 cyfr. (Na przykład 12345678, użyjemy tego hasła później
  • Wprowadź to samo hasło ponownie, aby potwierdzić.
  • Uruchom ponownie system i naciśnij dowolny klawisz, gdy zobaczysz niebieski ekran (zarządzanie MOK
  • Wybierz Zmień stan bezpiecznego rozruchu
  • Wprowadź hasło wybrane w kroku 2 i naciśnij klawisz Enter.
  • Wybierz Tak, aby wyłączyć Bezpieczny rozruch w podpisie tymczasowej.
  • Naciśnij klawisz Enter, aby zakończyć całą procedurę.

Nadal możesz włączyć Bezpieczny rozruch w podpisie tymczasowej. Po prostu wykonaj

sudo update-secureboot-policy - włącz, a następnie wykonaj powyższe kroki

Kent Lin
źródło