verifikasi modul gagal tanda tangan dan / atau kunci yang diperlukan tidak ada

9

Saya sedang mengerjakan modul kernel, yang berfungsi dengan baik. Namun, melihat melalui dmesg, saya melihat pesan mengenai modul saya bahwa verifikasi modul telah gagal (verifikasi modul gagal tanda tangan dan / atau kunci yang diperlukan hilang).

Bagaimana saya bisa mengatasi masalah ini? Bagaimana saya mendapatkan modul saya ditandatangani untuk verifikasi?

Terima kasih.

pengguna2000888
sumber

Jawaban:

2

Semua yang Anda butuhkan dijelaskan di sini

FASILITAS PENANDATANGANAN MODEL KERNEL


ISI

  • Gambaran.
  • Mengkonfigurasi penandatanganan modul.
  • Menghasilkan kunci penandatanganan.
  • Kunci publik di kernel.
  • Modul penandatanganan secara manual.
  • Modul yang ditandatangani dan stripping.
  • Memuat modul yang ditandatangani.
  • Tanda tangan tidak valid dan modul yang tidak ditandatangani.
  • Mengelola / melindungi kunci pribadi.

GAMBARAN

Fasilitas penandatanganan modul kernel secara kriptografis menandatangani modul selama instalasi dan kemudian memeriksa tanda tangan setelah memuat modul. Hal ini memungkinkan peningkatan keamanan kernel dengan melarang pemuatan modul yang tidak ditandatangani atau modul yang ditandatangani dengan kunci yang tidak valid. Penandatanganan modul meningkatkan keamanan dengan membuatnya lebih sulit memuat modul jahat ke dalam kernel. Pemeriksaan tanda tangan modul dilakukan oleh kernel sehingga tidak perlu memiliki bit userspace yang tepercaya.

Fasilitas ini menggunakan sertifikat standar X.509 ITU-T untuk menyandikan kunci publik yang terlibat. Tanda tangan itu sendiri tidak dikodekan dalam jenis standar industri apa pun. Fasilitas saat ini hanya mendukung standar enkripsi kunci publik RSA (meskipun dapat dicolokkan dan memungkinkan orang lain untuk digunakan). Algoritma hash yang mungkin dapat digunakan adalah SHA-1, SHA-224, SHA-256, SHA-384, dan SHA-512 (algoritma dipilih oleh data dalam tanda tangan).


MENGONFIGURASI PENANDAAN MODUL

Fasilitas penandatanganan modul diaktifkan dengan masuk ke bagian "Aktifkan Dukungan Modul yang Dapat Dimuat" dari konfigurasi kernel dan menghidupkan

CONFIG_MODULE_SIG   "Module signature verification"

Ini memiliki sejumlah opsi yang tersedia:

  1. "Membutuhkan modul untuk ditandatangani secara sah" (CONFIG_MODULE_SIG_FORCE)

    Ini menentukan bagaimana kernel harus berurusan dengan modul yang memiliki tanda tangan di mana kunci tidak diketahui atau modul yang tidak ditandatangani.

    Jika ini tidak aktif (mis. "Permisif"), maka modul yang kuncinya tidak tersedia dan modul yang tidak ditandatangani diizinkan, tetapi kernel akan ditandai sebagai tercemar, dan modul yang bersangkutan akan ditandai sebagai tercemar, ditampilkan dengan karakter 'E'.

    Jika ini aktif (mis. "Restriktif"), hanya modul yang memiliki tanda tangan yang valid yang dapat diverifikasi oleh kunci publik yang dimiliki kernel yang akan dimuat. Semua modul lain akan menghasilkan kesalahan.

    Terlepas dari pengaturan di sini, jika modul memiliki blok tanda tangan yang tidak dapat diuraikan, itu akan ditolak begitu saja.

  2. "Secara otomatis tandatangani semua modul" (CONFIG_MODULE_SIG_ALL)

    Jika ini aktif maka modul akan ditandatangani secara otomatis selama fase modules_install dari build. Jika ini mati, maka modul harus ditandatangani secara manual menggunakan:

    scripts/sign-file
    
  3. "Algoritma hash mana yang harus ditandatangani modul?"

    Ini menyajikan pilihan algoritma hash yang tahap instalasi akan menandatangani modul dengan:

    CONFIG_MODULE_SIG_SHA1      "Sign modules with SHA-1"
    CONFIG_MODULE_SIG_SHA224    "Sign modules with SHA-224"
    CONFIG_MODULE_SIG_SHA256    "Sign modules with SHA-256"
    CONFIG_MODULE_SIG_SHA384    "Sign modules with SHA-384"
    CONFIG_MODULE_SIG_SHA512    "Sign modules with SHA-512"
    

    Algoritme yang dipilih di sini juga akan dibangun ke dalam kernel (bukan menjadi modul) sehingga modul yang ditandatangani dengan algoritma itu dapat diperiksa tanda tangannya tanpa menyebabkan loop ketergantungan.

  4. "Nama file atau PKCS # 11 URI dari kunci penandatanganan modul" (CONFIG_MODULE_SIG_KEY)

    Mengatur opsi ini ke sesuatu selain dari standarnya "certs / signed_key.pem" akan menonaktifkan autogeneration kunci penandatanganan dan memungkinkan modul kernel untuk ditandatangani dengan kunci pilihan Anda. String yang disediakan harus mengidentifikasi file yang berisi kunci privat dan sertifikat X.509 terkait dalam formulir PEM, atau - pada sistem di mana OpenSSL ENGINE_pkcs11 berfungsi - sebuah URI PKCS # 11 sebagaimana didefinisikan oleh RFC7512. Dalam kasus terakhir, URI PKCS # 11 harus merujuk sertifikat dan kunci pribadi.

    Jika file PEM yang berisi kunci pribadi dienkripsi, atau jika token PKCS # 11 memerlukan PIN, ini dapat diberikan pada waktu pembangunan dengan menggunakan variabel KBUILD_SIGN_PIN.

  5. "Kunci X.509 tambahan untuk sistem kunci standar" (CONFIG_SYSTEM_TRUSTED_KEYS)

    Opsi ini dapat diatur ke nama file dari file yang dikodekan PEM yang berisi sertifikat tambahan yang akan dimasukkan dalam sistem keyring secara default.

