Translate

неділя, 2 червня 2019 р.

WireGuard VPN. Part I: Intro

WireGuard  - сучасний мережевий тунель, що працює на 3 рівні моделі OSI, повністю реалізований в просторі ядра Linux (хоча клієнти можуть працювати і в просторі користувача) завдяки чому досягається вища швидкість передачі даних на відміну від OpenVPN. Останній має значно більшу кодову базу (~120 тисяч рядків коду проти 4000 WireGuard) і лише частково працює в просторі ядра.

WireGuard розповсюджується як відкрите програмне забезпечення під ліцензією GPLv2. Хоч продукт вже і достатньо зрілий, проте, як говорить основний розробник і автор проекту Джейсон А. Доненфельд, його поки не варто використовувати в production-цілях, адже код ще не пройшов належний рівень аудиту безпеки. В майбутньому його планують повністю включити в ядро, а наразі він розповсюджується як окремий DKMS-модуль. Про WireGuard вже позитивно висловлювались Лінус Торвальдс та Грег Кроа-Хартман, порівнюючи його із витвором мистецтва.


OpenVPN, як і інші популярні рішення для створення тунелів, використовує TLS-протокол і як наслідок бібліотеку openssl для шифрування, безпечного з'єднання, інфраструктури приватних ключів і т.п. Це досить універсальні бібліотеки, що мають дуже обширну кодову базу і часом були компрометовані. У той же час WireGuard використовує власну бібліотеку, в котрій реалізовані лише необхідні алгоритми. Це як плюс, так і мінус: якщо в OpenVPN власник сервера може самостійно вказувати необхідні алгоритми обміну ключами, симетричного шифрування, перевірки цілісності даних і т.п. (всі алгоритми, котрі підтримує openssl), то в WireGuard вони вшиті в програмне забезпечення. Проект WireGuard подає це як перевагу: у разі знаходження проблем в алгоритмах вони будуть оновлені одразу із оновленням основного програмного забезпечення, коли ж у випадку із OpenVPN за шифронабором необхідно слідкувати самому, адже те що було безпечним вчора може водночас стати даремним сьогодні (наприклад DES, MD5, SHA1). І в цьому є логіка - як показує практика, якщо програмне забезпечення дійсно інколи оновлюють, то перегляд конфігураційних файлів відбувається вкрай рідко. Схожі проблеми і з IPSec - кодова база дуже обширна, кількість опцій дуже велика, що збільшує кількість ймовірних помилок в майбутньому.

Зупинимось детальніше на криптографічних алгоритмах, котрі використовує WireGuard:

  • ChaCha20. Симетричний алгоритм, використовується для шифрування основного трафіку.
  • Poly1305. Алгоритм, що забезпечує автентифікацію повідомлень і, як наслідок, цілісність даних (data integrity, MAC)
  • Curve25519. Реалізація алгоритму Діффі-Геллмана-Меркле на еліптичних кривих (ECDH). Забезпечує генерацію сесійного ключа за яким і відбувається все подальше симетричне шифрування. На відміну від RSA забезпечує "цілковиту пряму секретність" (Perfect Forward Secrecy, PFS)
  • BLAKE2s. Безпечний та швидкий алгоритм хешування (швидший за MD5, SHA-1, SHA-2, та SHA-3), що використовується в тому числі для MAC.
  • SipHash24. Сімейство псевдовипадкових функцій 
  • HKDF. Функція формування ключа (Key derivation function, KDF). Вона наприклад перетворює секретний ключ, отриманий в результаті роботи протокола Діффі-Геллмана в симетричний ключ для ChaCha20.

Усі вищезгадані криптографічні функції працюють в складі бібліотеки Zinc, код якої запланований для включення в основний код ядра Linux як сучасна альтернатива/доповнення Crypto API. Хоча є і критики даних планів.

Для узгодження ключів і з'єднання замість власного демона в просторі користувача застосовується механізм Noise_IK з Noise Protocol Framework (тобто WireGuard не використовує TLS протокол для роботи), схожий на підтримку authorized_keys в SSH. Всі пакети відправляються по UDP протоколу. Якщо ж необхідний TCP протокол варто використовувати інші VPN-рішення на кшталт OpenVPN.

Під час з'єднання, кожні декілька хвилин, WireGuard ініціює новий handshake для зміни динамічних ключів і таким чином забезпечує режим прямої секретності. Цей процес базується на часі, а не на отриманих попередніх пакетах. Звісно, все це відбувається автоматично "під капотом" WireGuard і не додає незручностей.

Для боротьби із можливими DOS-атаками WireGuard намагається бути "тихим і непомітним" не відповідаючи на некоректні ініціації підключень. Окрім цього перший пакет, надісланий клієнтом, має містити TAI64N мітку часу. WireGuard-сервер слідкує за цією міткою: він буде приймати handshake-пакети лише з мітками вищою за попередню і відсікати всі інші. Таким чином некоректні пакети прислані зловмисником не зможуть стати причиною розриву з'єднання чи неможливістю підключення. Як і у інших VPN продуктах, присутній також MAC - алгоритм автентифікації повідомлень, що об’єднує публічний ключ одержувача і опціональний попередньо описаний ключ (Pre-shared key, PSK). Детальніше про все це можна прочитати за посиланням.

Звісно, що лишилось ще багато аспектів роботи про які ще варто розповісти. Але значно ліпше це буде описати в уже в наступній статті про налаштування WireGuard.

Посилання:
https://www.wireguard.com/
https://www.wireguard.com/protocol/
https://www.wireguard.com/presentations/
https://www.wireguard.com/papers/wireguard.pdf
https://marc.info/?l=linux-netdev&m=153306429108040&w=2
https://arstechnica.com/gadgets/2018/08/wireguard-vpn-review-fast-connections-amaze-but-windows-support-needs-to-happen/
https://techcrunch.com/2018/07/28/how-i-made-my-own-wireguard-vpn-server/
https://git.kernel.org/pub/scm/linux/kernel/git/zx2c4/linux.git/commit/?h=zinc
https://habr.com/ru/company/it-grad/blog/419769/
https://lkml.org/lkml/2016/6/28/629
https://www.xda-developers.com/us-senator-pushes-government-use-wireguard-vpn/

Немає коментарів:

Дописати коментар