
FIPS 140-3-konformes VPN-Kernelmodul und Benutzerwerkzeug, Drop-in-Ersatz für WireGuard mit AES-256-GCM-, SHA2-256- und SECP256R1-Kryptographie für sicheres Tunneln.
WolfGuard ist das wolfSSL FIPS-konforme Refactoring des auf dem Linux-Kernel basierenden WireGuard, ursprünglich entworfen und verfasst von Jason Donenfeld. Die Verwendung ist im Wesentlichen identisch. Es gibt zwei Hauptkomponenten von WolfGuard: das Kernelmodul wolfguard.ko und das Konfigurationswerkzeug wg-fips. wolfguard.ko hängt vom Kernelmodul libwolfssl.ko ab, und wg-fips hängt von der Bibliothek libwolfssl.so ab – diese Abhängigkeiten werden aus derselben wolfSSL-Quelle erstellt, jeweils mit Kernelmodul- und Benutzerbibliothekskonfiguration. Das Skript wg-fips-quick funktioniert genau wie wg-quick in WireGuard, jedoch mit Konfigurationsskripten in /etc/wolfguard, die öffentliche und private SECP256R1-Schlüssel enthalten.
Im Installations-Bin-Verzeichnis werden symbolische Links von wg auf wg-fips und von wg-quick auf wg-fips-quick installiert, um einen transparenten Drop-in-Ersatz von WireGuard zu ermöglichen. Falls während der Installation WireGuard-Executables gefunden werden, werden sie in wg-wireguard und wg-wireguard-quick umbenannt, wobei wg-wireguard-quick modifiziert wird, um wg-wireguard aufzurufen, und eine Sicherheitskopie als wg-wireguard-quick.unpatched hinterlassen wird.
WolfGuard bildet die Kryptographie von WireGuard wie folgt ab:
Beachten Sie, dass WolfGuard und WireGuard auf demselben System koexistieren können und gleichzeitig WolfGuard- und WireGuard-Tunnel eingerichtet werden können.
Wenn libwolfssl.ko mit --enable-intelasm konfiguriert ist, erreicht oder übertrifft die Leistung von WolfGuard die von CPU-beschleunigtem WireGuard, dank CPU-Beschleunigung der AES-256-GCM- und SHA2-256-Operationen. Ohne --enable-intelasm ist WolfGuard etwas langsamer als CPU-beschleunigtes WireGuard, kann aber auf modernen CPUs dennoch Gigabit-Ethernet auslasten.
Im Folgenden finden Sie zwei Anleitungen: die erste zum Erstellen aus Nicht-FIPS-Quellen und die zweite zum Erstellen aus FIPS-zertifizierten Quellen. In beiden Fällen sind das WolfGuard-Benutzerwerkzeug und das Skript wg-fips und wg-fips-quick benannt, was ihre Verwendung von FIPS-zugelassenen Algorithmen widerspiegelt, unabhängig vom FIPS-Zertifizierungsstatus. FIPS-zertifizierte und nicht zertifizierte Builds von WolfGuard sind vollständig miteinander interoperabel, können jedoch nicht mit WireGuard interoperieren.
Die Option --enable-intelasm sollte nur mit x86-CPU-Zielen verwendet werden, und für FIPS nur auf FIPS-Quellen, die es unterstützen. Kontaktieren Sie uns unter [email protected] für weitere Informationen.
Die Option --enable-wolfguard aktiviert den minimalen Bibliotheks-/Modul-Feature-Satz, der für WolfGuard erforderlich ist. Verwenden Sie stattdessen --enable-all-crypto für einen umfassenderen Funktionsumfang.
Befehle mit vorangestelltem $ sollten von einem unprivilegierten Benutzer ausgeführt werden, während solche mit # mit root-Rechten ausgeführt werden müssen, jedoch im selben etablierten Arbeitsverzeichniskontext.
Beachten Sie, dass bei Verwendung eines wolfSSL-Release-Archivs anstelle von git-Quellen die Version 5.8.4 oder neuer sein muss.
git-Quellen(1) Erstellen Sie ein übergeordnetes Verzeichnis für die Quellen und füllen Sie es:
$ 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) Bauen und installieren Sie die libwolfssl-Benutzerbibliothek:
Hinweis: Dieser Schritt ist unter Linux optional, wo standardmäßig wg-fips die Schlüsselgenerierungs- und Konvertierungsoperationen an das Kernelmodul auslagert, anstatt sie intern durchzuführen.
$ cd wolfssl
$ ./configure --quiet --enable-wolfguard --enable-all-asm
$ make -j
$ ./wolfcrypt/test/testwolfcrypt
# make install
$ cd ..
(3) Bauen und installieren Sie das wg-fips-Benutzerwerkzeug – Hinweis: Die Installation verschiebt vorhandene WireGuard-wg- und wg-quick-Executables sowie Manpages in den Zielverzeichnissen (falls vorhanden) nach wg-wireguard bzw. wg-wireguard-quick und installiert symbolische Links für wg und wg-quick, die auf die WolfGuard-Versionen verweisen.
$ cd wolfguard/user-src
$ make -j
# make install
$ cd ../..
Um auf Linux die Verwendung interner Schlüsseloperationen zu erzwingen, anstatt der Standardauslagerung an das Kernelmodul, ersetzen Sie make -j durch make -j NO_IPC_LLCRYPTO=1.
Unterstützung ist verfügbar für komprimierte öffentliche Schlüssel, deren base64-exportierte Längen denen der öffentlichen Curve25519-Schlüssel von WireGuard entsprechen. Dies kann durch Ersetzen von
$ make -j EXTRA_CFLAGS=-DWG_USE_PUBLIC_KEY_COMPRESSION
im obigen aktiviert werden. Beachten Sie jedoch, dass WolfGuard mit WG_USE_PUBLIC_KEY_COMPRESSION mit den Standardeinstellungen von WolfGuard inkompatibel ist – wenn gesetzt, werden komprimierte öffentliche Schlüssel bereitgestellt und erwartet, sowohl in der lokalen Konfiguration als auch in Over-the-Wire-Verhandlungen.
(4) Bauen und installieren Sie das libwolfssl-Kernelmodul. Ersetzen Sie /usr/src/linux durch den Pfad zu Ihrem tatsächlichen Ziel-Kernelquellbaum, der vollständig konfiguriert und gebaut sein muss und genau dem Kernel entsprechen muss, den Sie auf Ihrem Zielsystem booten werden. Das modprobe am Ende setzt voraus, dass Sie das native laufende System als Ziel haben.
$ 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
Bevor Sie das libwolfssl-Kernelmodul in Produktion nehmen, sollten Sie es mit aktiviertem erweiterten Selbsttest bauen und laden. Ersetzen Sie das obige ./configure-Rezept durch Folgendes:
$ ./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
Die zusätzlichen Optionen sind nicht für die Produktion geeignet, aber ein damit konfiguriertes Modul sollte in einer repräsentativen Laufzeitumgebung geladen werden, um zu bestätigen, dass alle Algorithmen korrekt funktionieren.
(5) Bauen und installieren Sie das WolfGuard-Kernelmodul. Ersetzen Sie erneut /usr/src/linux durch den Pfad zu Ihrem tatsächlichen Ziel-Kernelquellbaum und ersetzen Sie 6.16.5-gentoo durch den tatsächlichen Wert, der von uname -r auf dem Zielsystem zurückgegeben wird. Auch hier setzt das modprobe nach dem Build voraus, dass Sie das native laufende System als Ziel haben.
$ 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
Der KERNELRELEASE-Wert ist im Wesentlichen der wörtliche Name des Verzeichnisses unter /lib/modules/, in dem die Module des Zielkernels installiert sind.
Die Operationen genkey und pubkey in der letzten Zeile sind grundlegende Funktionstests. Wenn alles in Ordnung ist, wird es erfolgreich sein und einen zufälligen öffentlichen Schlüssel ausgeben.
Wie beim obigen wg-fips-Build kann die Unterstützung für komprimierte öffentliche Schlüssel durch Hinzufügen von EXTRA_CFLAGS=-DWG_USE_PUBLIC_KEY_COMPRESSION zum obigen make-Rezept aktiviert werden. Die Einstellung WG_USE_PUBLIC_KEY_COMPRESSION muss im gesamten Ökosystem übereinstimmen.
Wenn alles oben Genannte erfolgreich ist, sind Sie nun bereit, WolfGuard-Tunnel einzurichten. Bestehende Playbooks und Skripte für WireGuard können direkt verwendet werden, sofern Sie /etc/wolfguard durch /etc/wireguard ersetzen und alle Schlüssel mit dem WolfGuard-wg-fips-Werkzeug generieren (wg wird zu diesem Zeitpunkt ein Link auf wg-fips sein).
FIPS-zertifizierte Versionen des wolfssl-Quellarchivs werden separat bereitgestellt. Kontaktieren Sie [email protected].
(1) Erstellen Sie ein übergeordnetes Verzeichnis für die Quellen und füllen Sie es. Dieses Verfahren geht von einem wolfssl-Archiv im 7z-Format aus – ersetzen Sie tar -xf, wenn das Archiv eine .tar.gz ist. Passen Sie in beiden Fällen das ln -s-Rezept an, um sicherzustellen, dass wolfssl ein symbolischer Link auf das extrahierte wolfssl-Verzeichnis ist. Beachten Sie auch, dass FIPS-Kernelmodul-Archive sich von Nicht-Kernel-Archiven unterscheiden, obwohl sie für den Bau der FIPS-Benutzerbibliothek sicher verwendet werden können, wie unten gezeigt.
$ 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) Bauen und installieren Sie die libwolfssl-Benutzerbibliothek.
Hinweis: Dieser Schritt ist unter Linux optional, wo standardmäßig wg-fips die Schlüsselgenerierungs- und Konvertierungsoperationen an das Kernelmodul auslagert, anstatt sie intern durchzuführen.
$ cd wolfssl
$ ./configure --quiet --enable-fips=vX --enable-wolfguard
$ make -j
$ ./fips-hash.sh
$ make -j
$ ./wolfcrypt/test/testwolfcrypt
# make install
$ cd ..
Beachten Sie, dass das Argument für --enable-fips dem FIPS-Flavor des Archivs entsprechen muss. Derzeit sind die am besten geeigneten Argumente für die WolfGuard-Nutzung v5.2.4 und v6.
(3) Bauen und installieren Sie das wg-fips-Benutzerwerkzeug – Hinweis: Die Installation verschiebt vorhandene WireGuard-wg- und wg-quick-Executables sowie Manpages in den Zielverzeichnissen (falls vorhanden) nach wg-wireguard bzw. wg-wireguard-quick und installiert symbolische Links für wg und wg-quick, die auf die WolfGuard-Versionen verweisen.
$ cd wolfguard/user-src
$ make -j
# make install
$ cd ../..
Um auf Linux die Verwendung interner Schlüsseloperationen zu erzwingen, anstatt der Standardauslagerung an das Kernelmodul, ersetzen Sie make -j durch make -j NO_IPC_LLCRYPTO=1.
(4) Bauen und installieren Sie das libwolfssl-Kernelmodul. Ersetzen Sie /usr/src/linux durch den Pfad zu Ihrem tatsächlichen Ziel-Kernelquellbaum, der vollständig konfiguriert und gebaut sein muss und genau dem Kernel entsprechen muss, den Sie auf Ihrem Zielsystem booten werden.
Dies ist ein zweistufiger Prozess. Zuerst bauen und installieren Sie das Modul mit einem falschen Integritäts-Hash. Dann laden Sie es, um den korrekten Hash zu erfassen, was mit einem erwarteten Fehler „Operation canceled“ frühzeitig beendet wird. Dann bauen und laden Sie das Modul mit dem korrekten Hash neu. Beachten Sie, dass diese Anweisungen das Zielen auf das native System voraussetzen. Beachten Sie auch, dass die niedrigste libwolfssl-FIPS-Version, die mit dem Linux-Kernel-Modus kompatibel ist, v5.2.4 ist.
$ 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
(Erwarten Sie das frühzeitige Beenden des obigen modprobe mit einer „Operation canceled“-Meldung.)
$ 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
Falls der zweite modprobe wie der erste fehlschlägt, mit einer weiteren Meldung „Update verifyCore[] in fips_test.c with new hash ...“ im Kernel-Log, dann verhindern Ihre Toolchain und/oder Zielkernel-Konfiguration einen reproduzierbaren Build. In diesem Fall sollten Sie diese alternative Strategie verwenden, indem Sie die Schritte nach dem obigen NEWHASH=-Befehl ersetzen:
$ make module-update-fips-hash FIPS_HASH="$NEWHASH"
# make install
# modprobe libwolfssl
Bevor Sie das libwolfssl-Kernelmodul in Produktion nehmen, sollten Sie es mit aktiviertem erweiterten Selbsttest bauen und laden. Ersetzen Sie dazu das obige ./configure-Rezept durch Folgendes:
$ ./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
Die zusätzlichen Optionen sind nicht für die Produktion geeignet, aber ein damit konfiguriertes Modul sollte in einer repräsentativen Laufzeitumgebung geladen werden, um zu bestätigen, dass alle Algorithmen korrekt funktionieren.
(5) Bauen und installieren Sie das WolfGuard-Kernelmodul. Ersetzen Sie erneut /usr/src/linux durch den Pfad zu Ihrem tatsächlichen Ziel-Kernelquellbaum und ersetzen Sie 6.16.5-gentoo durch den tatsächlichen Wert, der von uname -r auf dem Zielsystem zurückgegeben wird.
$ 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
Die Operationen genkey und pubkey in der letzten Zeile sind grundlegende Funktionstests. Wenn alles in Ordnung ist, wird es erfolgreich sein und einen zufälligen öffentlichen Schlüssel ausgeben.
Wie beim nicht FIPS-zertifizierten Verfahren: Wenn alles oben Genannte erfolgreich ist, sind Sie nun bereit, WolfGuard-Tunnel einzurichten. Bestehende Playbooks und Skripte für WireGuard können direkt verwendet werden, sofern Sie /etc/wolfguard durch /etc/wireguard ersetzen und alle Schlüssel mit dem WolfGuard-wg-fips-Werkzeug generieren (wg wird zu diesem Zeitpunkt ein Link auf wg-fips sein). Beachten Sie jedoch, dass einige WireGuard-Clientanwendungen und Automatisierungsframeworks erwarten, dass öffentliche WireGuard-Schlüssel mit genau 44 Zeichen base64 exportiert werden. WolfGuard-öffentliche Schlüssel sind ungefähr doppelt so lang, es sei denn, sie wurden mit WG_USE_PUBLIC_KEY_COMPRESSION gebaut, was derzeit in FIPS v5 nicht unterstützt wird, aber in FIPS v6 und später unterstützt wird.
| Algorithmuskategorie | WireGuard | WolfGuard |
|---|
| ECDH | Curve25519 | SECP256R1 |
| AEAD | XChaCha20-Poly1305 | AES-256-GCM |
| Digest | Blake2s | SHA2-256 |
| authentisierender Digest | Blake2s-HMAC | SHA2-256-HMAC |
| interner Hash | SipHash | SHA2-256 |
| DRBG | ChaCha20 DRBG | SHA2-256 Hash-DRBG |