Perhatikan bahwa mengaktifkan penandatanganan modul menambah ketergantungan pada paket devel OpenSSL ke proses pembuatan kernel untuk alat yang melakukan penandatanganan.


MENGHASILKAN KUNCI PENANDATANGANAN

Diperlukan keypairs kriptografis untuk menghasilkan dan memeriksa tanda tangan. Kunci pribadi digunakan untuk menghasilkan tanda tangan dan kunci publik yang sesuai digunakan untuk memeriksanya. Kunci pribadi hanya diperlukan selama pembangunan, setelah itu dapat dihapus atau disimpan dengan aman. Kunci publik akan dibangun ke dalam kernel sehingga dapat digunakan untuk memeriksa tanda tangan saat modul dimuat.

Dalam kondisi normal, ketika CONFIG_MODULE_SIG_KEY tidak berubah dari standarnya, kernel build akan secara otomatis menghasilkan keypair baru menggunakan openssl jika tidak ada dalam file:

certs/signing_key.pem

selama membangun vmlinux (bagian publik dari kunci perlu dibangun ke dalam vmlinux) menggunakan parameter dalam:

certs/x509.genkey

file (yang juga dihasilkan jika belum ada).

Sangat disarankan agar Anda memberikan file x509.genkey Anda sendiri.

Terutama, dalam file x509.genkey, bagian req_distinguished_name harus diubah dari default:

[ req_distinguished_name ]
#O = Unspecified company
CN = Build time autogenerated kernel key
#emailAddress = [email protected]

Ukuran kunci RSA yang dihasilkan juga dapat diatur dengan:

[ req ]
default_bits = 4096

Juga dimungkinkan untuk secara manual menghasilkan file pribadi / publik kunci menggunakan file konfigurasi pembuatan kunci x509.genkey di simpul akar pohon sumber kernel Linux dan perintah openssl. Berikut ini adalah contoh untuk menghasilkan file kunci publik / pribadi:

openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 \
   -config x509.genkey -outform PEM -out kernel_key.pem \
   -keyout kernel_key.pem

Pathname lengkap untuk file kernel_key.pem yang dihasilkan kemudian dapat ditentukan dalam opsi CONFIG_MODULE_SIG_KEY, dan sertifikat dan kunci di dalamnya akan digunakan sebagai pengganti keypair yang diautogasi secara otomatis.


KUNCI PUBLIK DI KERNEL

Kernel berisi cincin kunci publik yang dapat dilihat oleh root. Mereka berada di keyring yang disebut ".system_keyring" yang dapat dilihat oleh:

[root@deneb ~]# cat /proc/keys
...
223c7853 I------     1 perm 1f030000     0     0 keyring   .system_keyring: 1
302d2d52 I------     1 perm 1f010000     0     0 asymmetri Fedora kernel signing key: d69a84e6bce3d216b979e9505b3e3ef9a7118079: X509.RSA a7118079 []
...

Di luar kunci publik yang dibuat khusus untuk penandatanganan modul, sertifikat tepercaya tambahan dapat diberikan dalam file berkode PEM yang dirujuk oleh opsi konfigurasi CONFIG_SYSTEM_TRUSTED_KEYS.

