Импортируйте профиль в настольный клиент, и первая ошибка часто оказывается строкой, которую клиент отказывается соблюдать: хук скрипта, который он не запустит, или значение script-security, которое считает слишком разрешающим. Повышение числа убирает диалог. Но оно расширяет и то, что этому профилю разрешено выполнять на вашей машине, а это странно давать только ради закрытия предупреждения. Проследите импорт до директивы, и решение станет конкретным.

От диалога импорта до директивы

Профиль — это текстовый файл с директивами, и клиент читает их до того, как появится какой-либо туннель. Директива вроде up, down или tls-verify называет внешнюю программу, которую OpenVPN должен запустить в определённый момент. Готов ли OpenVPN её запускать — это отдельная настройка под названием script-security, и профиль обычно задаёт и её.

Значит, предупреждение не о криптографии или сертификатах. Оно о файле конфигурации, который просит клиент выполнить что-то на хосте, и о клиенте, который проверяет, позволяет ли его текущий уровень разрешений этот запрос.

На этом этапе две разные неудачи выглядят одинаково. Профиль, запрашивающий уровень, который клиент не даст, даёт отказ. Профиль, запрашивающий уровень, который клиент даёт, но скрипт отсутствует, даёт вместо этого ошибку во время выполнения, и эти два случая путают в ветках поддержки. Одно — вопрос разрешений, другое — вопрос упаковки.

Что на самом деле открывает каждый уровень

Уровень 0 полностью запрещает вызовы внешних программ, что согласованно для клиента, который сам настраивает свой интерфейс без помощи, и несогласованно для того, кто обращается к операционной системе. Уровень 1, заданный по умолчанию, разрешает встроенные исполняемые файлы, необходимые для настройки интерфейса и маршрутов. Ни один из уровней не запускает ничего, что предоставил пользователь.

LevelWhat OpenVPN may executeWhat it exposes
0No external programs at allInterface and route setup must not depend on helpers
1 (default)Built-in helpers such as ip, ifconfig, route or netshPrivileged commands the platform already ships
2Built-in helpers plus user-defined scriptsWhatever the named script does with the client's privileges
3Everything above, plus passwords in environment variablesCredentials 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 или маршрутов, которая была нужна туннелю, и полученное соединение пройдёт аутентификацию безупречно, ничего не разрешая.

Решение, которое стоит записать, узкое: какой скрипт, по какому пути, на каком уровне разрешён, для какого профиля. Всё остальное в профиле остаётся неизменным, и это предложение, которое проверяющий может проверить.

Похожие статьи