İhtiyacınız olan her şey burada açıklanmıştır
KERNEL MODÜL İMZA TESİSİ
İÇİNDEKİLER
- Genel Bakış.
- Modül imzalamayı yapılandırma.
- İmza anahtarları oluşturuluyor.
- Çekirdekteki ortak anahtarlar.
- Modülleri manuel olarak imzalama.
- İmzalı modüller ve sıyırma.
- İmzalı modüller yükleniyor.
- Geçersiz imzalar ve imzasız modüller.
- Özel anahtarı yönetme / koruma.
GENEL BAKIŞ
Çekirdek modülü imzalama tesisi, kurulum sırasında modülleri kriptografik olarak imzalar ve modülü yükledikten sonra imzayı kontrol eder. Bu, imzasız modüllerin veya geçersiz bir anahtarla imzalanmış modüllerin yüklenmesine izin vermeyerek çekirdek güvenliğinin artırılmasına olanak tanır. Modül imzalama, çekirdeğe kötü amaçlı bir modül yüklenmesini zorlaştırarak güvenliği artırır. Modül imza denetimi çekirdek tarafından yapılır, böylece güvenilir kullanıcı alanı bitlerine sahip olmak gerekmez.
Bu özellik, ilgili ortak anahtarları kodlamak için X.509 ITU-T standart sertifikalarını kullanır. İmzaların kendisi herhangi bir endüstriyel standart tipinde kodlanmamıştır. Tesis şu anda yalnızca RSA ortak anahtar şifreleme standardını desteklemektedir (ancak takılabilir ve diğerlerinin kullanılmasına izin verir). Kullanılabilecek olası karma algoritmalar SHA-1, SHA-224, SHA-256, SHA-384 ve SHA-512'dir (algoritma imzadaki veriler tarafından seçilir).
MODÜL İŞARETİNİN YAPILANDIRILMASI
Modül imzalama özelliği, çekirdek yapılandırmasının "Yüklenebilir Modül Desteğini Etkinleştir" bölümüne gidip açılarak etkinleştirilir.
CONFIG_MODULE_SIG "Module signature verification"
Bunun mevcut bir dizi seçeneği vardır:
"Modüllerin geçerli olarak imzalanmasını zorunlu kıl" (CONFIG_MODULE_SIG_FORCE)
Bu, çekirdeğin, anahtarı bilinmeyen bir imzası olan bir modülle veya imzasız bir modülle nasıl ilgilenmesi gerektiğini belirtir.
Bu kapalıysa (yani "izin verici"), anahtarın kullanılamadığı ve imzasız modüllere izin verilir, ancak çekirdek lekeli olarak işaretlenir ve ilgili modüller renkli olarak işaretlenir, gösterilir 'E' karakteri ile
Bu açıksa (yani, "kısıtlayıcı"), yalnızca çekirdeğin sahipliğindeki bir ortak anahtarla doğrulanabilen geçerli bir imzası olan modüller yüklenir. Diğer tüm modüller bir hata oluşturur.
Buradaki ayardan bağımsız olarak, modülün ayrıştırılamayan bir imza bloğu varsa, elden reddedilecektir.
"Tüm modülleri otomatik olarak imzala" (CONFIG_MODULE_SIG_ALL)
Bu açıksa, modüller bir yapının modules_install aşamasında otomatik olarak imzalanır. Bu kapalıysa, modüller aşağıdakiler kullanılarak manuel olarak imzalanmalıdır:
scripts/sign-file
"Modüller hangi karma algoritma ile imzalanmalıdır?"
Bu, kurulum aşamasının modülleri hangi hash algoritmasıyla imzalayacağına dair bir seçenek sunar:
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"
Burada seçilen algoritma da bir modül olmaktan ziyade çekirdeğe yerleştirilecektir, böylece bu algoritma ile imzalanan modüllerin imzaları bağımlılık döngüsüne neden olmadan kontrol edilebilir.
"Dosya adı veya PKCS # 11 modül imzalama anahtarının URI'sı" (CONFIG_MODULE_SIG_KEY)
Bu seçeneğin varsayılan ayarı "certs / signing_key.pem" dışında bir değere ayarlanması, imzalama anahtarlarının otomatik oluşturulmasını devre dışı bırakır ve çekirdek modüllerinin seçtiğiniz bir anahtarla imzalanmasına izin verir. Sağlanan dize, PEM biçiminde veya OpenSSL ENGINE_pkcs11'in işlevsel olduğu sistemlerde - RFC7512 tarafından tanımlanan bir PKCS # 11 URI'sinin hem özel anahtarı hem de karşılık gelen X.509 sertifikasını içeren bir dosyayı tanımlamalıdır. İkinci durumda, PKCS # 11 URI'sı hem sertifikaya hem de özel anahtara başvurmalıdır.
Özel anahtarı içeren PEM dosyası şifrelenmişse veya PKCS # 11 jetonu PIN gerektiriyorsa, KBUILD_SIGN_PIN değişkeni aracılığıyla bu oluşturma sırasında sağlanabilir.
"Varsayılan sistem anahtarlığı için ek X.509 anahtarları" (CONFIG_SYSTEM_TRUSTED_KEYS)
Bu seçenek, varsayılan olarak sistem anahtarlığına dahil edilecek ek sertifikalar içeren PEM kodlu bir dosyanın dosya adına ayarlanabilir.
Modül imzalamanın etkinleştirilmesinin, imzalamayı yapan aracın çekirdek oluşturma işlemlerine OpenSSL devel paketlerine bir bağımlılık eklediğini unutmayın.
İMZA ANAHTARLARI OLUŞTURMA
İmza oluşturmak ve kontrol etmek için kriptografik anahtar çiftleri gereklidir. İmza oluşturmak için özel anahtar kullanılır ve imzalamak için ilgili ortak anahtar kullanılır. Özel anahtar yalnızca derleme sırasında gereklidir, bundan sonra güvenli bir şekilde silinebilir veya saklanabilir. Ortak anahtar çekirdeğe yerleştirilir, böylece modüller yüklenirken imzaları kontrol etmek için kullanılabilir.
Normal koşullar altında, CONFIG_MODULE_SIG_KEY varsayılan değerinden farklı olmadığında, çekirdek oluşturma dosyada yoksa, openssl kullanarak otomatik olarak yeni bir anahtar çifti oluşturur:
certs/signing_key.pem
vmlinux'un inşa edilmesi sırasında (anahtarın genel kısmının vmlinux'a yerleştirilmesi gerekir) aşağıdaki parametreler kullanılarak:
certs/x509.genkey
dosyası (zaten mevcut değilse de oluşturulur).
Kendi x509.genkey dosyanızı sağlamanız önemle tavsiye edilir.
En önemlisi, x509.genkey dosyasında, req_distinguished_name bölümü varsayılandan değiştirilmelidir:
[ req_distinguished_name ]
#O = Unspecified company
CN = Build time autogenerated kernel key
#emailAddress = unspecified.user@unspecified.company
Oluşturulan RSA anahtar boyutu aşağıdakilerle de ayarlanabilir:
[ req ]
default_bits = 4096
Ayrıca, Linux çekirdek kaynakları ağacının kök düğümünde ve openssl komutunda x509.genkey anahtar oluşturma yapılandırma dosyasını kullanarak anahtar özel / genel dosyaları el ile oluşturmak da mümkündür. Aşağıda, genel / özel anahtar dosyalarını oluşturmak için bir örnek yer almaktadır:
openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 \
-config x509.genkey -outform PEM -out kernel_key.pem \
-keyout kernel_key.pem
Sonuçta elde edilen kernel_key.pem dosyasının tam yol adı CONFIG_MODULE_SIG_KEY seçeneğinde belirtilebilir ve otomatik olarak oluşturulmuş bir anahtar çifti yerine sertifika ve anahtar kullanılacaktır.
KERNELDE KAMU ANAHTARLARI
Çekirdek, kök tarafından görüntülenebilen bir halka açık anahtar halkası içerir. ".System_keyring" adında bir anahtarlık içerisindedirler:
[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 []
...
Özellikle modül imzalamak için oluşturulan ortak anahtarın ötesinde, CONFIG_SYSTEM_TRUSTED_KEYS yapılandırma seçeneği tarafından referans verilen PEM kodlu bir dosyada ek güvenilir sertifikalar sağlanabilir.
Ayrıca, mimari kod bir donanım deposundan ortak anahtarlar alabilir ve bunları da ekleyebilir (örn. UEFI anahtar veritabanından).
Son olarak, aşağıdakileri yaparak ek ortak anahtarlar eklemek mümkündür:
keyctl padd asymmetric "" [.system_keyring-ID] <[key-file]
Örneğin:
keyctl padd asymmetric "" 0x223c7853 <my_public_key.x509
Ancak, çekirdek anahtarları izin sadece edeceğini .system_keyring eklenecek olursa validly zaten anahtar eklendi anda .system_keyring ikamet eden bir anahtar tarafından imzalanır sarıcı yeni anahtarın X.509.
ELLE İMZA MODÜLLERİ
Bir modülü manuel olarak imzalamak için Linux çekirdek kaynak ağacında bulunan komut dosyaları / işaret dosyası aracını kullanın. Komut dosyası 4 bağımsız değişken gerektirir:
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
Aşağıda, bir çekirdek modülünü imzalamaya bir örnek verilmiştir:
scripts/sign-file sha512 kernel-signkey.priv \
kernel-signkey.x509 module.ko
Kullanılan hash algoritması yapılandırılanla eşleşmek zorunda değildir, ancak yoksa hash algoritmasının çekirdeğe yerleştirildiğinden veya kendisine gerek kalmadan yüklenebildiğinden emin olmalısınız.
Özel anahtar bir parola veya PIN gerektiriyorsa, $ KBUILD_SIGN_PIN ortam değişkeninde sağlanabilir.
İMZA MODÜLLERİ VE ÇİZGİ
İmzalı bir modülün sonuna basitçe eklenmiş bir dijital imza vardır. "~ Modül imzası eklenir ~" dizesi. modül dosyasının sonunda bir imza bulunduğunu onaylar, ancak imzanın geçerli olduğunu doğrulamaz!
İmza tanımlı ELF konteynerinin dışında olduğundan, imzalanmış modüller BRITTLE. Böylece imza hesaplandıktan ve eklendikten sonra SİLİNMEZLER. Modülün tamamının, imzalama sırasında mevcut olan tüm hata ayıklama bilgileri dahil olmak üzere imzalı yük olduğunu unutmayın.
İŞARETLİ MODÜLLER YÜKLEME
Modüller insmod, modprobe, init_module () veya finit_module () ile yüklenir, tıpkı imzasız modüller için olduğu gibi kullanıcı alanında işlem yapılmaz. İmza kontrolünün tamamı çekirdek içinde yapılır.
GEÇERLİ OLMAYAN İMZALAR VE İMZASIZ MODÜLLER
Eğer çekirdek komut satırında CONFIG_MODULE_SIG_FORCE etkinse veya enforcemodulesig = 1 verilmişse, çekirdek yalnızca genel anahtarı olan geçerli olarak imzalanmış modülleri yükleyecektir. Aksi takdirde, imzalanmamış modülleri de yükler. Çekirdeğin anahtarı olan ancak imza uyumsuzluğu olduğunu kanıtlayan modüllerin yüklenmesine izin verilmez.
Ayrıştırılamaz imzası olan tüm modüller reddedilir.
ÖZEL ANAHTARIN YÖNETİMİ / KORUMASI
Özel anahtar modülleri imzalamak için kullanıldığından, virüsler ve kötü amaçlı yazılımlar modülleri imzalamak ve işletim sistemini tehlikeye atmak için özel anahtarı kullanabilir. Özel anahtar imha edilmeli veya güvenli bir konuma taşınmalı ve çekirdek kaynak ağacının kök düğümünde tutulmamalıdır.