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

Що насправді несе файл .ovpn

Файл .ovpn — це конфігурація з необов'язковими вбудованими блоками. Він може містити сертифікат CA, клієнтський сертифікат, закритий ключ, ключ tls-auth або tls-crypt, а також директиви, що вказують на зовнішні файли або запитують облікові дані. Два файли можуть виглядати майже однаково й відрізнятися лише всередині блоку або однією директивою, яка повністю змінює транспорт. Кількість рядків нічого не каже про те, що з цього сталося.

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

Порівнюйте за роллю, а не за рядком

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

Прохід з урахуванням полів дивиться на ці елементи в такому порядку. Усе, що клієнт запитує інтерактивно, належить до рядка автентифікації, а не до рядків довіри.

  • remote, proto і порт, включно з кожним блоком з'єднання.
  • ca і cert: видавець, суб'єкт і дата завершення.
  • Чи взагалі є закритий ключ, а не що він містить.
  • tls-auth або tls-crypt наявність і напрям ключа.
  • Директиви автентифікації, включно з будь-яким посиланням на файл облікових даних.
  • Маршрути, параметри DNS і скриптові гачки, що запускаються при підключенні.

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

Чому звичайний diff — неправильний інструмент

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

openssl x509 -in ca.crt -noout -subject -issuer -enddate
openssl x509 -in client.crt -noout -subject -issuer -enddate
grep -E '^(remote|proto|port|tls-auth|tls-crypt|route|dhcp-option)' profile.ovpn

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

Зберіть відредаговану копію для заявки

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

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

Тримайте порівняння прив'язаним до відмови

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

Якщо новий файл надійшов від оператора, підтвердьте шлях його розповсюдження, перш ніж замінювати матеріал довіри. Після зміни огляньте імпортовану копію, яку клієнт справді вибрав, і узгоджений результат, бо директиву може бути проігноровано або прочитано інакше іншою версією клієнта. Файл на диску не є доказом з'єднання, що відбулося. Семантика директив — у посібнику OpenVPN 2.6.

Схожі статті