Nowa implementacja VPN WireGuard dodana do bazy kodu FreeBSD

Drzewo źródeł FreeBSD zostało zaktualizowane o nową implementację VPN WireGuard, opartą na kodzie modułu jądra opracowanym wspólnie przez główne zespoły programistów FreeBSD i WireGuard przy udziale Jasona A. Donenfelda, autora VPN WireGuard i Johna H. Baldwina), znany twórca GDB i FreeBSD, który na początku XXI wieku zaimplementował obsługę SMP i NUMA w jądrze FreeBSD. Po przyjęciu sterownika do FreeBSD (sys/dev/wg), jego rozwój i konserwacja będą odtąd prowadzone w repozytorium FreeBSD.

Przed przyjęciem kodu przeprowadzono pełny przegląd zmian przy wsparciu Fundacji FreeBSD, podczas którego przeanalizowano także interakcję sterownika z resztą podsystemów jądra oraz możliwość wykorzystania prymitywów kryptograficznych udostępnianych przez jądro został oceniony.

Aby wykorzystać wymagane przez sterownik algorytmy kryptograficzne, rozszerzono API krypto-podsystemu jądra FreeBSD, do którego dodano uprząż umożliwiającą wykorzystanie algorytmów nieobsługiwanych we FreeBSD poprzez standardowy crypto-API, wykorzystując implementację niezbędne algorytmy z biblioteki libsodium. Z algorytmów wbudowanych w sterownik pozostał jedynie kod do obliczania skrótów Blake2, ponieważ implementacja tego algorytmu zapewniona we FreeBSD jest powiązana ze stałym rozmiarem skrótu.

Dodatkowo w trakcie przeglądu przeprowadzono optymalizację kodu, co pozwoliło zwiększyć efektywność rozkładu obciążenia na wielordzeniowych procesorach (zapewniono równomierne zrównoważenie przydziału zadań szyfrowania i deszyfrowania pakietów do rdzeni procesora). W rezultacie obciążenie związane z przetwarzaniem pakietów było zbliżone do tych związanych z implementacją sterownika dla systemu Linux. Kod zapewnia także możliwość wykorzystania sterownika ossl w celu przyspieszenia operacji szyfrowania.

W przeciwieństwie do poprzedniej próby integracji WireGuarda z FreeBSD, nowa implementacja wykorzystuje standardowe narzędzie wg, a nie zmodyfikowaną wersję ifconfig, co umożliwia ujednolicenie konfiguracji w systemie Linux i FreeBSD. Narzędzie wg, podobnie jak sterownik, znajduje się w kodzie źródłowym FreeBSD, co było możliwe dzięki zmianie licencji na kod wg (kod jest teraz dostępny na licencjach MIT i GPL). Ostatnia próba włączenia WireGuarda do FreeBSD miała miejsce w 2020 roku, ale zakończyła się skandalem, w wyniku którego dodany już kod został usunięty ze względu na niską jakość, nieostrożną pracę z buforami, użycie stubów zamiast czeków, niekompletną implementację protokołu i naruszenie licencji GPL.

Przypomnijmy, że VPN WireGuard jest zaimplementowany w oparciu o nowoczesne metody szyfrowania, zapewnia bardzo wysoką wydajność, jest łatwy w użyciu, pozbawiony komplikacji i sprawdził się w wielu dużych wdrożeniach przetwarzających duże ilości ruchu. Projekt rozwijany od 2015 roku przeszedł audyt i formalną weryfikację stosowanych metod szyfrowania. WireGuard wykorzystuje koncepcję routingu klucza szyfrowania, która obejmuje powiązanie klucza prywatnego z każdym interfejsem sieciowym i użycie kluczy publicznych do powiązania.

Wymiana kluczy publicznych w celu nawiązania połączenia jest podobna do SSH. Aby negocjować klucze i łączyć się bez uruchamiania oddzielnego demona przestrzeni użytkownika, używany jest mechanizm Noise_IK z Noise Protocol Framework, podobny do utrzymywania autoryzowanych_kluczy w SSH. Transmisja danych odbywa się poprzez enkapsulację w pakietach UDP. Obsługuje zmianę adresu IP serwera VPN (roaming) bez zrywania połączenia z automatyczną rekonfiguracją klienta.

Szyfrowanie wykorzystuje szyfr strumieniowy ChaCha20 i algorytm uwierzytelniania wiadomości (MAC) Poly1305 opracowany przez Daniela J. Bernsteina, Tanję Lange i Petera Schwabe. ChaCha20 i Poly1305 są pozycjonowane jako szybsze i bezpieczniejsze analogi AES-256-CTR i HMAC, których implementacja programowa pozwala osiągnąć stały czas wykonania bez angażowania specjalnego wsparcia sprzętowego. Do wygenerowania wspólnego tajnego klucza wykorzystywany jest protokół krzywej eliptycznej Diffiego-Hellmana w implementacji Curve25519, również zaproponowany przez Daniela Bernsteina. Do haszowania używany jest algorytm BLAKE2s (RFC7693).

Źródło: opennet.ru

Dodaj komentarz