
Módulo de kernel VPN y herramienta de usuario compatibles con FIPS 140-3, reemplazo directo de WireGuard con criptografía AES-256-GCM, SHA2-256 y SECP256R1 para túneles seguros.
WolfGuard es la refactorización compatible con FIPS de wolfSSL del
WireGuard basado en el kernel de Linux, originalmente diseñado y escrito por
Jason Donenfeld. El uso es esencialmente idéntico. Hay dos componentes
principales de WolfGuard: el módulo del kernel wolfguard.ko y la herramienta de configuración wg-fips.
wolfguard.ko depende del módulo del kernel libwolfssl.ko, y wg-fips depende de la biblioteca libwolfssl.so — estas
dependencias se construyen a partir de la misma fuente de
wolfSSL, con configuración de módulo del kernel y biblioteca de usuario respectivamente. El script wg-fips-quick
funciona exactamente como wg-quick en WireGuard, pero con scripts de configuración en
/etc/wolfguard que contienen claves públicas y privadas SECP256R1.
Se instalan enlaces simbólicos en el directorio bin de instalación desde wg a
wg-fips, y desde wg-quick a wg-fips-quick, para un reemplazo directo transparente
de WireGuard. Si se encuentran ejecutables de WireGuard durante la
instalación, se renombran a wg-wireguard y wg-wireguard-quick, con
wg-wireguard-quick modificado para llamar a wg-wireguard, y con una copia de seguridad
dejada como wg-wireguard-quick.unpatched.
WolfGuard reasigna la criptografía de WireGuard de la siguiente manera:
Tenga en cuenta que WolfGuard y WireGuard pueden coexistir en el mismo sistema, estableciendo túneles WolfGuard y WireGuard simultáneamente.
Si libwolfssl.ko está configurado con --enable-intelasm, el rendimiento de
WolfGuard iguala o supera al de WireGuard acelerado por CPU, gracias a la
aceleración de CPU de las operaciones AES-256-GCM y SHA2-256. Sin
--enable-intelasm, WolfGuard es ligeramente más lento que WireGuard acelerado por CPU,
pero aún es capaz de saturar gigabit ethernet en CPUs modernas.
A continuación se presentan dos conjuntos de instrucciones, el primero para construir a partir de fuentes
no FIPS, y el segundo para construir a partir de fuentes certificadas FIPS. En ambos
casos, la herramienta de usuario y el script de WolfGuard se denominan wg-fips y
wg-fips-quick, reflejando su uso de algoritmos aprobados por FIPS independientemente del
estado de certificación FIPS. Las compilaciones certificadas FIPS y no certificadas de WolfGuard
son completamente interoperables entre sí, pero no pueden interoperar con WireGuard.
La opción --enable-intelasm solo debe usarse con objetivos de CPU x86, y para
FIPS, solo en fuentes FIPS que lo soporten. Contáctenos en [email protected]
para más información.
La opción --enable-wolfguard habilita el conjunto mínimo de características de biblioteca/módulo
requerido para WolfGuard. Para un conjunto de características más completo, use
--enable-all-crypto en su lugar.
Los comandos precedidos por $ deben ser ejecutados por un usuario sin privilegios,
mientras que aquellos con # deben ejecutarse con privilegios de root, pero en el mismo
contexto de directorio de trabajo establecido.
Tenga en cuenta que si se utiliza un archivo de lanzamiento de wolfSSL en lugar de las fuentes git, el
lanzamiento debe ser la versión 5.8.4 o más reciente.
git no FIPS(1) Cree un directorio de nivel superior para las fuentes y complételo:
$ 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) Construya e instale la biblioteca de usuario libwolfssl:
Nota: este paso es opcional en Linux, donde por defecto wg-fips descarga las operaciones de
generación y conversión de claves al módulo del kernel, en lugar de
realizarlas internamente.
$ cd wolfssl
$ ./configure --quiet --enable-wolfguard --enable-all-asm
$ make -j
$ ./wolfcrypt/test/testwolfcrypt
# make install
$ cd ..
(3) Construya e instale la herramienta de usuario wg-fips -- tenga en cuenta que la instalación moverá los
ejecutables y páginas man existentes de WireGuard wg y wg-quick en los directorios de destino (si
están presentes) a wg-wireguard y wg-wireguard-quick respectivamente, e
instalará enlaces simbólicos para wg y wg-quick que apunten a las versiones de WolfGuard.
$ cd wolfguard/user-src
$ make -j
# make install
$ cd ../..
Para forzar el uso de operaciones de clave internas en Linux, en lugar de la descarga predeterminada al
módulo del kernel, reemplace make -j con make -j NO_IPC_LLCRYPTO=1.
Hay soporte disponible para claves públicas comprimidas, cuyas longitudes exportadas en base64 son las mismas que las claves públicas Curve25519 de WireGuard. Esto se puede habilitar sustituyendo
$ make -j EXTRA_CFLAGS=-DWG_USE_PUBLIC_KEY_COMPRESSION
en lo anterior. Sin embargo, tenga en cuenta que WolfGuard con
WG_USE_PUBLIC_KEY_COMPRESSION es incompatible con la configuración predeterminada de WolfGuard --
cuando se establece, se suministran y esperan claves públicas comprimidas, tanto en la
configuración local como en las negociaciones a través de la red.
(4) Construya e instale el módulo del kernel libwolfssl. Reemplace /usr/src/linux con
la ruta a su árbol de fuentes del kernel de destino real, que debe estar completamente
configurado y construido, y coincidir exactamente con el kernel que arrancará en su
sistema de destino. El modprobe al final asume que está apuntando al sistema nativo
en ejecución.
$ 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
Antes de poner el módulo del kernel libwolfssl en producción, debe construirlo y
cargarlo con la autocomprobación extendida habilitada. Reemplace la receta ./configure anterior
con lo siguiente:
$ ./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
Las opciones adicionales no son apropiadas para producción, pero un módulo configurado con ellas debe cargarse en un entorno de ejecución representativo para confirmar que todos los algoritmos funcionan correctamente.
(5) Construya e instale el módulo del kernel de WolfGuard. Nuevamente, reemplace
/usr/src/linux con la ruta a su árbol de fuentes del kernel de destino real, y
reemplace 6.16.5-gentoo con el valor real devuelto por uname -r en el
sistema de destino. Y nuevamente, el modprobe después de la construcción asume que está apuntando
al sistema nativo en ejecución.
$ 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
El valor KERNELRELEASE es, efectivamente, el nombre exacto del directorio
bajo /lib/modules/ donde están instalados los módulos del kernel de destino.
Las operaciones genkey y pubkey en la línea final son pruebas de funcionalidad básica.
Si todo está bien, tendrá éxito e imprimirá una clave pública aleatoria.
Al igual que con la construcción de wg-fips anterior, el soporte de clave pública comprimida se puede habilitar
agregando EXTRA_CFLAGS=-DWG_USE_PUBLIC_KEY_COMPRESSION a la receta make
anterior. La configuración WG_USE_PUBLIC_KEY_COMPRESSION debe coincidir en todo
el ecosistema.
Si todo lo anterior tiene éxito, entonces ya está listo para levantar túneles WolfGuard.
Los manuales y scripts existentes para WireGuard se pueden usar directamente,
siempre que sustituya /etc/wolfguard por /etc/wireguard, y genere todas las
claves usando la herramienta WolfGuard wg-fips (wg en este punto será un enlace a
wg-fips).
Las versiones certificadas FIPS del archivo fuente wolfssl se proporcionan por separado. Contacte a [email protected].
(1) Cree un directorio de nivel superior para las fuentes y complételo. Este
procedimiento asume un archivo wolfssl en formato 7z -- sustituya tar -xf si el
archivo es un .tar.gz. En cualquier caso, ajuste la receta ln -s para asegurar
que wolfssl sea un enlace simbólico al directorio wolfssl extraído. También tenga en cuenta que
los archivos del módulo del kernel FIPS son distintos de los archivos que no son del kernel, aunque
son seguros de usar para construir la biblioteca de usuario FIPS, como se muestra a continuación.
$ 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) Construya e instale la biblioteca de usuario libwolfssl.
Nota: este paso es opcional en Linux, donde por defecto wg-fips descarga las operaciones de
generación y conversión de claves al módulo del kernel, en lugar de
realizarlas internamente.
$ cd wolfssl
$ ./configure --quiet --enable-fips=vX --enable-wolfguard
$ make -j
$ ./fips-hash.sh
$ make -j
$ ./wolfcrypt/test/testwolfcrypt
# make install
$ cd ..
Nota: el argumento para --enable-fips
debe coincidir con la variante FIPS del archivo. Actualmente, los argumentos más adecuados
para el uso de WolfGuard son v5.2.4 y v6.
(3) Construya e instale la herramienta de usuario wg-fips -- tenga en cuenta que la instalación moverá los
ejecutables y páginas man existentes de WireGuard wg y wg-quick en los directorios de destino (si
están presentes) a wg-wireguard y wg-wireguard-quick respectivamente, e
instalará enlaces simbólicos para wg y wg-quick que apunten a las versiones de WolfGuard.
$ cd wolfguard/user-src
$ make -j
# make install
$ cd ../..
Para forzar el uso de operaciones de clave internas en Linux, en lugar de la descarga predeterminada al
módulo del kernel, reemplace make -j con make -j NO_IPC_LLCRYPTO=1.
(4) Construya e instale el módulo del kernel libwolfssl. Reemplace /usr/src/linux con
la ruta a su árbol de fuentes del kernel de destino real, que debe estar completamente
configurado y construido, y coincidir exactamente con el kernel que arrancará en su
sistema de destino.
Este es un proceso de dos pasos. Primero construirá e instalará el módulo con un
hash de integridad incorrecto. Luego lo cargará para capturar el hash correcto,
que saldrá temprano con un error esperado de "Operación cancelada". Luego
reconstruirá y cargará el módulo con el hash correcto. Tenga en cuenta que estas
instrucciones asumen que apunta al sistema nativo. También tenga en cuenta que la
versión más baja de libwolfssl FIPS compatible con el modo de kernel de Linux es 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
(Espere una salida temprana del modprobe anterior, con un mensaje de "Operación cancelada".)
$ 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
Si el segundo modprobe falla como el primero, con otro mensaje "Update
verifyCore[] in fips_test.c with new hash ..." en el registro del kernel, entonces
su cadena de herramientas y/o la configuración del kernel de destino están impidiendo una compilación
reproducible. En ese caso, debe usar esta estrategia alternativa, reemplazando los pasos
después del comando NEWHASH= anterior:
$ make module-update-fips-hash FIPS_HASH="$NEWHASH"
# make install
# modprobe libwolfssl
Antes de poner el módulo del kernel libwolfssl en producción, debe construirlo y
cargarlo con la autocomprobación extendida habilitada. Para hacer esto, reemplace la receta ./configure
anterior con lo siguiente:
$ ./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
Las opciones adicionales no son apropiadas para producción, pero un módulo configurado con ellas debe cargarse en un entorno de ejecución representativo para confirmar que todos los algoritmos funcionan correctamente.
(5) Construya e instale el módulo del kernel de WolfGuard. Nuevamente, reemplace
/usr/src/linux con la ruta a su árbol de fuentes del kernel de destino real, y
reemplace 6.16.5-gentoo con el valor real devuelto por uname -r en el
sistema de destino.
$ 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
Las operaciones genkey y pubkey en la línea final son pruebas de funcionalidad básica.
Si todo está bien, tendrá éxito e imprimirá una clave pública aleatoria.
Al igual que con el procedimiento no certificado FIPS, si todo lo anterior tiene éxito, entonces
ya está listo para levantar túneles WolfGuard. Los manuales y scripts existentes
para WireGuard se pueden usar directamente, siempre que sustituya /etc/wolfguard por
/etc/wireguard, y genere todas las claves usando la herramienta WolfGuard wg-fips (wg
en este punto será un enlace a wg-fips). Sin embargo, tenga en cuenta que algunas
aplicaciones cliente y marcos de automatización de WireGuard esperan que las claves públicas de WireGuard se
exporten con exactamente 44 caracteres de base64. Las claves públicas de WolfGuard son
aproximadamente el doble de esa longitud, a menos que se construyan con WG_USE_PUBLIC_KEY_COMPRESSION,
que actualmente no es compatible con FIPS v5, pero sí con FIPS v6 y
posteriores.
| Categoría de algoritmo | WireGuard | WolfGuard |
|---|
| ECDH | Curve25519 | SECP256R1 |
| AEAD | XChaCha20-Poly1305 | AES-256-GCM |
| digest | Blake2s | SHA2-256 |
| digest autenticante | Blake2s-HMAC | SHA2-256-HMAC |
| hash interno | SipHash | SHA2-256 |
| DRBG | ChaCha20 DRBG | SHA2-256 Hash-DRBG |