Pull to refresh

SSH вместо VPN

Reading time 3 min
Views 61K
image

Наверняка многие системные администраторы сталкивались с ситуацией когда количество удалённых пользователей в компании становилось больше одного столько, что мысли о нормальном VPN вместо nat-а на скорую руку не давали покоя и становились навязчивой идеей. И уверен каждый морщился, когда понимал, что предстоит объяснять пользователям, что и где нажимать. А в моём, персональном случае ещё и позиция в отношении подопечных: «они не должны даже задумываться как это работает».

Сначала их было не много. Всего пара человек ходило по rdp на свой рабочий стол из дома и я не торопился с реализацией решения, но когда сервер 1С переехал из головного офиса в мою сеть и появилась целая армия бухгалтеров и прочих деятелей, волосы на голове зашевелились от перспективы зафлудить правила фаервола строками типа dst-nat.

Мне почему-то альтернативой моего решения, виделся только VPN (в том или ином виде), а это означало, что нужно будет писать инструкции для создания подключения на компьютере пользователя. От сюда перспектива отвечать на вопросы типа: «что я сделал не так?», потому как на каждой версии Windows это делается не совсем одинаково. Плюс надо было бы ещё объяснять как всё таки подключиться именно к нужному компьютеру — опять создавать эти ярлычки и всё такое. Да и кстати человек мог уехать на деревню к дедушке куда-нибудь где настройка чужого компьютера не приветствуется. По этому мне показалось, что именно так как задумал я, будет удобнее всего.

Сама идея того, что и как нужно сделать родилась давно и в принципе всё было понятно.
Задача проста: подключить пользователя к рабочему столу на рабочем компе (или любому другому) в один клик. Т.е. пользователь подключает флешку на которой лежит некий exe. Запускает этот exe, вводит пароль и вуаля — он на рабочем компе.

Немного лирики, если позволите.

Уверен все смотрели отличный фильм «Игры разума». Помните фразу доктора в клинике: «Что может быть ужаснее для шизофреника, чем осознать, что он шизофреник»?

Проецируя на себя могу перефразировать: «Что может быть ужаснее для программиста, чем осознать, что он системный администратор?». Это я к тому, что за более чем 10 лет админства я отупел. То, что я тогда написал бы за пару дней, теперь делал неделю и уверен, что можно было бы сделать лучше.

По большому счёту ничего сложного. Берём исходники libssh2, openssl и zlib и прикручиваем их к нашему проекту. Именно исходники или статические библиотеки потому, что мы же не хотим чтобы у нас получилось на выходе больше одного файла. Если рядом с exe придётся положить ещё какой-нибудь dll решение утратит «изящность».

Программа создаёт ssh-tunnel до удалённого компа и слушает на локальном адресе аля localhost. Запускается mstsc и соединяется с localhost (на самом деле с удалённым компом).

Помучится пришлось с openssl. Такой скудной документации я ещё не видел. Примеры из вики на сайте проекта работают, но ничего не объясняют. Описание функций сводится к их назначению. Да и плюнуть бы, ведь libssh собрался, но мне нужно хранить параметры подключения в exe файле, считай в открытом виде, а это пароли и ключи. По этому немного поигравшись с различными вариантами функций всё таки зашифровал данные и положил их в конец exe.

По сути получился аналог plink-а из состава putty, но с возможностью клонировать себя с сохранением параметров подключения и выполнения некоей команды на компьютере пользователя. Например:

rlink --saddr=example.host.com --sport=2222 --lport=1234 --raddr=pc.localdomain --rport=3389 --user=andrey --cmd="mstsc /v:localhost:1234"

С таким набором аргументов, программа создаст туннель localhost:1234 → pc.localdomain:3389 и запустит rdp клиент и будет дожидаться его завершения. По скольку здесь опущен аргумент --pass пароль будет запрошен интерактивно.

image

Можно добавить ключ -a, тогда на выходе получим готовый exe с именем rlink-username.exe и готовым к запуску без ввода каких-либо аргументов в командной строке.

image

По умолчанию ключи для шифрования настроек генерируются автоматически, но можно задать секретное слово с помощью ключа --key и шифровать на его основе. Тогда при запуске программы, первым делом будет запрошен пароль для расшифровки аргументов.

image

Конечно же, для того, чтобы всё это заработало, остаётся ещё одна маленькая деталь: создать пользователя на ssh сервере. Но это уже другая история. И можно ещё написать скрипт, чтобы довести до автоматики создание пользователя и генерации готового exe для него, чем я и займусь в ближайшее время.

Пощупать программку можно тут.

Простите за сумбур и спасибо за внимание.
Tags:
Hubs:
+29
Comments 54
Comments Comments 54

Articles