
وحدة نواة وأداة مستخدم متوافقة مع معيار FIPS 140-3، بديل مباشر لـ WireGuard مع تشفير AES-256-GCM وSHA2-256 وSECP256R1 لإنشاء نفق آمن.
WolfGuard هو إعادة هيكلة متوافقة مع FIPS من wolfSSL للنواة القائمة على لينكس
WireGuard، الذي صُمم وأُنشئ أصلاً بواسطة
Jason Donenfeld. الاستخدام مطابق بشكل أساسي. هناك مكونان رئيسيان
لـ WolfGuard: وحدة النواة wolfguard.ko وأداة التهيئة wg-fips.
تعتمد wolfguard.ko على وحدة النواة libwolfssl.ko، وتعتمد wg-fips على مكتبة libwolfssl.so — هذه
التبعيات مبنية من نفس مصدر
wolfSSL، مع تكوين وحدة النواة
ومكتبة المستخدم على التوالي. يعمل السكريبت wg-fips-quick تماماً مثل wg-quick في WireGuard، ولكن مع
سكريبتات تهيئة في /etc/wolfguard تحتوي على مفاتيح عامة وخاصة من SECP256R1.
يتم تثبيت روابط رمزية في دليل تثبيت bin من wg إلى
wg-fips، ومن wg-quick إلى wg-fips-quick، لاستبدال WireGuard
بشفافية. إذا تم العثور على ملفات 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 يضاهي أو يتجاوز أداء WireGuard المسرع بواسطة وحدة المعالجة المركزية، بفضل
تسريع وحدة المعالجة المركزية لعمليات AES-256-GCM و SHA2-256. بدون
--enable-intelasm، يكون WolfGuard أبطأ قليلاً من WireGuard المسرع بواسطة المعالج،
ولكنه لا يزال قادراً على تشبع شبكة جيجابت إيثرنت على المعالجات الحديثة.
فيما يلي مجموعتان من التعليمات، الأولى للبناء من مصادر غير FIPS،
والثانية للبناء من مصادر معتمدة من FIPS. في كلتا الحالتين،
يتم تسمية أداة المستخدم والنص البرمجي لـ WolfGuard باسم wg-fips و
wg-fips-quick، مما يعكس استخدامها لخوارزميات معتمدة من FIPS بغض النظر عن
حالة اعتماد FIPS. الإصدارات المعتمدة من FIPS وغير المعتمدة من WolfGuard
قابلة للتشغيل البيني بالكامل مع بعضها البعض، ولكن لا يمكنها التشغيل البيني مع WireGuard.
يجب استخدام خيار --enable-intelasm فقط مع أهداف وحدة المعالجة المركزية x86، وبالنسبة لـ
FIPS، فقط على مصادر FIPS التي تدعمه. اتصل بنا على [email protected]
لمزيد من المعلومات.
يقوم خيار --enable-wolfguard بتمكين الحد الأدنى من مجموعة ميزات المكتبة/الوحدة
المطلوبة لـ WolfGuard. لمجموعة ميزات أكثر شمولاً، استخدم
--enable-all-crypto بدلاً من ذلك.
يجب تنفيذ الأوامر التي تسبقها $ بواسطة مستخدم غير مميز،
بينما يتم تنفيذ تلك التي تسبقها # بصلاحيات الجذر، ولكن في نفس سياق
دليل العمل المحدد.
لاحظ أنه إذا تم استخدام أرشيف إصدار wolfSSL بدلاً من مصادر git، فيجب
أن يكون الإصدار 5.8.4 أو أحدث.
git غير FIPS(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:
ملاحظة، هذه الخطوة اختيارية على لينكس، حيث تقوم 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 ../..
لفرض استخدام عمليات المفاتيح الداخلية على لينكس، بدلاً من التفريغ الافتراضي إلى
وحدة النواة، استبدل make -j بـ make -j NO_IPC_LLCRYPTO=1.
الدعم متاح للمفاتيح العامة المضغوطة، التي تكون أطوالها المُصدرة بتنسيق base64 مطابقة لأطوال المفاتيح العامة Curve25519 في WireGuard. يمكن تمكين ذلك عن طريق استبدال
$ make -j EXTRA_CFLAGS=-DWG_USE_PUBLIC_KEY_COMPRESSION
في ما سبق. لكن لاحظ أن WolfGuard مع
WG_USE_PUBLIC_KEY_COMPRESSION غير متوافق مع إعدادات 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 أعلاه، يمكن تمكين دعم المفتاح العام المضغوط
عن طريق إضافة EXTRA_CFLAGS=-DWG_USE_PUBLIC_KEY_COMPRESSION إلى وصفة make
أعلاه. يجب أن يكون إعداد WG_USE_PUBLIC_KEY_COMPRESSION متطابقاً في جميع أنحاء النظام البيئي.
إذا نجح كل ما سبق، فأنت الآن جاهز لتشغيل أنفاق WolfGuard.
يمكن استخدام أدلة التشغيل الحالية والبرامج النصية الخاصة بـ WireGuard مباشرة،
بشرط استبدال /etc/wolfguard بدلاً من /etc/wireguard، وإنشاء جميع
المفاتيح باستخدام أداة WolfGuard wg-fips (سيكون wg في هذه المرحلة رابطاً لـ
wg-fips).
يتم توفير إصدارات معتمدة من FIPS من أرشيف مصدر wolfssl بشكل منفصل. اتصل بـ [email protected].
(1) أنشئ دليلاً من المستوى الأعلى للمصادر واملأه. يفترض هذا
الإجراء وجود أرشيف wolfssl بتنسيق 7z -- استبدل tar -xf إذا كان
الأرشيف ملف .tar.gz. في كلتا الحالتين، اضبط وصفة 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.
ملاحظة، هذه الخطوة اختيارية على لينكس، حيث تقوم 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 ../..
لفرض استخدام عمليات المفاتيح الداخلية على لينكس، بدلاً من التفريغ الافتراضي إلى
وحدة النواة، استبدل make -j بـ make -j NO_IPC_LLCRYPTO=1.
(4) قم ببناء وتثبيت وحدة نواة libwolfssl. استبدل /usr/src/linux بـ
المسار إلى شجرة مصدر النواة الهدف الفعلية، والتي يجب أن تكون مهيأة
ومبنية بالكامل، وتطابق تماماً النواة التي ستشغلها على نظامك
الهدف.
هذه عملية من خطوتين. أولاً ستبني وتثبت الوحدة مع
تجزئة سلامة غير صحيحة. ثم ستحملها لالتقاط التجزئة الصحيحة،
والتي ستخرج مبكراً مع خطأ متوقع "Operation canceled". ثم
ستعيد بناء الوحدة وتحميلها بالتجزئة الصحيحة. لاحظ أن هذه
التعليمات تفترض استهداف النظام الأصلي. لاحظ أيضاً أن أدنى
إصدار 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
عمليات genkey و pubkey في السطر الأخير هي اختبارات وظائف أساسية.
إذا كان كل شيء على ما يرام، فستنجح وتطبع مفتاحاً عاماً عشوائياً.
كما هو الحال مع الإجراء غير المعتمد من FIPS، إذا نجح كل ما سبق، فأنت
الآن جاهز لتشغيل أنفاق WolfGuard. يمكن استخدام أدلة التشغيل الحالية
والبرامج النصية الخاصة بـ WireGuard مباشرة، بشرط استبدال /etc/wolfguard بدلاً من
/etc/wireguard، وإنشاء جميع المفاتيح باستخدام أداة WolfGuard wg-fips (سيكون wg
في هذه المرحلة رابطاً لـ wg-fips). لكن لاحظ أن بعض تطبيقات عميل WireGuard
وأطر التشغيل الآلي تتوقع أن يتم تصدير المفاتيح العامة لـ WireGuard بـ 44 حرفاً بالضبط
من base64. المفاتيح العامة لـ WolfGuard تكون تقريباً ضعف ذلك الطول،
ما لم يتم بناؤها مع WG_USE_PUBLIC_KEY_COMPRESSION، والذي
غير مدعوم حالياً في FIPS v5، لكنه مدعوم في FIPS v6 والإصدارات الأحدث.
| فئة الخوارزمية | WireGuard | WolfGuard |
|---|
| ECDH | Curve25519 | SECP256R1 |
| AEAD | XChaCha20-Poly1305 | AES-256-GCM |
| digest | Blake2s | SHA2-256 |
| digest المصادق عليه | Blake2s-HMAC | SHA2-256-HMAC |
| التجزئة الداخلية | SipHash | SHA2-256 |
| DRBG | ChaCha20 DRBG | SHA2-256 Hash-DRBG |