[Из песочницы] SSH вместо VPN

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 для него, чем я и займусь в ближайшее время.

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

Простите за сумбур и спасибо за внимание.

Комментарии (11)

  • 9 января 2017 в 13:51

    +3

    Простите, а зачем этот весь колхоз, когда есть живой и рабочий Remote Desktop Gateway?
  • 9 января 2017 в 14:10

    +2

    Не очень понял из публикации, чем не устроили стандартный VPN (pptp, sstp) с доменной аутентификацией. Настроить VPN подключения на компьютерах пользователей можно или через GPO или через CMAK. Ярлык подключения к серверу можно даже по почте отправить.

    В чем преимущества вашей системы?

    • 9 января 2017 в 14:24

      –1

      Уверен, что есть готовые решения. По тем или иным причинам ни одно из них мне не подходит. К сожалению в моём случае имеет место ещё и «политическая» составляющая. Не буду вдаваться в подробности, но для меня это было самым выгодным решением. Надеюсь кому-то ещё пригодится, для того и разместил.
    • 9 января 2017 в 14:27

      –1

      Не очень понял из публикации, чем не устроили стандартный VPN (pptp, sstp) с доменной аутентификацией.

      Тем, что пользователям надо настраивать подключение, а пользователи тупые по умолчанию.
      Настроить VPN подключения на компьютерах пользователей можно или через GPO или через CMAK.
      Речь идет о домашних ПК. Хотя подключения можно создавать из bat файлов, что тоже вариант.
      В чем преимущества вашей системы?

      Один бинарник, который можно переслать пользователю по email (или другим способом), который он запускает и работает.
      • 9 января 2017 в 14:35

        0

        Речь идет о домашних ПК. Хотя подключения можно создавать из bat файлов, что тоже вариант.

        Не надо никаких bat файлов: для доменных ПК — GPO, для всех остальных — CMAK.
        Один бинарник, который можно переслать пользователю по email (или другим способом), который он запускает и работает.

        А как вопрос с безопасностью и разграничением прав удаленного доступа в офисную сеть решается и контролируется?
        • 9 января 2017 в 15:04

          0

          А как вопрос с безопасностью и разграничением прав удаленного доступа в офисную сеть решается и контролируется?

          На стороне сервера ssh — это раз, на стороне сервера rdp — это два. Тут ssh просто замена vpn, подобный бинарник можно и сopenvpn замутить и с созданием pptp/sstp через bat (что за cmak я понятия не имею, может оно и лучше подойдет для таких целей).
          • 9 января 2017 в 15:35

            +1

            Пакет администрирования диспетчера подключений (CMAK) это родной виндовый инструмент для создания профилей подключений, он решает проблему с созданием подключений у пользователей и лишает смысла «велосипеды» описанные в статье.
  • 9 января 2017 в 14:16

    0

    А скриншоту уже лет 9–10? Понастольгировал :)
  • 9 января 2017 в 15:26

    +1

    Можно было и проще — банальный батник для настройки всего-и-вся (VPN, RDP)
    А если надо много файлов — смотрим в сторону самораспаковывающихся архивов (Во временную папку).
  • 9 января 2017 в 15:45

    0

    Скриншот из игрушки simadmin, если кто не в курсе.
    Сам сайт (simadmin.ru) приказал долго жить, но флешку можно скачать на просторах интернета.
    Не сочтите за рекламу производителей севревров :)
  • 9 января 2017 в 15:46

    0

    На SF ни каких исходников, только голый rlink.exe, если это попытка «втюхать» вирус — то глупая, если попытка показать проект — то какой смысл?

© Habrahabr.ru