
FIPS 140-3 अनुपालक VPN कर्नेल मॉड्यूल और उपयोगकर्ता उपकरण, सुरक्षित टनलिंग के लिए AES-256-GCM, SHA2-256, और SECP256R1 क्रिप्टोग्राफी के साथ WireGuard का ड्रॉप-इन प्रतिस्थापन।
WolfGuard, Linux कर्नेल-आधारित WireGuard का wolfSSL FIPS-अनुपालक पुनर्लेखन है, जिसे मूल रूप से Jason Donenfeld द्वारा डिज़ाइन और लिखा गया है। उपयोग मूलतः समान है। WolfGuard के दो मुख्य घटक हैं, wolfguard.ko कर्नेल मॉड्यूल और wg-fips कॉन्फ़िगरेशन टूल। wolfguard.ko libwolfssl.ko कर्नेल मॉड्यूल पर निर्भर करता है, और wg-fips libwolfssl.so लाइब्रेरी पर निर्भर करता है — ये निर्भरताएँ एक ही wolfSSL स्रोत से बनाई गई हैं, जिनमें क्रमशः कर्नेल मॉड्यूल और उपयोगकर्ता लाइब्रेरी कॉन्फ़िगरेशन है। wg-fips-quick स्क्रिप्ट WireGuard में wg-quick की तरह ही काम करती है, लेकिन /etc/wolfguard में SECP256R1 सार्वजनिक और निजी कुंजियों वाली कॉन्फ़िगरेशन स्क्रिप्ट के साथ।
वायरगार्ड के पारदर्शी ड्रॉप-इन प्रतिस्थापन के लिए, इंस्टॉलेशन बिन निर्देशिका में wg से wg-fips और wg-quick से wg-fips-quick तक प्रतीकात्मक लिंक स्थापित किए जाते हैं। यदि इंस्टॉलेशन के दौरान WireGuard निष्पादन योग्य पाए जाते हैं, तो उनका नाम बदलकर wg-wireguard और wg-wireguard-quick कर दिया जाता है, wg-wireguard-quick को wg-wireguard को कॉल करने के लिए संशोधित किया जाता है, और wg-wireguard-quick.unpatched पर एक सुरक्षा प्रति छोड़ दी जाती है।
WolfGuard WireGuard से क्रिप्टोग्राफी को इस प्रकार रीमैप करता है:
ध्यान दें कि WolfGuard और WireGuard एक ही सिस्टम पर सह-अस्तित्व में रह सकते हैं, एक साथ WolfGuard और WireGuard टनल स्थापित कर सकते हैं।
यदि libwolfssl.ko को --enable-intelasm के साथ कॉन्फ़िगर किया गया है, तो WolfGuard का प्रदर्शन CPU-त्वरित WireGuard के बराबर या उससे अधिक होता है, AES-256-GCM और SHA2-256 संचालन के CPU त्वरण के लिए धन्यवाद। --enable-intelasm के बिना, WolfGuard CPU-त्वरित WireGuard की तुलना में थोड़ा धीमा है, लेकिन फिर भी आधुनिक CPU पर गीगाबिट ईथरनेट को संतृप्त करने में सक्षम है।
नीचे निर्देशों के दो सेट दिए गए हैं, पहला गैर-FIPS स्रोतों से निर्माण के लिए, और दूसरा FIPS-प्रमाणित स्रोतों से निर्माण के लिए। दोनों ही मामलों में, WolfGuard उपयोगकर्ता उपकरण और स्क्रिप्ट का नाम wg-fips और wg-fips-quick है, जो FIPS प्रमाणन स्थिति की परवाह किए बिना FIPS-अनुमोदित एल्गोरिदम के उपयोग को दर्शाता है। WolfGuard के FIPS-प्रमाणित और गैर-प्रमाणित बिल्ड एक-दूसरे के साथ पूरी तरह से अंतर-संचालनीय हैं, लेकिन WireGuard के साथ अंतर-संचालन नहीं कर सकते।
--enable-intelasm विकल्प केवल x86 CPU लक्ष्यों के साथ उपयोग किया जाना चाहिए, और FIPS के लिए, केवल उन FIPS स्रोतों पर जो इसका समर्थन करते हैं। अधिक जानकारी के लिए हमसे [email protected] पर संपर्क करें।
--enable-wolfguard विकल्प WolfGuard के लिए आवश्यक न्यूनतम लाइब्रेरी/मॉड्यूल सुविधा सेट को सक्षम करता है। अधिक व्यापक सुविधा सेट के लिए, इसके बजाय --enable-all-crypto का उपयोग करें।
$ उपसर्ग वाले कमांड को एक विशेषाधिकार रहित उपयोगकर्ता द्वारा निष्पादित किया जाना चाहिए, जबकि # वाले कमांड को रूट विशेषाधिकारों के साथ निष्पादित किया जाना चाहिए, लेकिन उसी स्थापित कार्यशील निर्देशिका संदर्भ में।
ध्यान दें कि यदि git स्रोतों के बजाय wolfSSL रिलीज़ आर्काइव का उपयोग किया जाता है, तो रिलीज़ संस्करण 5.8.4 या नया होना चाहिए।
git स्रोतों का निर्माण और स्थापना(1) स्रोतों के लिए एक शीर्ष स्तरीय निर्देशिका बनाएं और इसे आबाद करें:
$ mkdir wolf-sources
$ cd wolf-sources
$ git clone https://github.com/wolfssl/wolfssl --branch nightly-snapshot
$ git clone https://github.com/wolfssl/wolfguard
$ (cd wolfssl && ./autogen.sh)
(2) libwolfssl उपयोगकर्ता लाइब्रेरी का निर्माण और स्थापना करें:
नोट, यह चरण Linux पर वैकल्पिक है, जहां डिफ़ॉल्ट रूप से wg-fips कुंजी पीढ़ी और रूपांतरण संचालन को आंतरिक रूप से करने के बजाय कर्नेल मॉड्यूल को सौंपता है।
$ cd wolfssl
$ ./configure --quiet --enable-wolfguard --enable-all-asm
$ make -j
$ ./wolfcrypt/test/testwolfcrypt
# make install
$ cd ..
(3) wg-fips उपयोगकर्ता उपकरण का निर्माण और स्थापना करें -- नोट, स्थापना मौजूदा WireGuard wg और wg-quick निष्पादन योग्य और मैन पेजों को गंतव्य निर्देशिकाओं (यदि मौजूद हैं) से क्रमशः wg-wireguard और wg-wireguard-quick में ले जाएगी, और wg और wg-quick के लिए प्रतीकात्मक लिंक स्थापित करेगी जो WolfGuard संस्करणों की ओर इशारा करते हैं।
$ cd wolfguard/user-src
$ make -j
# make install
$ cd ../..
Linux पर कर्नेल मॉड्यूल को डिफ़ॉल्ट ऑफलोड करने के बजाय आंतरिक कुंजी संचालन का उपयोग करने के लिए, make -j को make -j NO_IPC_LLCRYPTO=1 से बदलें।
संपीड़ित सार्वजनिक कुंजियों के लिए समर्थन उपलब्ध है, जिनकी बेस64 निर्यात लंबाई WireGuard Curve25519 सार्वजनिक कुंजियों के समान है। इसे निम्नलिखित प्रतिस्थापित करके सक्षम किया जा सकता है
$ make -j EXTRA_CFLAGS=-DWG_USE_PUBLIC_KEY_COMPRESSION
उपरोक्त में। हालांकि, ध्यान दें कि WG_USE_PUBLIC_KEY_COMPRESSION के साथ WolfGuard डिफ़ॉल्ट WolfGuard सेटिंग्स के साथ असंगत है -- जब सेट किया जाता है, तो स्थानीय कॉन्फ़िगरेशन और ओवर-द-वायर वार्ता दोनों में संपीड़ित सार्वजनिक कुंजियाँ प्रदान और अपेक्षित की जाती हैं।
(4) libwolfssl कर्नेल मॉड्यूल का निर्माण और स्थापना करें। /usr/src/linux को अपने वास्तविक लक्ष्य कर्नेल स्रोत ट्री के पथ से बदलें, जो पूरी तरह से कॉन्फ़िगर और निर्मित होना चाहिए, और आप अपने लक्ष्य सिस्टम पर बूट करने वाले कर्नेल से बिल्कुल मेल खाना चाहिए। अंत में modprobe मानता है कि आप मूल चल रहे सिस्टम को लक्षित कर रहे हैं।
$ cd wolfssl
$ ./configure --quiet --enable-wolfguard --enable-cryptonly --enable-intelasm \
--enable-linuxkm --with-linux-source=/usr/src/linux \
--prefix=$(pwd)/linuxkm/build
$ make -j module
# make install
# modprobe libwolfssl
libwolfssl कर्नेल मॉड्यूल को उत्पादन में डालने से पहले, आपको इसे विस्तारित स्व-परीक्षण सक्षम करके बनाना और लोड करना चाहिए। ऊपर दिए गए ./configure रेसिपी को निम्नलिखित से बदलें:
$ ./configure --quiet --enable-wolfguard --enable-cryptonly --enable-intelasm \
--enable-linuxkm --with-linux-source=/usr/src/linux \
--prefix=$(pwd)/linuxkm/build --enable-crypttests \
CFLAGS=-DWOLFSSL_LINUXKM_VERBOSE_DEBUG
अतिरिक्त विकल्प उत्पादन के लिए उपयुक्त नहीं हैं, लेकिन उनके साथ कॉन्फ़िगर किए गए मॉड्यूल को एक प्रतिनिधि रनटाइम वातावरण में लोड किया जाना चाहिए ताकि यह पुष्टि हो सके कि सभी एल्गोरिदम सही ढंग से काम करते हैं।
(5) WolfGuard कर्नेल मॉड्यूल का निर्माण और स्थापना करें। फिर से, /usr/src/linux को अपने वास्तविक लक्ष्य कर्नेल स्रोत ट्री के पथ से बदलें, और 6.16.5-gentoo को लक्ष्य सिस्टम पर uname -r द्वारा लौटाए गए वास्तविक मान से बदलें। और फिर, निर्माण के बाद modprobe मानता है कि आप मूल चल रहे सिस्टम को लक्षित कर रहे हैं।
$ cd ../wolfguard/kernel-src
$ make -j KERNELDIR=/usr/src/linux KERNELRELEASE=6.16.5-gentoo
# make install
# modprobe wolfguard
$ ../user-src/wg-fips genkey | ../user-src/wg-fips pubkey
KERNELRELEASE मान प्रभावी रूप से /lib/modules/ के अंतर्गत उस निर्देशिका का शाब्दिक नाम है जहां लक्ष्य कर्नेल के मॉड्यूल स्थापित हैं।
अंतिम पंक्ति में genkey और pubkey ऑप्स बुनियादी कार्यक्षमता परीक्षण हैं। यदि सब कुछ ठीक है, तो यह सफल होगा और एक यादृच्छिक सार्वजनिक कुंजी प्रिंट करेगा।
जैसा कि ऊपर wg-fips बिल्ड के लिए, संपीड़ित सार्वजनिक कुंजी समर्थन को उपरोक्त make रेसिपी में EXTRA_CFLAGS=-DWG_USE_PUBLIC_KEY_COMPRESSION जोड़कर सक्षम किया जा सकता है। WG_USE_PUBLIC_KEY_COMPRESSION सेटिंग पूरे पारिस्थितिकी तंत्र में मेल खानी चाहिए।
यदि उपरोक्त सभी सफल होते हैं, तो अब आप WolfGuard टनल लाने के लिए तैयार हैं। WireGuard के लिए मौजूदा प्लेबुक और स्क्रिप्टिंग का सीधे उपयोग किया जा सकता है, बशर्ते आप /etc/wolfguard को /etc/wireguard के लिए प्रतिस्थापित करें, और WolfGuard wg-fips टूल का उपयोग करके सभी कुंजियाँ उत्पन्न करें (wg इस बिंदु पर wg-fips का लिंक होगा)।
wolfssl स्रोत आर्काइव के FIPS प्रमाणित संस्करण अलग से प्रदान किए जाते हैं। [email protected] पर संपर्क करें।
(1) स्रोतों के लिए एक शीर्ष स्तरीय निर्देशिका बनाएं और इसे आबाद करें। यह प्रक्रिया 7z प्रारूप में wolfssl आर्काइव मानती है -- यदि आर्काइव .tar.gz है तो tar -xf का उपयोग करें। किसी भी मामले में, ln -s रेसिपी को समायोजित करें ताकि wolfssl निकाले गए wolfssl निर्देशिका के लिए एक प्रतीकात्मक लिंक हो। यह भी ध्यान दें कि FIPS कर्नेल मॉड्यूल आर्काइव गैर-कर्नेल आर्काइव से अलग हैं, हालांकि वे नीचे दिखाए गए अनुसार FIPS उपयोगकर्ता लाइब्रेरी बनाने के लिए उपयोग करने के लिए सुरक्षित हैं।
$ mkdir wolf-sources
$ cd wolf-sources
$ 7z x ~/Downloads/wolfssl-X-fips-linuxvX-kernel.7z
$ ln -s wolfssl-X-fips-linuxvX-kernel wolfssl
$ git clone https://github.com/wolfssl/wolfguard
(2) libwolfssl उपयोगकर्ता लाइब्रेरी का निर्माण और स्थापना करें।
नोट, यह चरण Linux पर वैकल्पिक है, जहां डिफ़ॉल्ट रूप से wg-fips कुंजी पीढ़ी और रूपांतरण संचालन को आंतरिक रूप से करने के बजाय कर्नेल मॉड्यूल को सौंपता है।
$ cd wolfssl
$ ./configure --quiet --enable-fips=vX --enable-wolfguard
$ make -j
$ ./fips-hash.sh
$ make -j
$ ./wolfcrypt/test/testwolfcrypt
# make install
$ cd ..
नोट, --enable-fips का तर्क आर्काइव के FIPS फ्लेवर से मेल खाना चाहिए। वर्तमान में WolfGuard उपयोग के लिए सबसे उपयुक्त तर्क v5.2.4 और v6 हैं।
(3) wg-fips उपयोगकर्ता उपकरण का निर्माण और स्थापना करें -- नोट, स्थापना मौजूदा WireGuard wg और wg-quick निष्पादन योग्य और मैन पेजों को गंतव्य निर्देशिकाओं (यदि मौजूद हैं) से क्रमशः wg-wireguard और wg-wireguard-quick में ले जाएगी, और wg और wg-quick के लिए प्रतीकात्मक लिंक स्थापित करेगी जो WolfGuard संस्करणों की ओर इशारा करते हैं।
$ cd wolfguard/user-src
$ make -j
# make install
$ cd ../..
Linux पर कर्नेल मॉड्यूल को डिफ़ॉल्ट ऑफलोड करने के बजाय आंतरिक कुंजी संचालन का उपयोग करने के लिए, make -j को make -j NO_IPC_LLCRYPTO=1 से बदलें।
(4) libwolfssl कर्नेल मॉड्यूल का निर्माण और स्थापना करें। /usr/src/linux को अपने वास्तविक लक्ष्य कर्नेल स्रोत ट्री के पथ से बदलें, जो पूरी तरह से कॉन्फ़िगर और निर्मित होना चाहिए, और आप अपने लक्ष्य सिस्टम पर बूट करने वाले कर्नेल से बिल्कुल मेल खाना चाहिए।
यह दो-चरणीय प्रक्रिया है। पहले आप गलत अखंडता हैश के साथ मॉड्यूल का निर्माण और स्थापना करेंगे। फिर आप सही हैश को कैप्चर करने के लिए इसे लोड करेंगे, जो अपेक्षित "Operation canceled" त्रुटि के साथ जल्दी बाहर निकल जाएगा। फिर आप सही हैश के साथ मॉड्यूल का पुनर्निर्माण और लोड करेंगे। ध्यान दें कि ये निर्देश मूल सिस्टम को लक्षित करने मानते हैं। यह भी ध्यान दें कि Linux कर्नेल मोड के साथ संगत सबसे कम libwolfssl FIPS संस्करण v5.2.4 है।
$ cd wolfssl
$ ./configure --quiet --enable-fips=vX --enable-wolfguard --enable-cryptonly \
--enable-linuxkm --with-linux-source=/usr/src/linux \
--prefix=$(pwd)/linuxkm/build
$ make -j module
# make install
# modprobe libwolfssl
(उपरोक्त modprobe के जल्दी बाहर निकलने की उम्मीद करें, "Operation canceled" संदेश के साथ।)
$ NEWHASH=$(dmesg | awk '{if (match($0, " new hash \"([^\"]+)\" ", hash_a)) { hash = hash_a[1]; }} END {print hash}')
$ sed --in-place=.bak "s/^\".*\";/\"${NEWHASH}\";/" wolfcrypt/src/fips_test.c
$ make -j module
# make install
# modprobe libwolfssl
यदि दूसरा modprobe पहले वाले की तरह विफल होता है, कर्नेल लॉग में "Update verifyCore[] in fips_test.c with new hash ..." संदेश के साथ, तो आपका टूलचेन और/या लक्ष्य कर्नेल कॉन्फ़िगरेशन पुनरुत्पादनीय बिल्ड को विफल कर रहे हैं। उस स्थिति में, आपको इस वैकल्पिक रणनीति का उपयोग करना चाहिए, ऊपर NEWHASH= कमांड के बाद के चरणों को बदलते हुए:
$ make module-update-fips-hash FIPS_HASH="$NEWHASH"
# make install
# modprobe libwolfssl
libwolfssl कर्नेल मॉड्यूल को उत्पादन में डालने से पहले, आपको इसे विस्तारित स्व-परीक्षण सक्षम करके बनाना और लोड करना चाहिए। ऐसा करने के लिए, ऊपर दिए गए ./configure रेसिपी को निम्नलिखित से बदलें:
$ ./configure --quiet --enable-fips=vX --enable-wolfguard --enable-cryptonly \
--enable-linuxkm --with-linux-source=/usr/src/linux \
--prefix=$(pwd)/linuxkm/build --enable-crypttests \
CFLAGS=-DWOLFSSL_LINUXKM_VERBOSE_DEBUG
अतिरिक्त विकल्प उत्पादन के लिए उपयुक्त नहीं हैं, लेकिन उनके साथ कॉन्फ़िगर किए गए मॉड्यूल को एक प्रतिनिधि रनटाइम वातावरण में लोड किया जाना चाहिए ताकि यह पुष्टि हो सके कि सभी एल्गोरिदम सही ढंग से काम करते हैं।
(5) WolfGuard कर्नेल मॉड्यूल का निर्माण और स्थापना करें। फिर से, /usr/src/linux को अपने वास्तविक लक्ष्य कर्नेल स्रोत ट्री के पथ से बदलें, और 6.16.5-gentoo को लक्ष्य सिस्टम पर uname -r द्वारा लौटाए गए वास्तविक मान से बदलें।
$ cd ../wolfguard/kernel-src
$ make -j KERNELDIR=/usr/src/linux KERNELRELEASE=6.16.5-gentoo
# make install
# modprobe wolfguard
$ ../user-src/wg-fips genkey | ../user-src/wg-fips pubkey
गैर-FIPS-प्रमाणित प्रक्रिया की तरह, यदि उपरोक्त सभी सफल होते हैं, तो अब आप WolfGuard टनल लाने के लिए तैयार हैं। WireGuard के लिए मौजूदा प्लेबुक और स्क्रिप्टिंग का सीधे उपयोग किया जा सकता है, बशर्ते आप /etc/wolfguard को /etc/wireguard के लिए प्रतिस्थापित करें, और WolfGuard wg-fips टूल का उपयोग करके सभी कुंजियाँ उत्पन्न करें (wg इस बिंदु पर wg-fips का लिंक होगा)। हालांकि, ध्यान दें कि कुछ WireGuard क्लाइंट एप्लिकेशन और ऑटोमेशन फ्रेमवर्क WireGuard सार्वजनिक कुंजियों को बिल्कुल 44 वर्णों के बेस64 के साथ निर्यात करने की उम्मीद करते हैं। WolfGuard सार्वजनिक कुंजियाँ लगभग उस लंबाई की दोगुनी होती हैं, जब तक कि WG_USE_PUBLIC_KEY_COMPRESSION के साथ निर्मित न किया गया हो, जो वर्तमान में FIPS v5 में समर्थित नहीं है, लेकिन FIPS v6 और बाद में समर्थित है।
| एल्गो श्रेणी | WireGuard | WolfGuard |
|---|
| ECDH | Curve25519 | SECP256R1 |
| AEAD | XChaCha20-Poly1305 | AES-256-GCM |
| डाइजेस्ट | Blake2s | SHA2-256 |
| प्रमाणीकरण डाइजेस्ट | Blake2s-HMAC | SHA2-256-HMAC |
| आंतरिक हैश | SipHash | SHA2-256 |
| DRBG | ChaCha20 DRBG | SHA2-256 Hash-DRBG |