Mengapa saya mendapatkan "kunci yang diperlukan tidak tersedia" ketika menginstal modul kernel pihak ke-3 atau setelah upgrade kernel?

79

Masalah ini hanya terjadi pada sistem UEFI dengan Boot Aman yang diaktifkan.

Ketika saya mencoba untuk menginstal modul DKMS seperti VirtualBox, Nvidia, atau driver Broadcom, mereka tidak menginstal dan saya dapatkan Required key not availableketika saya mencoba modprobemereka.

VirtualBox mengeluh bahwa vboxdrvtidak dimuat.

wlDriver Broadcom ditampilkan lspci -ksebagai modul kernel tetapi tidak digunakan. sudo modprobe wlmelempar Required key not available.

Juga masalah ini dapat terjadi ketika saya menginstal beberapa modul kernel dari sumber git.

Masalah ini dapat muncul setelah pembaruan kernel sebagai adaptor nirkabel yang dinonaktifkan, layar hitam setelah reboot, dll.

Bagaimana saya bisa memperbaikinya?

Pilot6
sumber
Serupa: askubuntu.com/questions/760671/…
Tor Klingberg

Jawaban:

85

Sejak Ubuntu 4.4.4-20, EFI_SECURE_BOOT_SIG_ENFORCEkonfigurasi kernel telah diaktifkan. Itu mencegah dari memuat modul pihak ketiga yang tidak ditandatangani jika UEFI Secure Boot diaktifkan.

Cara termudah untuk memperbaiki masalah ini adalah dengan menonaktifkan Secure Boot di pengaturan UEFI (BIOS).

Dalam kebanyakan kasus, Anda dapat masuk ke pengaturan UEFI menggunakan menu grub. Tekan ESCtombol saat boot, masuk ke menu grub dan pilih Pengaturan Sistem. Opsi Boot Aman harus di bagian "Keamanan" atau "Boot" di UEFI.

Anda dapat masuk ke UEFI secara langsung, tetapi itu tergantung pada perangkat keras Anda. Baca manual komputer Anda untuk melihat bagaimana menuju ke sana. Mungkin Del, atau F2saat boot, atau sesuatu yang lain.

Cara alternatif adalah dengan menonaktifkan Boot Aman menggunakan mokutil.

Karena kernel Ubuntu build 4.4.0-21.37 ini dapat diperbaiki dengan menjalankan

sudo apt install mokutil
sudo mokutil --disable-validation

Anda harus membuat kata sandi. Panjang kata sandi minimal harus 8 karakter. Setelah Anda reboot, UEFI akan menanyakan apakah Anda ingin mengubah pengaturan keamanan. Pilih "Ya".

Kemudian Anda akan diminta untuk memasukkan kata sandi yang dibuat sebelumnya. Beberapa firmware UEFI meminta bukan kata sandi lengkap, tetapi untuk memasukkan beberapa karakternya, seperti 1, 3, dll. Hati-hati. Beberapa orang tidak mengerti ini. Saya tidak mendapatkannya dari upaya pertama juga ;-)

Pembaruan: Sekarang konfigurasi kernel ini diaktifkan di semua kernel Ubuntu yang didukung. Ubuntu 16.04, 15.10 dan 14.04 terpengaruh.

Pilot6
sumber
Ini tidak berhasil untuk saya. Jawaban @Sputnik tidak. Tapi tetap saja, saya ingin tahu mengapa mokutil meminta saya kata sandi dan kapan saya membutuhkannya?
Alwin Kesler
8
@AlwinKesler Ia meminta kata sandi yang akan divalidasi setelah reboot, sebelum perubahan ke database MOK benar-benar dilakukan. Tanpa ini, proses jahat dapat mengubah kunci dalam database MOK yang menjadi efektif setelah reboot berikutnya. Juga, sekarang platform 'tahu' bahwa orang yang meminta perubahan adalah orang yang sama yang secara fisik hadir setelah reboot, dan karenanya akan melewati langkah-langkah keamanan perangkat keras, seperti memiliki akses fisik ke mesin dan mengetahui kata sandi sistem waktu boot .
zwets
@ Pilot6: Saya masih menggunakan Ubuntu 14.04 LTS karena beberapa masalah teknis. Terima kasih banyak telah memperbarui jawabannya.
Ravi Joshi
3
Bekerja untuk saya di Ubuntu 18.04. Tidak dapat mengetahui selama hidup saya mengapa menginstal driver nvidia tidak berfungsi dengan cara apa pun, atau bahkan dengan kembali ke 16.04. Gah! Ini memperbaikinya. Begitu banyak waktu yang terbuang.
Nate
1
Sistem Ubuntu saya benar-benar lamban. Tidak masuk akal karena ini adalah laptop baru. Sekarang saya menyadari CPU melakukan semuanya dan kartu video saya duduk diam sepanjang waktu. Tautan ini juga membantu - linuxbabe.com/ubuntu/install-nvidia-driver-ubuntu-18-04
Peter Drinnan
32

Seperti yang disarankan oleh pengguna @zwets, saya menyalin (dengan pengeditan) jawaban di sini:

Sejak kernel versi 4.4.0-20, diberlakukan bahwa modul kernel yang tidak ditandatangani tidak akan diizinkan berjalan dengan Secure Boot diaktifkan. Jika Anda ingin menjaga Boot Aman dan juga menjalankan modul-modul ini, maka langkah logis berikutnya adalah menandatangani modul-modul tersebut.

Jadi mari kita coba.

  1. Buat kunci penandatanganan

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

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

