9 января в 13:43

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

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

Простите за сумбур и спасибо за внимание.
@Tibor128
карма
12,0
рейтинг 0,0
Похожие публикации
Самое читаемое Администрирование

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

  • +8
    Простите, а зачем этот весь колхоз, когда есть живой и рабочий Remote Desktop Gateway?
    • 0
      Хорошо, когда серверная ОСЬ… на десятке вроде такого не сделаешь? чтобы к ней подключаться.
      • 0
        Шлюз это отдельная серверная служба, зачем это делать на клиентах, когда можно сделать 1 раз на одном из серверов? Все весело и без проблем бегает по SSL, на любую машину с авторизацией и прочими радостями.
  • +1
    Не очень понял из публикации, чем не устроили стандартный VPN (pptp, sstp) с доменной аутентификацией. Настроить VPN подключения на компьютерах пользователей можно или через GPO или через CMAK. Ярлык подключения к серверу можно даже по почте отправить.

    В чем преимущества вашей системы?
    • 0
      Уверен, что есть готовые решения. По тем или иным причинам ни одно из них мне не подходит. К сожалению в моём случае имеет место ещё и «политическая» составляющая. Не буду вдаваться в подробности, но для меня это было самым выгодным решением. Надеюсь кому-то ещё пригодится, для того и разместил.
      • 0
        Уже пригодилось, спасибо!
    • НЛО прилетело и опубликовало эту надпись здесь
      • –1
        Речь идет о домашних ПК. Хотя подключения можно создавать из bat файлов, что тоже вариант.

        Не надо никаких bat файлов: для доменных ПК — GPO, для всех остальных — CMAK.

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

        А как вопрос с безопасностью и разграничением прав удаленного доступа в офисную сеть решается и контролируется?
        • НЛО прилетело и опубликовало эту надпись здесь
          • +2
            Пакет администрирования диспетчера подключений(CMAK) это родной виндовый инструмент для создания профилей подключений, он решает проблему с созданием подключений у пользователей и лишает смысла «велосипеды» описанные в статье.
  • +3
    А скриншоту уже лет 9-10? Понастольгировал :)
  • +1
    Можно было и проще — банальный батник для настройки всего-и-вся (VPN, RDP)
    А если надо много файлов — смотрим в сторону самораспаковывающихся архивов (Во временную папку).
  • 0
    Скриншот из игрушки simadmin, если кто не в курсе.
    Сам сайт (simadmin.ru) приказал долго жить, но флешку можно скачать на просторах интернета.
    Не сочтите за рекламу производителей севревров :)
    • +1
      Помнится, в игрушке в своё время больше всего расстроило, что команды реализованы не полностью. Кажется, grep искал только конкретное выражение и только в конкретном файле, при любых других аргументах выдавал ошибку. Мелкое несовершенство, разрушавшее половину очарования рекламы серверов игры.
      • 0
        *Вставить смешную шутку про rm -rf*
  • –1
    На SF ни каких исходников, только голый rlink.exe, если это попытка «втюхать» вирус — то глупая, если попытка показать проект — то какой смысл?
    • –2
      Путём несложных манипуляций (через страницу автора на SF) всё же удалось найти исходники проекта:

      Беглый осмотр сразу выявил ряд проблем, на мой взгляд:
      * Не бросилось в глаза в статье (а в ней есть) но бросилось в исходниках
      // структура данных дописываемых в конец exe
      // записывается после данных.
      // структура exe файла выглядит так:
      // EXE
      // DATA
      // MAGIC_DATA

      Такую деятельность некоторые антивирусы рассматривают как признак заражения (как запись, так и извлечение данных) и между прочим — правильно делают, да и «всё давно придумано за нас» ни кто не отменял. Есть специальный раздел в ресурсах исполняемых файлов именно для этого и придуманный — RCDATA если память не подводит.
      • +1
        Не берусь утверждать, что это правда, но сдаётся мне именно так само распаковывающиеся архивы и работают.
        • 0

          Так и есть. Любые самораспаковывающиеся архивы устроены как конкатенация SFX-модуля, настроек и обычного архива.

    • 0
      Каюсь, сырцы не выложил т.к. хотел собрать в отдельный проект, не выкладывая libssh с openssl и убрать лишнее. Это в ближайшие дни исправлю.
  • 0
    Ваше решение, как и RDP+ dnat обладает одним существенным недостатком — нужно вводить пароль.
    Сын или племянник главбуха может в целях развлечения «подслушат» пароль и проникнуть в вашу сеть.
    Вот кто бы написал мануал по настройке plink+etoken с неизвлекаемым ключом.
    Тогда уже Марьванна не сможет отбрехаться, мол «ничего не знаю — пароль никому не говорила».
    Только нужно обязать пользователей хранить etoken как зеницу ока и прописать ответственность за передачу третьим лицам.
    • 0
      Далеко не всем и не везде нужен повышенный уровень безопасности. Ну и нет ничего сложного в прикручивании к уже существующему впн и/или терминальному серверу авторизации по токенам или генераторам одноразовых кодов. Для этих целей существует много проприетарных решений и опенсорсная privacyIDEA.
    • –3
      Авторизация по MAC/IP?
  • +1
    А я для этого использую бесплатный ssh клиент Bitvise (https://www.bitvise.com/)

    с оффсайта
    Our free and flexible SSH Client for Windows includes state of the art terminal emulation, graphical as well as command-line SFTP support, an FTP-to-SFTP bridge, powerful tunneling features including dynamic port forwarding through integrated proxy, and remote administration for our SSH Server.

    Bitvise SSH Client can be used free of charge in environments of any type.


    В автозапуске у пользователя указан старт этого клиента с заранее настроенным профилем, в котором прописывается подключение к нашему ssh серверу (с разными способами аутентификации) и настраиваются предоставляемые сервисы. По желанию: автозапуск remote desktop, кстати; терминал; мост ftp->sftp; socks прокси (очень удобно для многих применений); проброс портов от клиента к серверу и обратно и т.д. Так же есть настройки поддержания подключения, автоматического отключения, автозапуска программ при соединении и т.д. В общем — незаметная иконка в трее, ставшая уже почти незаменимой ))
    • 0
      Он бесплатный для домашнего использования. Если компания — покупайте лицензию.
      А так сам его дома использую, да. И на работе — купленный.
      • 0
        Они год или два назад сменили лицензию, https://www.bitvise.com/ssh-client-license — теперь Bitvise SSH Client can be used free of charge, in all types of environments, without limitation.

        Продают они только SSH Server
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      ну тот же принцип, которому сто лет в обед, да
    • 0

      Какой именно трюк должен перестать работать? Создание исполнимого файла что ли? Пока разрешены компилируемые языки такое решение будет оставаться работоспособным.

      • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
  • 0

    Я думаю, что автор получил те же яйца в профиль. Тот же гемор если б просто поднял vpn и сам удалено настроил бы соединение и rdp на ПК юзверей. Я так настраиваю по республике, где проживаю. Приструнить пользователей не менять ПК не сложно. Один раз настроил все и забыл. Разные серверы, подход один. Абсолютно не вижу разницы с вариантом автора. Просто он взял и потерял время в том же направлении, ни произведя усовершенствование процесса и не добавив изящности в него.

    • 0
      Не приемлемо. Люди перемещаются. Доступ нужен из любой точки и в любое время. Сомнительное удовольствие подрываться в 3 ночи после бурной «пятницы» настраивать кому-то vpn.
      • 0
        все решается приказом о вызубривании инструкции для самостоятельной настройки впн, делов то. если это не работает то слать надо подальше такое руководство и такую шаражку
    • 0
      Меня бы кто приструнил, а то звонят и спрашивают «неужели ни одного компании рядом нет!»
  • 0
    а можно сделать чтобы пароль шифровался и строка запуска не отображалась в программе Process Monitor?
  • 0
    Прошу прощения, уважаемые гуру! У меня одного не соединяется на стадии запроса ssh пароля? И при указании заведомо верного пароля я получаю
    [STATUS]: Authentication by password: Fail
    Я что-то не так делаю?
    rlink --saddr=192.168.1.102 --sport=22 --user=пользователь --lport=3399 --raddr=имя.сервера.домен --rport=3389 --user=«домен\пользователь» --cmd=«mstsc /v:localhost:1234»
    • 0
      Вы указываете --user=«домен\пользователь» видимо подразумевая пользователя конечной машины а программа думает что Вы логинитесь на ssh.
      К сожалению я не предусмотрел, что кому-либо может вздуматься дважды указать один и тот же ключ и логика выстроена таким образом что Вы можете его указать хоть трижды — актуальным будет последний.
      • 0
        Не знал) благодарю за столь неожиданно скорый ответ:) Спасибо за ваше время. А есть какой-то вариант указать параметр «домен\пользователь» для конечной машины? Дабы от пользователя даже не требовалось вводить логин для RDP сервера?
        • 0
          боюсь, что если этого нельзя указать программе которую Вы запускаете ключём --cmd, то ничего не получится.
        • 0

          cmdkey /delte:TERMSRV/localhost:1234
          cmdkey /generic:TERMSRV/localhost:1234 /user:"%login%" /pass:"%password%"

  • –1
    Поднять VPN на базе Hamachi — легко и просто, и стоит недорого (вплоть до бесплатно).
    Сам так делал, как раз для бухгалтеров, чтобы они по RDP в 1С лазили.
    • 0

      … до тех пор пока адрес вашего сервера не начинается на пятерку. После того, как подобное с вами случится, вы больше не скажите про эту программу ни одного хорошего слова :)

      • 0
        А можно поподробнее?
        • +1

          https://habrahabr.ru/post/146382/


          Еще был пост гнева "Как схомячить интернеты и не поперхнуться" но его автор спрятал. Можете поискать в гугле копии.

  • 0

    Зная пронырливость и бессовестность СБ наших корпораций, ни за что не стал бы запускать на домашнем компе EXEшник, выданный на работе.

    • 0
      Виртуалочка для удаленной работы мастхэв, даже если ничего запускать не заставляют.
  • 0
    Спасибо автору, а то я делал 100% тоже самое огородом из plink+cmd+key+.rdp в архиве!
    Новым юзерам буду выдывать exe!
  • 0
    не работает с последними OpenSSH серверами (например, в ubuntu 16.04). видимо, приоритеты алгоритмов шифрования поменять нужно
    • 0
      Спасибо! Видимо в новых сборках сервера исключили некоторые алгоритмы по умолчанию. Исправил.
  • 0
    Как же я хочу дойти до такого уровня, чтобы в один прекрасный день я мог сказать:
    «По большому счёту ничего сложного. Берём исходники libssh2, openssl и zlib и прикручиваем их к нашему проекту.»
  • 0
    Благодарю за хорошее решение!

    Подскажите, где можно пощупать исходники? Есть потребность вместо подключения по rdp к Win, подключаться к Linux серверам, скорее всего по VNC. По этой причине, думаю попробовать заменить, потестировать ит.п. Заранее благодарю!
  • 0
    При коннекте (из Windows в Linux) получаю ошибку:
    «только с поддержкой 8,15, 16 и 24 bpp rdp-соединений»

    Как я понимаю — лечится изменением глубины цвета в Remote Deskope. Вы можете снизить глубину цвета до 24 по умолчанию? Или возможностью задавать этот параметр в команде запуска…
    • 0
      Добрый день!
      Исходники можно посмотреть там же.
      Подключение к rdp в статье рассматривалось как пример использования. Подключаться можно к любой службе. Все параметры которые можно задать запускаемой программе через командную строку, указываются с ключом --cmd. Если используемый Вами, клиент не может изменять глубину цвета путём указания его в командной строке, то боюсь никак этого не изменить.
      Хотя в таком случае, действительно возможно добавить в исходники код изменяющий соответствующие ключи реестра (если это поможет). Но это частный случай.

      Кстати, хочу обратить внимание, что в этой версии, максимальное количество одновременных соединений, жестко ограничено одним единственным. Что не даёт возможности, например, в RDP сессии, качать файлы. Что в моём случае, было определяющим, в плане безопасности ;)

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.