OpenSSL уже встановлено, хост має ентропію, і згенерувати ним ключ здається очевидним коротким шляхом. Результат буде випадковим і секретним і цілком непридатним, а збій прийде як помилка каналу керування, а не як щось, що згадує формат ключа. Саме це введення в оману дорого коштує, бо відправляє людей перевіряти свої шифри. Те, що читає VPN, — це певна структура файлу, а не довільний блок байтів, і один із варіантів функції взагалі не можна виготовити поза сервером.

Яким насправді має бути файл на диску

Файл статичного ключа OpenVPN — це текст. Він починається рядком коментаря, що оголошує, що це таке, несе шістнадцяткові дані в рядках фіксованої ширини і загалом містить 256 байтів ключового матеріалу. OpenVPN читає його як спільний секрет каналу керування, не як сертифікат, не як парольну фразу і не як щось, що впізнала б бібліотека TLS.

Той самий тип об'єкта обслуговує обидві функції каналу керування. У tls-auth кожному партнеру потрібен ще й напрямок, щоб пакети однієї сторони не можна було відобразити назад до неї. У tls-crypt один спільний секрет шифрує й автентифікує канал керування в обох напрямках, що приховує рукостискання і водночас захищає його.

Ніщо з цього не є таємним знанням, і формат тут не головне. Головне те, що файл має точно відповідати очікуванням читача: заголовок, ширина рядка, завершальний перевід рядка й загальна довжина. Файл, що відрізняється на один рядок, завантажується як сміття або взагалі не працює. Тому порівняння двох партнерів байт за байтом — законний перший тест, і він швидший за читання будь-якого з двох конфігураційних файлів.

Підтримуваний спосіб створити один

Згенеруйте простий статичний ключ тим інструментом, який його використовуватиме, а потім посилайтеся на нього з обох боків:

openvpn --genkey secret /etc/openvpn/tc-shared.key
tls-crypt /etc/openvpn/tc-shared.key

Написання опції з часом змінювалося: старіші встановлення епохи 2.4 використовували форму з окремим прапорцем перед іменем файлу, а поточні збірки приймають коротшу. У будь-якому разі отриманий файл — той самий тип об'єкта, тому перевірка полягає в тому, чи мають обидва партнери однакові байти.

Друге покоління додає структуру, яку не може вигадати жоден зовнішній генератор. Серверний ключ створюється один раз, і кожен клієнт отримує обгорнутий ключ, похідний від нього:

openvpn --genkey tls-crypt-v2-server /etc/openvpn/tc-v2-server.key
openvpn --genkey tls-crypt-v2-client /etc/openvpn/laptop1.key --tls-crypt-v2 /etc/openvpn/tc-v2-server.key

Те, що отримує клієнт, — це не копія власного ключа сервера. Це обгорнутий об'єкт, що несе метадані, які може розгорнути лише сервер, і саме це обгортання дає змогу відкликати файл одного пристрою, не торкаючись жодного іншого пристрою. Тримайте серверний ключ на сервері й ставтеся до нього як до кореня цієї довіри на пристрій.

Де ламаються байти, зроблені вручну

Друк 256 випадкових байтів у шістнадцятковому вигляді під правильним заголовком теоретично дав би завантажуваний файл статичного ключа. Це все одно погана ідея. Кожна деталь форматування стає шансом створити матеріал, який не завантажиться або, що гірше, залишить двох партнерів із різними значеннями, які виявляться лише як збій автентифікації.

З варіантом v2 нічого подібного неможливо. Обгорнутий клієнтський ключ існує лише як результат процесу серверного ключа, і сервер зберігає матеріал, потрібний для його розгортання. Випадковий блок буде відхилено або він просто не розшифрується, і жодне з двох повідомлень не згадає випадковість.

Сумісність версій лежить поверх усього цього. Першому поколінню потрібен випуск, що підтримує його з обох боків, а другому знову потрібен новіший випуск. Клієнт, зібраний до появи функції, не може завершити рукостискання із сервером, який приймає лише обгорнутий матеріал, і збій, який він повідомляє, вказує на канал керування, а не на версію.

Ротація, не замикаючи всіх ззовні

Ротація одного спільного секрету — це вправа з координації, а не технічна. Кожному клієнту потрібен запасний файл під рукою до того, як сервер відкличе попередній, і будь-яка машина, що ще має старе значення, зазнає збою тієї ж миті. Не починайте цю ротацію посеред робочого дня.

За схеми v2 ротація виконується за пристроєм: видайте новий обгорнутий ключ для однієї машини й відкличте старий лише для тієї машини. Це головний аргумент за перехід, коли кожен клієнт на випуску, що це підтримує.

Права на файли належать до тієї ж розмови. Ключ має бути читабельним лише для облікового запису, який запускає службу, і не повинен жити в тому самому репозиторії, що й профілі, які він захищає. Довідник OpenVPN 2.6 документує форми генерації та розділи про ключовий матеріал, що є кращим джерелом, ніж скопійована команда з допису на форумі.

Схожі статті