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:
"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.
"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
"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.
"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.
"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 = unspecified.user@unspecified.company
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.