आपको जो कुछ भी चाहिए वह यहाँ वर्णित है
KERNEL MODULE SIGNING FACILITY
सामग्री
- अवलोकन।
- मॉड्यूल साइनिंग कॉन्फ़िगर करना।
- हस्ताक्षर कुंजी उत्पन्न करना।
- सार्वजनिक कर्नेल में कुंजी।
- मैन्युअल रूप से हस्ताक्षर करने वाले मॉड्यूल।
- साइन किए गए मॉड्यूल और स्ट्रिपिंग।
- साइन किए गए मॉड्यूल लोड हो रहे हैं।
- गैर-वैध हस्ताक्षर और अहस्ताक्षरित मॉड्यूल।
- निजी कुंजी का प्रशासन / संरक्षण।
अवलोकन
कर्नेल मॉड्यूल हस्ताक्षर करने की सुविधा स्थापना के दौरान क्रिप्टोग्राफिक रूप से संकेत देता है और फिर मॉड्यूल लोड करने पर हस्ताक्षर की जांच करता है। यह अमान्य कुंजी के साथ हस्ताक्षरित अहस्ताक्षरित मॉड्यूल या मॉड्यूल की लोडिंग को रोककर बढ़ी हुई कर्नेल सुरक्षा की अनुमति देता है। मॉड्यूल साइनिंग कर्नेल में एक दुर्भावनापूर्ण मॉड्यूल को लोड करने के लिए कठिन बनाकर सुरक्षा बढ़ाता है। मॉड्यूल हस्ताक्षर की जाँच कर्नेल द्वारा की जाती है ताकि विश्वसनीय उपयोगकर्ता स्थान बिट्स होना आवश्यक नहीं है।
यह सुविधा शामिल सार्वजनिक कुंजी को एनकोड करने के लिए X.509 ITU-T मानक प्रमाणपत्र का उपयोग करती है। हस्ताक्षर स्वयं किसी भी औद्योगिक मानक प्रकार में एन्कोडेड नहीं हैं। वर्तमान में सुविधा केवल आरएसए सार्वजनिक कुंजी एन्क्रिप्शन मानक का समर्थन करती है (हालांकि यह प्लग करने योग्य है और दूसरों को उपयोग करने की अनुमति देता है)। उपयोग किए जा सकने वाले संभावित हैश एल्गोरिथम SHA-1, SHA-224, SHA-256, SHA-384 और SHA-512 (एल्गोरिथम हस्ताक्षर में डेटा द्वारा चयनित) हैं।
अनुरूपण डिजाइनिंग
मॉड्यूल साइनिंग सुविधा कर्नेल कॉन्फ़िगरेशन के "लोड करने योग्य मॉड्यूल सहायता सक्षम करें" अनुभाग पर जाकर और चालू करके सक्षम है
CONFIG_MODULE_SIG "Module signature verification"
इसके पास कई विकल्प उपलब्ध हैं:
"मॉड्यूल के लिए वैध रूप से हस्ताक्षरित होना आवश्यक है" (CONFIG_MODULE_SIG_FORCE)
यह निर्दिष्ट करता है कि कर्नेल को उस मॉड्यूल से कैसे निपटना चाहिए जिसके पास एक हस्ताक्षर है जिसके लिए कुंजी ज्ञात नहीं है या एक मॉड्यूल जो अहस्ताक्षरित है।
यदि यह बंद है (यानी। "अनुमेय"), तो मॉड्यूल जिसके लिए कुंजी उपलब्ध नहीं है और बिना असाइन किए गए मॉड्यूल की अनुमति है, लेकिन कर्नेल को दागी के रूप में चिह्नित किया जाएगा, और संबंधित मॉड्यूल को दागी के रूप में चिह्नित किया जाएगा, दिखाया गया है चरित्र 'ई' के साथ।
यदि यह चालू (यानी। "प्रतिबंधक") है, तो केवल उन मॉड्यूलों के पास एक वैध हस्ताक्षर है जो कि कर्नेल के कब्जे में एक सार्वजनिक कुंजी द्वारा सत्यापित किया जा सकता है। अन्य सभी मॉड्यूल एक त्रुटि उत्पन्न करेंगे।
यहां सेटिंग के बावजूद, यदि मॉड्यूल में एक हस्ताक्षर ब्लॉक है जिसे पार्स नहीं किया जा सकता है, तो इसे हाथ से खारिज कर दिया जाएगा।
"सभी मॉड्यूल स्वचालित रूप से साइन करें" (CONFIG_MODULE_SIG_ALL)
यदि यह चालू है, तो किसी बिल्ड के मॉड्यूल_स्थापना चरण के दौरान मॉड्यूल स्वचालित रूप से हस्ताक्षरित होंगे। यदि यह बंद है, तो मॉड्यूल का उपयोग करके मैन्युअल रूप से हस्ताक्षरित किया जाना चाहिए:
scripts/sign-file
"किस हैश एल्गोरिथ्म के साथ हस्ताक्षर किए जाने चाहिए?"
यह एक विकल्प प्रस्तुत करता है जिसमें हैश एल्गोरिथम इंस्टॉलेशन फेज़ के साथ मॉड्यूल्स पर हस्ताक्षर करेगा:
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"
यहाँ चयनित एल्गोरिथ्म भी कर्नेल (एक मॉड्यूल होने के बजाय) में बनाया जाएगा ताकि उस एल्गोरिथ्म के साथ साइन किए गए मॉड्यूल एक निर्भरता लूप पैदा किए बिना उनके हस्ताक्षर की जांच कर सकें।
"फ़ाइल नाम या PKCS # 11 मॉड्यूल पर हस्ताक्षर करने वाले URI कुंजी" (CONFIG_MODULE_SIG_KEY)
इस विकल्प को "सेरट्स / साइनिंग_की_पीएम" के अपने डिफॉल्ट के अलावा किसी अन्य चीज़ पर सेट करना, साइनिंग कुंजी की ऑटोग्रेशन को अक्षम कर देगा और कर्नेल मॉड्यूल को आपके चयन की कुंजी के साथ साइन इन करने की अनुमति देगा। उपलब्ध कराई गई स्ट्रिंग को पीईएम के रूप में एक निजी कुंजी और उसके संबंधित X.509 प्रमाण पत्र वाली फ़ाइल की पहचान करनी चाहिए, या - उन सिस्टम पर जहां OpenSSL Engine_pkcs11 कार्यात्मक है - एक RCS7512 द्वारा परिभाषित PKCS # 11 URI। बाद के मामले में, PKCS # 11 URI को एक प्रमाण पत्र और एक निजी कुंजी दोनों का संदर्भ देना चाहिए।
यदि PEM फ़ाइल जिसमें निजी कुंजी है, एन्क्रिप्ट किया गया है, या यदि PKCS # 11 टोकन पुनः पिन करता है, तो इसे KBUILD_SIGN_PIN चर के माध्यम से बिल्ड समय पर प्रदान किया जा सकता है।
"डिफ़ॉल्ट सिस्टम कीरिंग के लिए अतिरिक्त X.509 कुंजी" (CONFIG_SYSTEM_TRUSTED_KEYS)
यह विकल्प एक PEM- एन्कोडेड फ़ाइल के फ़ाइलनाम पर सेट किया जा सकता है जिसमें अतिरिक्त प्रमाणपत्र होंगे जो डिफ़ॉल्ट रूप से सिस्टम कीरिंग में शामिल होंगे।
ध्यान दें कि मॉड्यूल हस्ताक्षर करने को सक्षम करने के लिए OpenSSL devel संकुल पर निर्भरता जोड़ता है जो हस्ताक्षर करने वाले उपकरण के लिए कर्नेल बिल्ड प्रक्रियाओं के लिए है।
जेनरेटिंग साइनिंग कुंजी
हस्ताक्षर बनाने और जाँचने के लिए क्रिप्टोग्राफ़िक कीपर्स की आवश्यकता होती है। एक निजी कुंजी का उपयोग हस्ताक्षर बनाने के लिए किया जाता है और इसी सार्वजनिक कुंजी का उपयोग इसे जांचने के लिए किया जाता है। निर्माण के दौरान निजी कुंजी की आवश्यकता होती है, जिसके बाद इसे हटा दिया जा सकता है या सुरक्षित रूप से संग्रहीत किया जा सकता है। सार्वजनिक कुंजी कर्नेल में निर्मित हो जाती है ताकि मॉड्यूल के लोड होने पर हस्ताक्षर की जांच करने के लिए इसका उपयोग किया जा सके।
सामान्य परिस्थितियों में, जब CONFIG_MODULE_SIG_KEY अपने डिफ़ॉल्ट से अपरिवर्तित होता है, तो कर्नेल बिल्ड स्वचालित रूप से फाइल में मौजूद नहीं होने पर ओपनसेल का उपयोग करके एक नया कीपर उत्पन्न करेगा:
certs/signing_key.pem
vmlinux के निर्माण के दौरान (कुंजी के सार्वजनिक भाग को vmlinux में बनाया जाना चाहिए) मापदंडों का उपयोग करते हुए:
certs/x509.genkey
फ़ाइल (जो पहले से मौजूद नहीं है तो भी उत्पन्न होती है)।
यह दृढ़ता से अनुशंसा की जाती है कि आप अपनी खुद की x509.genkey फ़ाइल प्रदान करें।
सबसे विशेष रूप से, x509.genkey फ़ाइल में, req_distinguished_name अनुभाग को डिफ़ॉल्ट से बदला जाना चाहिए:
[ req_distinguished_name ]
#O = Unspecified company
CN = Build time autogenerated kernel key
#emailAddress = unspecified.user@unspecified.company
उत्पन्न RSA कुंजी का आकार भी इसके साथ सेट किया जा सकता है:
[ req ]
default_bits = 4096
लिनक्स कर्नेल स्रोत ट्री और रूटस् कमांड के रूट नोड में x509.genkey कुंजी जनरेशन कॉन्फ़िगरेशन फ़ाइल का उपयोग करके मैन्युअल रूप से कुंजी निजी / सार्वजनिक फ़ाइलों को उत्पन्न करना भी संभव है। निम्नलिखित सार्वजनिक / निजी कुंजी फ़ाइलों को बनाने के लिए एक उदाहरण है:
openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 \
-config x509.genkey -outform PEM -out kernel_key.pem \
-keyout kernel_key.pem
परिणामी kernel_key.pem फ़ाइल के लिए पूर्ण पथनाम तब CONFIG_MODULE_SIG_KEY विकल्प में निर्दिष्ट किया जा सकता है, और प्रमाणपत्र और कुंजी का उपयोग ऑटोगेनेरेटेड कीपर के बजाय किया जाएगा।
KERNEL में सार्वजनिक कुंजी
कर्नेल में सार्वजनिक कुंजियों का एक छल्ला होता है जिसे मूल द्वारा देखा जा सकता है। वे "। System_keyring" नामक एक कीरिंग में हैं जिसे निम्न द्वारा देखा जा सकता है:
[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 []
...
मॉड्यूल हस्ताक्षर के लिए विशेष रूप से उत्पन्न सार्वजनिक कुंजी से परे, अतिरिक्त विश्वसनीय प्रमाणपत्र CONFIG_SYSTEM_TRUSTED_KEYS कॉन्फ़िगरेशन विकल्प द्वारा संदर्भित PEM- एन्कोडेड फ़ाइल में प्रदान किए जा सकते हैं।
इसके अलावा, आर्किटेक्चर कोड एक हार्डवेयर स्टोर से सार्वजनिक कुंजी ले सकता है और उन्हें भी जोड़ सकता है (जैसे यूईएफआई कुंजी डेटाबेस से)।
अंत में, अतिरिक्त सार्वजनिक कुंजी को जोड़ना संभव है:
keyctl padd asymmetric "" [.system_keyring-ID] <[key-file]
उदाहरण के लिए:
keyctl padd asymmetric "" 0x223c7853 <my_public_key.x509
हालांकि, ध्यान दें कि कर्नेल कुंजी केवल अनुमति देगा .system_keyring में जोड़े जाने की अगर नया कुंजी के 509 आवरण वैध एक प्रमुख पहले से ही समय कुंजी जोड़ा गया था पर .system_keyring का निवासी हो कि द्वारा हस्ताक्षर किए है।
वास्तव में डिजाइन मॉड्यूल
मॉड्यूल को मैन्युअल रूप से साइन करने के लिए, लिनक्स कर्नेल स्रोत ट्री में उपलब्ध स्क्रिप्ट / साइन-फाइल टूल का उपयोग करें। स्क्रिप्ट में 4 तर्कों की आवश्यकता है:
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
निम्नलिखित कर्नेल मॉड्यूल पर हस्ताक्षर करने के लिए एक उदाहरण है:
scripts/sign-file sha512 kernel-signkey.priv \
kernel-signkey.x509 module.ko
उपयोग किए गए हैश एल्गोरिथ्म को कॉन्फ़िगर किए गए से मेल नहीं खाता है, लेकिन अगर ऐसा नहीं होता है, तो आपको यह सुनिश्चित करना चाहिए कि हैश एल्गोरिथ्म या तो कर्नेल में बनाया गया है या स्वयं की आवश्यकता के बिना लोड किया जा सकता है।
यदि निजी कुंजी को पासफ़्रेज़ या पिन की आवश्यकता होती है, तो इसे $ KBUILD_SIGN_PIN पर्यावरण चर में प्रदान किया जा सकता है।
हस्ताक्षरित मॉडल और स्ट्रिपिंग
एक हस्ताक्षरित मॉड्यूल में अंत में संलग्न एक डिजिटल हस्ताक्षर है। स्ट्रिंग "~ मॉड्यूल हस्ताक्षर संलग्न ~।" मॉड्यूल की फ़ाइल के अंत में पुष्टि करता है कि एक हस्ताक्षर मौजूद है लेकिन यह पुष्टि नहीं करता है कि हस्ताक्षर वैध है!
हस्ताक्षरित मॉड्यूल BRITTLE हैं क्योंकि हस्ताक्षर परिभाषित ELF कंटेनर के बाहर है। हस्ताक्षर की गणना और संलग्न होने के बाद उन्हें नहीं छीना जा सकता है। नोट पूरे मॉड्यूल पर हस्ताक्षरित पेलोड है, जिसमें हस्ताक्षर करने के समय मौजूद कोई भी और सभी डिबग जानकारी शामिल है।
लोड किए गए मॉड्यूल
मॉड्यूल insmod, modprobe, init_module () या finit_module () के साथ लोड किए जाते हैं, बिल्कुल अहस्ताक्षरित मॉड्यूल के लिए जैसे कि उपयोगकर्ता संसाधन में कोई प्रसंस्करण नहीं किया जाता है। हस्ताक्षर की जाँच सभी कर्नेल के भीतर की जाती है।
गैर-वैध हस्ताक्षर और संयुक्त मॉड्यूल
यदि CONFIG_MODULE_SIG_FORCE सक्षम है या enforcemodulesig = 1 कर्नेल कमांड लाइन पर दिया गया है, तो कर्नेल केवल मान्य हस्ताक्षरित मॉड्यूल को लोड करेगा जिसके लिए यह एक सार्वजनिक कुंजी है। अन्यथा, यह उन मॉड्यूल को भी लोड करेगा जो अहस्ताक्षरित हैं। कोई भी मॉड्यूल जिसके लिए कर्नेल के पास एक कुंजी है, लेकिन जो एक हस्ताक्षर बेमेल साबित करता है उसे लोड करने की अनुमति नहीं दी जाएगी।
कोई भी मॉड्यूल जिसमें एक अप्राप्य हस्ताक्षर है, अस्वीकार कर दिया जाएगा।
निजी / निजी कुंजी को शामिल करना
चूंकि निजी कुंजी का उपयोग मॉड्यूल पर हस्ताक्षर करने के लिए किया जाता है, वायरस और मैलवेयर निजी कुंजी का उपयोग मॉड्यूल पर हस्ताक्षर करने और ऑपरेटिंग सिस्टम से समझौता करने के लिए कर सकते हैं। निजी कुंजी को या तो नष्ट कर दिया जाना चाहिए या एक सुरक्षित स्थान पर ले जाया जाना चाहिए और कर्नेल स्रोत के पेड़ की जड़ नोड में नहीं रखा जाना चाहिए।