Рівні script-security в OpenVPN від 0 до 3 і що відкриває кожен
Кожен рівень script-security розширює, що профіль може виконувати: спочатку адміністративні помічники, потім користувацькі скрипти, зрештою паролі в середовищі. Прочитайте директиви.
Імпортуйте профіль у настільний клієнт, і перша помилка часто виявляється рядком, який клієнт відмовляється поважати: хук скрипту, який він не запустить, або значення script-security, яке вважає надто дозвільним. Підвищення числа прибирає діалог. Але воно розширює й те, що цьому профілю дозволено виконувати на вашій машині, а це дивно давати лише заради закриття попередження. Простежте імпорт до директиви, і рішення стане конкретним.
Від діалогу імпорту до директиви
Профіль — це текстовий файл із директивами, і клієнт читає їх до появи будь-якого тунелю. Директива на кшталт up, down або tls-verify називає зовнішню програму, яку OpenVPN має запустити в певний момент. Чи готовий OpenVPN її запускати — це окреме налаштування під назвою script-security, і профіль зазвичай задає його теж.
Отже, попередження не про криптографію чи сертифікати. Воно про файл конфігурації, який просить клієнт виконати щось на хості, і про клієнт, який перевіряє, чи дозволяє цей запит його поточний рівень дозволів.
На цьому етапі дві різні невдачі виглядають однаково. Профіль, який просить рівень, якого клієнт не дасть, дає відмову. Профіль, який просить рівень, який клієнт дає, але скрипт відсутній, дає натомість помилку під час виконання, і ці два випадки плутають у гілках підтримки. Одне — питання дозволів, друге — питання пакування.
Що насправді відкриває кожен рівень
Рівень 0 повністю забороняє виклики зовнішніх програм, що узгоджено для клієнта, який сам налаштовує свій інтерфейс без допомоги, і неузгоджено для того, хто звертається до операційної системи. Рівень 1, типовий, дозволяє вбудовані виконувані файли, потрібні для налаштування інтерфейсу й маршрутів. Жоден із рівнів не запускає нічого, що надав користувач.
| Level | What OpenVPN may execute | What it exposes |
|---|---|---|
| 0 | No external programs at all | Interface and route setup must not depend on helpers |
| 1 (default) | Built-in helpers such as ip, ifconfig, route or netsh | Privileged commands the platform already ships |
| 2 | Built-in helpers plus user-defined scripts | Whatever the named script does with the client's privileges |
| 3 | Everything above, plus passwords in environment variables | Credentials visible to child processes and their logs |
Рівень 2 — цікава межа, бо він допускає скрипти, визначені користувачем. Із цього моменту привілеї клієнта поширюються на код, який ви, можливо, ніколи не читали, викликаний у моменти, які ви не обирали, в середовищі, що містить відомості про з'єднання. Рівень 3 іде далі й дозволяє передавати паролі через змінні середовища, тому посібник описує його як потенційно небезпечний.
Жодне з цих чисел не є налаштуванням стійкості. Профіль на рівні 3 не має кращого шифрування, ніж на рівні 1; у нього просто більша поверхня виконання, а тунель однаковий.
Вирішіть, чого вартий профіль
Спитайте, для чого потрібен скрипт, перш ніж питати, який рівень йому потрібен. Хук, який проштовхує налаштування DNS або виправляє маршрут після підключення, — законна причина щось запускати. Хук, який викликає незнайомий двійковий файл у тимчасовому каталозі, — причина зупинитися.
Шлях скрипту важливий не менше за сам скрипт. Відносний шлях вирішується щодо каталогу, який використовує клієнт, а каталог із правом запису перетворює разовий імпорт на постійне місце виконання. Абсолютні шляхи в каталозі, який користувач не може змінити, — та форма, якій варто віддавати перевагу.
Скрипти також успадковують середовище клієнта, де живуть облікові дані й метадані з'єднання. Саме це успадкування робить рівень 3 небезпечним у поєднанні зі скриптом, який журналює своє середовище, і тому діагностичний дамп від клієнта з увімкненими скриптами заслуговує другого погляду, перш ніж його вставлять у тікет. Видаліть середовище, перш ніж ним ділитися.
grep -nE 'script-security|^up |^down |tls-verify' client.ovpnЗмініть одну річ, а потім простежте й розбирання
Якщо профіль справді потребує скрипту, змініть лише рівень і лише для цього профілю. Запустіть клієнт на передньому плані з докладним виводом, щоб власні помилки скрипту були видні, а не проковтнуті менеджером служб.
openvpn --config client.ovpn --script-security 2 --verb 3
ip route show default
Перевірте весь життєвий цикл, а не лише підключення. Хук відключення, який збоїть, залишає маршрути, що вказують на мертвий тунель, і виходить машина, яка виглядає підключеною і нікуди не потрапляє. Перш ніж оголосити зміну завершеною, перепідключіться один раз і відключіться один раз, і після кожного перевіряйте таблицю маршрутизації.
Збережіть копію початкового профілю. Якщо клієнт платформи не реалізує ту саму модель скриптів, видалення директив до успішного імпорту може прибрати інтеграцію DNS або маршрутів, потрібну тунелю, і отримане з'єднання пройде автентифікацію бездоганно, нічого не розв'язуючи.
Рішення, яке варто записати, вузьке: який скрипт, на якому шляху, на якому рівні дозволений, для якого профілю. Усе інше в профілі лишається незмінним, і це речення, яке рецензент може перевірити.