Привет. Я Саша Басун — системный администратор в «Петрович-Тех». Я уже писал на Хабре о пользовательских проблемах, и мне нравится автоматизировать такие задачи. В их решении есть своя магия.
Статья будет о возможностях донастройки FortiClient VPN под пользователя. Эту информацию также можно вытащить из документации — но парадокс в том, что для её чтения нужен работающий VPN.
Мы устанавливаем VPN-клиент в автоматическом режиме с нужными настройками. Через несколько секунд после подключения к серверу на рабочей станции должен запускаться определённый процесс. Ключевое слово — «должен»: он не всегда срабатывает как должно. Мне нужно было понять, в чём проблема, и найти решение для стабильного запуска.
Что из себя представляет FortiVPN Client
FortiClient VPN написан на фреймворке Electron, предназначенном для разработки настольных приложений с использованием HTML, CSS и JavaScript.
Сам клиент довольно стабилен, но некоторые его функции в графическом интерфейсе не работают. Например, при импорте конфигурации ничего не происходит. Или же резервную копию конфигурации сделать можно, а кнопка восстановления — неактивна. При этом в консоли импорт и экспорт работает как часы.
Если взглянуть на список настроек при создании подключения, то интерфейс там весьма минималистичен. А их на самом деле больше, просто перед этим придётся их включить или добавить руками.
Чтение документации и любопытство показали: остальные настройки для клиента прописаны в конфигурационном файле подключения. Во время импорта они конвертируются в ключи реестра со значениями:
-
DWORD — 32-х разрядное число
-
REG_SZ — строка
Часть этих ключей, например такие, как имя пользователя, шифруются.
Редактируем конфигурационный файл
При экспорте конфигурации подключения FortiClient предлагает сохранить файл с расширением .conf. Открываем его — и становится понятно, что это обыкновенный xml файл.
Файл конфигурации разбит по блокам и секциями, где есть:
-
Системные настройки
-
Настройки логов
-
Настройки поведения программы
-
Настройки подключения
-
Пользовательские настройки
Опций хватает, можно подкрутить многое, чего попросту нет в графической оболочке. Во время тестирования выяснилось, что на некоторых мобильных операторах при включенном ipv6 соединение не устанавливается. И здесь нам поможет параметр block_ipv6. Можно отключить этот протокол руками и в параметрах сетевой карты. И если надо даже задействовать скрипты, когда нужно это применить к десяткам и сотням пользователей. Но зачем мучиться, если в ПО и так есть готовое решение?
Также в FortiClient VPN можно исключить приложения: их трафик не будет перенаправляться в VPN-туннель. Или же прописать путь к прокси-серверу.
Все настройки я не тестировал, так как мне нужно было произвести настройки под определенную задачу. Могу только добавить, что какие-то из них будут работать только в платной версии. Да, у FortiClient VPN есть платная и бесплатная версия.
Что же мы можем сделать полезного, отредактировав файл конфигурации подключения? Давайте посмотрим.
Обновляем групповые политики, подключаем сетевой диск
Погружаемся в задачу. У нас есть пользователь, который удалённо работает на доменной рабочей станции. Ему нужно добавить VPN-подключение, чтобы после успешного соединения с сервером на его ПК обновились групповые политики и появился сетевой диск.
Да, можно настроить систему так, чтобы групповые политики применялись с определённой периодичностью. Но при логоне ни пользователь, ни компьютер ничего не получит. Потому хотелось бы, чтобы политики применялись при подключении к корпоративной сети.
Здесь я вспомнил одно решение: в штатных средствах Windows часто применялся способ, когда в планировщике заданий запускался скрипт по событию.
При подключении VPN служба «Диспетчер подключений удаленного доступа» (rasman) добавляла в журнал событий Windows записи с определённым ID:
-
20267 — соединение установлено
-
20268 — соединение разорвано
В планировщике заданий создавалась задача, которая запускала скрипт или команду, если в журнале событий появлялась запись с ID 20267.
Можно ли сделать что-то подобное в FortiClient VPN? Можно!
В конфигурационном файле подключения есть блок <connection>, а в нём ещё два блока — <on_connect> и <on_disconnect>. Из названий понятно, что в одной применяются настройки после подключения, в другой — после отключения.
<on_connect> <script> <os>windows</os> <script> <![CDATA[]]> </script> </script> </on_connect> <on_disconnect> <script> <os>windows</os> <script> <![CDATA[]]> </script> </script> </on_disconnect>
Необходимые нам команды прописываются в <![CDATA[]]>. Обычно в XML файлах CDATA используется для информации, которая не должна анализироваться и разбираться XML парсером.
В этом месте работают привычные нам команды, которые мы прописываем в командной строке. Добавим сюда обновление групповых политик:
<on_connect> <script> <os>windows</os> <script> <![CDATA[ gpupdate /force ]]> </script> </script> </on_connect>
А если надо подключать и отключать сетевой диск, то так:
<on_connect> <script> <os>windows</os> <script> <![CDATA[ net use U: \\Server\SharedFolder ]]> </script> </script> </on_connect> <on_disconnect> <script> <os>windows</os> <script> <![CDATA[ net use U: /delete ]]> </script> </script> </on_disconnect>
Команды выполняются построчно, потому описанные выше варианты можно объединить:
<on_connect> <script> <os>windows</os> <script> <![CDATA[ gpupdate /force net use U: \\Server\SharedFolder ]]> </script> </script> </on_connect>
Думаю, вы уже поняли, что сюда можно добавить запуск приложения или скрипта. Такие же возможности разработчики предусмотрели и в Linux, и в MacOS.
Можно ли при подключении FortiClient VPN выполнять задачи из планировщика? Да. Для этого требуется, чтобы приложение отправляло записи в журнал событий. В Windows есть штатная команда eventcreate. Она позволяет администратору создать запись об особом событии в журнале событий.
Запускаем командную строку от имени администратора и прописываем eventcreate со следующими аргументами:
eventcreate /T SUCCESS /ID 1 /L APPLICATION /SO FortiClient /D "FortiClient Welcome Event"
-
/T — тип записи (success — успех, error — ошибка)
-
/ID — код события (от 1 до 1000, дальше — зарезервировано системой)
-
/L — тип журнала (Application — журнал «Приложение», System — «Система»)
-
/SO — источник (если не указать, там будет использован источник по умолчанию)
-
/D — описание события
Тут стоит отметить, что первую запись необходимо добавить от имени администратора, несмотря на то, что при запуске FortiClient VPN запрашивает повышенные права. После добавления первой записи можно дальше править наш конфиг.
<on_connect> <script> <os>windows</os> <script> <![CDATA[ eventcreate /T SUCCESS /ID 267 /L APPLICATION /SO FortiClient /D "FortiClient VPN Connected" ]]> </script> </script> </on_connect> <on_disconnect> <script> <os>windows</os> <script> <![CDATA[ eventcreate /T SUCCESS /ID 268 /L APPLICATION /SO FortiClient /D "FortiClient VPN Disconnected" ]]> </script> </script> </on_disconnect>
Сохраняем конфигурацию и импортируем в FortiClient VPN. После этого можно создавать задачу с триггером на определённое событие.
Ожидание и реальность
Я уже говорил, что секции в XML-файле конвертируются в ключи реестра со значениями. В этот момент я подумал: «Кайф! Экспортирую ветку реестра, где хранится информация о подключении, а затем буду импортировать в два клика».
Как оказалось, так работать не будет. На другом тестовом стенде процессы после установки соединения не запустились. Предполагаю, что некоторые значения конфигурации зашифровываются с привязкой к параметрам системы или оборудованию. Остаётся только импорт через сам клиент.
Стоп! Импорт же у нас в графической оболочке не работает. Ну ничего, воспользуемся консолью.
"%ProgramFiles%\Fortinet\Forticlient\FCConfig.exe" -f D:\vpn.conf -o import -k YourPa$$word
В этом случае импорт производится корректно.
Итог
Как видим, FortiClient VPN способен запускать выполнение команд, скриптов и приложений после подключения к серверу и после отключения от него. С учётом того, что такая возможность в клиенте есть и на других операционных системах, это может помочь решить задачи различного типа.
Конечно же, не стоит пренебрегать безопасностью. При импорте значения команд и скриптов в реестре шифруются. Подобраться к ним или подменить значения злоумышленнику будет сложнее. Изменение параметров задания в планировщике может потребовать пароль от учётной записи. А вот подменить код в скрипте, который запускается из планировщика, труда не составит. Ему лучше назначить соответствующие права на запись.
ссылка на оригинал статьи https://habr.com/ru/articles/858792/
Добавить комментарий