
Соответствующий FIPS 140-3 модуль ядра VPN и пользовательский инструмент, замена WireGuard с шифрованием AES-256-GCM, SHA2-256 и SECP256R1 для безопасного туннелирования.
WolfGuard — это соответствующий требованиям FIPS рефакторинг WireGuard на основе ядра Linux от wolfSSL, изначально разработанный Джейсоном Доненфельдом. Использование практически идентично. WolfGuard состоит из двух основных компонентов: модуля ядра wolfguard.ko и утилиты настройки wg-fips. wolfguard.ko зависит от модуля ядра libwolfssl.ko, а wg-fips зависит от библиотеки libwolfssl.so — эти зависимости собираются из одного и того же исходного кода wolfSSL с конфигурацией для модуля ядра и пользовательской библиотеки соответственно. Скрипт wg-fips-quick работает точно так же, как wg-quick в WireGuard, но с файлами конфигурации в /etc/wolfguard, содержащими открытые и закрытые ключи SECP256R1.
В каталог установки устанавливаются символические ссылки: 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 следующим образом:
| Категория алгоритма | 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 |
Обратите внимание, что WolfGuard и WireGuard могут сосуществовать в одной системе, одновременно устанавливая туннели WolfGuard и WireGuard.
Если libwolfssl.ko сконфигурирован с --enable-intelasm, производительность WolfGuard соответствует или превышает производительность WireGuard с аппаратным ускорением благодаря ускорению операций AES-256-GCM и SHA2-256 на CPU. Без --enable-intelasm WolfGuard немного медленнее WireGuard с аппаратным ускорением, но все же способен насытить гигабитный Ethernet на современных CPU.
Ниже приведены два набора инструкций: первый для сборки из не-FIPS исходников, второй для сборки из сертифицированных по FIPS исходников. В обоих случаях пользовательская утилита и скрипт WolfGuard называются wg-fips и wg-fips-quick, что отражает использование алгоритмов, одобренных FIPS, независимо от статуса сертификации FIPS. Сертифицированные и несертифицированные сборки WolfGuard полностью совместимы друг с другом, но не могут взаимодействовать с WireGuard.
Опцию --enable-intelasm следует использовать только для целей x86 CPU, а для FIPS — только для тех исходников FIPS, которые её поддерживают. Свяжитесь с нами по адресу [email protected] для получения дополнительной информации.
Опция --enable-wolfguard включает минимальный набор функций библиотеки/модуля, необходимый для WolfGuard. Для более полного набора функций используйте --enable-all-crypto.
Команды с префиксом $ должны выполняться непривилегированным пользователем, а команды с # — с привилегиями root, но в том же рабочем каталоге.
Обратите внимание, что если вместо исходников 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 и страницы man в целевых каталогах (если они есть) в 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.
Поддерживаются сжатые открытые ключи, длина которых в кодировке 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/wireguard на /etc/wolfguard и генерации всех ключей с помощью утилиты WolfGuard wg-fips (wg на этом этапе будет ссылкой на wg-fips).