Catatan 1 : Mungkin ada beberapa file yang akan ditandatangani untuk satu driver / modul, jadi /path/to/modulemungkin perlu diganti dengan $(modinfo -n <modulename>), misalnya$(modinfo -n vboxdrv)

Catatan 2 : sudo kmodsign sha512 ./MOK.priv ./MOK.der /path/to/moduleadalah alternatif jika sign-filetidak tersedia.

  1. Daftarkan tombol-tombol tersebut ke Secure Boot

    sudo mokutil --import MOK.der
    

    Masukkan kata sandi untuk digunakan nanti setelah reboot

  2. Rebootdan ikuti instruksi untuk Mendaftar MOK (Kunci Pemilik Mesin). Ini contoh dengan gambar. Sistem akan reboot sekali lagi.

Jika kunci telah didaftarkan dengan benar, itu akan muncul di bawah sudo mokutil --list-enrolled.

Tolong beri tahu saya jika modul Anda akan berjalan dengan cara ini di Ubuntu 16.04 (pada kernel 4.4.0-21, saya percaya).

Sumber: Artikel situs web terperinci untuk implementasi modul penandatanganan Fedora dan Ubuntu . (mereka sudah mengusahakannya) ;-)

Sumber daya tambahan: Saya membuat skrip bash untuk saya gunakan sendiri setiap kali virtualbox-dkmsupgrade dan dengan demikian menimpa modul yang ditandatangani. Lihat vboxsignaslinya di GitHub .

Catatan tambahan untuk keamanan (tambahan-) yang sadar: ;-)

Karena kunci pribadi yang Anda buat ( MOK.privdalam contoh ini) dapat digunakan oleh siapa saja yang dapat mengaksesnya, praktik yang baik adalah menjaga keamanannya. Anda dapat chmod, mengenkripsi ( gpg), atau menyimpannya di tempat lain yang aman (r). Atau, seperti disebutkan dalam komentar ini , hapus opsi -nodesdi langkah nomor 1. Ini akan mengenkripsi kunci dengan frasa sandi.

Majal
sumber
Di Ubuntu 14.10 saya terus melihat 'kunci yang diperlukan tidak tersedia' mencoba menginstal driver broadcom yang dikompilasi dari sumber, meskipun melakukan pra-registrasi kunci dan menandatangani driver. Menonaktifkan validasi berfungsi.
Tandai
1
Ini bekerja untuk saya untuk VirtualBox dan Ubuntu 16.04.
YtvwlD
1
Saya mendapatkan kesalahan berikut pada langkah 3: "Variabel EFI tidak didukung pada sistem ini". "dmesg" tidak memiliki entri efi ("dmesg | grep efi" tidak memiliki hasil) Apa lagi yang bisa saya lakukan? Terima kasih
musbach
Anda dapat mengganti jalur dengan $ (modinfo -n modulename)
Shane
Pada Ubuntu 18.04 di sini, modul insmod untuk talpa_syscallhook.ko terus mengatakan "Kunci yang diperlukan tidak tersedia" meskipun saya telah menandatangani modul itu, dan semua modul lain dalam direktori yang sama untuk Sophos AV untuk berjaga-jaga. Kunci telah berhasil didaftarkan seperti yang saya lihat ketika saya mendaftar semua kunci mok. Ada ide tentang bagaimana untuk melanjutkan?
Fran Marzoa
6

Anda dapat menonaktifkan Secure Boot (UEFI) di BIOS dengan langkah-langkah berikut:

  1. Nyalakan ulang mesin Anda dan masuk ke Menu BIOS (Dalam kasus saya, menekan F2)

  2. Cari Boot Aman dan ubah ke Legacy

Di motherboard ASUS:

  • Pergi ke Mode Lanjut (F7)
  • Masuk ke opsi Boot Aman di bawah bagian Boot
  • Ubah "mode Windows UEFI" dengan "OS Lainnya"
  • Simpan dan mulai ulang untuk menerapkan pengaturan (F10)
Sputnik
sumber
2
Boot Aman dan "Legacy" adalah pengaturan yang berbeda.
Pilot6
Tetapi jika Anda mengaktifkan "boot lawas" alih-alih UEFI, apakah itu berarti bahwa Boot Aman tidak diaktifkan?
Supernormal
@ Normal, ya, ini yang saya mengerti.
Sputnik
3

Anda juga dapat Nonaktifkan Boot Aman saat berjalan dengan tanda tangan shim sudo update-secureboot-policy. Ini halaman wiki menjelaskan metode ini:

  • Buka terminal (Ctrl + Alt + T), dan jalankan sudo update-secureboot-policy dan kemudian pilih Ya.
  • Masukkan kata sandi sementara antara 8 hingga 16 digit. (Misalnya, 12345678, kami akan menggunakan kata sandi ini nanti
  • Masukkan kata sandi yang sama lagi untuk mengonfirmasi.
  • Nyalakan ulang sistem dan tekan tombol apa saja ketika Anda melihat layar biru (manajemen MOK
  • Pilih Ubah status Boot Aman
  • Masukkan kata sandi yang Anda pilih pada Langkah 2 dan tekan Enter.
  • Pilih Ya untuk menonaktifkan Boot Aman di tanda tangani.
  • Tekan tombol Enter untuk menyelesaikan seluruh prosedur.

Anda masih dapat mengaktifkan Boot Aman di bertanda shim lagi. Eksekusi saja

sudo update-secureboot-policy - aktifkan lalu ikuti langkah-langkah di atas

Kent Lin
sumber