Selanjutnya, kode arsitektur dapat mengambil kunci publik dari toko perangkat keras dan menambahkannya juga (misalnya dari basis data kunci UEFI).

Akhirnya, dimungkinkan untuk menambahkan kunci publik tambahan dengan melakukan:

keyctl padd asymmetric "" [.system_keyring-ID] <[key-file]

misalnya:

keyctl padd asymmetric "" 0x223c7853 <my_public_key.x509

Perhatikan, bagaimanapun, bahwa kernel hanya akan mengizinkan kunci untuk ditambahkan ke .system_keyring jika pembungkus kunci X.509 baru secara sah ditandatangani oleh kunci yang sudah ada di .system_keyring pada saat kunci ditambahkan.


MODUL PENANDAAN MANUAL

Untuk secara manual menandatangani modul, gunakan alat skrip / file-tanda yang tersedia di pohon sumber kernel Linux. Script membutuhkan 4 argumen:

1.  The hash algorithm (e.g., sha256)
2.  The private key filename or PKCS#11 URI
3.  The public key filename
4.  The kernel module to be signed

Berikut ini adalah contoh untuk menandatangani modul kernel:

scripts/sign-file sha512 kernel-signkey.priv \
    kernel-signkey.x509 module.ko

Algoritme hash yang digunakan tidak harus cocok dengan yang dikonfigurasi, tetapi jika tidak, Anda harus memastikan bahwa algoritma hash dibangun ke dalam kernel atau dapat dimuat tanpa perlu sendiri.

Jika kunci pribadi memerlukan frasa sandi atau PIN, itu dapat diberikan dalam variabel lingkungan $ KBUILD_SIGN_PIN.


MODUL DAN STRIPPING YANG DITANDATANGANI

Modul yang ditandatangani memiliki tanda tangan digital yang ditambahkan di bagian akhir. String "~ Modul signature ditambahkan ~." pada akhir file modul mengkonfirmasi bahwa ada tanda tangan tetapi tidak mengkonfirmasi bahwa tanda tangan itu valid!

Modul yang ditandatangani BRITTLE karena tanda tangannya berada di luar wadah ELF yang ditentukan. Dengan demikian mereka TIDAK MUNGKIN dilucuti begitu tanda tangan dihitung dan dilampirkan. Catatan seluruh modul adalah muatan yang ditandatangani, termasuk setiap dan semua informasi debug yang hadir pada saat penandatanganan.


MODUL MENDAFTAR TANDA

Modul dimuat dengan insmod, modprobe, init_module () atau finit_module (), persis seperti untuk modul yang tidak ditandatangani karena tidak ada pemrosesan yang dilakukan di ruang pengguna. Pemeriksaan tanda tangan dilakukan di dalam kernel.


TANDA TANGAN NON-VALID DAN MODUL TANGAN TANDA TANGAN

Jika CONFIG_MODULE_SIG_FORCE diaktifkan atau penegcemodulesig = 1 diberikan pada baris perintah kernel, kernel hanya akan memuat modul yang ditandatangani secara sah yang memiliki kunci publik. Jika tidak, itu juga akan memuat modul yang tidak ditandatangani. Modul apa pun yang memiliki kunci kernel, tetapi yang terbukti memiliki ketidakcocokan tanda tangan tidak akan diizinkan untuk memuat.

Modul apa pun yang memiliki tanda tangan tidak dapat dihapus akan ditolak.


ADMINISTERING / MELINDUNGI KUNCI PRIVATE

Karena kunci pribadi digunakan untuk menandatangani modul, virus dan malware dapat menggunakan kunci pribadi untuk menandatangani modul dan membahayakan sistem operasi. Kunci pribadi harus dihancurkan atau dipindahkan ke lokasi yang aman dan tidak disimpan di simpul akar pohon sumber kernel.

AB
sumber
Terima kasih tetapi, saya benar-benar melihat teks ini sebelumnya. Masalah yang saya hadapi adalah meskipun saya dapat menandatangani file saya, saya tidak dapat memuat file tersebut karena: "kernelnya hanya akan mengizinkan kunci untuk ditambahkan ke .system_keyring jika pembungkus kunci X.509 baru secara sah ditandatangani oleh kunci yang sudah ada di .system_keyring pada saat kunci ditambahkan. "
OmnipotentEntity
Saya telah melihat ini beberapa kali juga tetapi tidak membantu. Ada bug di Ubuntu yang memengaruhi semua motherboard yang tidak mendukung uefi: bugs.launchpad.net/ubuntu/+source/linux-lts-xenial/+bug/1656670
musbach
0

Edit ./include/generated/autoconf.hdan ubah jalurnya

define CONFIG_MODULE_SIG 1

untuk

define CONFIG_MODULE_SIG 0
daniel
sumber