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

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

Простите за сумбур и спасибо за внимание.
Поделиться с друзьями
-->

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


  1. osipov_dv
    09.01.2017 13:51
    +8

    Простите, а зачем этот весь колхоз, когда есть живой и рабочий Remote Desktop Gateway?


    1. BigD
      09.01.2017 15:51

      Хорошо, когда серверная ОСЬ… на десятке вроде такого не сделаешь? чтобы к ней подключаться.


      1. osipov_dv
        09.01.2017 17:10

        Шлюз это отдельная серверная служба, зачем это делать на клиентах, когда можно сделать 1 раз на одном из серверов? Все весело и без проблем бегает по SSL, на любую машину с авторизацией и прочими радостями.


  1. ikormachev
    09.01.2017 14:10
    +1

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

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


    1. Tibor128
      09.01.2017 14:24

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


      1. w4r_dr1v3r
        11.01.2017 20:53

        Уже пригодилось, спасибо!


    1. SamoilowAlex
      09.01.2017 14:27

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

      Тем, что пользователям надо настраивать подключение, а пользователи тупые по умолчанию.

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

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

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


      1. ikormachev
        09.01.2017 14:35
        -1

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

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

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

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


        1. SamoilowAlex
          09.01.2017 15:04
          +1

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

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


          1. FeNUMe
            09.01.2017 15:35
            +2

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


  1. ilyaplot
    09.01.2017 14:16
    +3

    А скриншоту уже лет 9-10? Понастольгировал :)


  1. Fox_exe
    09.01.2017 15:26
    +1

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


  1. olekhov
    09.01.2017 15:45

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


    1. ruikarikun
      09.01.2017 17:04
      +1

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


      1. tchspprt
        12.01.2017 06:38

        *Вставить смешную шутку про rm -rf*


  1. Tujh
    09.01.2017 15:46
    -1

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


    1. Tujh
      09.01.2017 15:59
      -2

      Путём несложных манипуляций (через страницу автора на SF) всё же удалось найти исходники проекта:

      Беглый осмотр сразу выявил ряд проблем, на мой взгляд:
      * Не бросилось в глаза в статье (а в ней есть) но бросилось в исходниках

      // структура данных дописываемых в конец exe
      // записывается после данных.
      // структура exe файла выглядит так:
      // EXE
      // DATA
      // MAGIC_DATA

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


      1. Tibor128
        09.01.2017 16:21
        +1

        Не берусь утверждать, что это правда, но сдаётся мне именно так само распаковывающиеся архивы и работают.


        1. mayorovp
          10.01.2017 08:41

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


    1. Tibor128
      09.01.2017 16:20

      Каюсь, сырцы не выложил т.к. хотел собрать в отдельный проект, не выкладывая libssh с openssl и убрать лишнее. Это в ближайшие дни исправлю.


  1. mihmig
    09.01.2017 17:01

    Ваше решение, как и RDP+ dnat обладает одним существенным недостатком — нужно вводить пароль.
    Сын или племянник главбуха может в целях развлечения «подслушат» пароль и проникнуть в вашу сеть.
    Вот кто бы написал мануал по настройке plink+etoken с неизвлекаемым ключом.
    Тогда уже Марьванна не сможет отбрехаться, мол «ничего не знаю — пароль никому не говорила».
    Только нужно обязать пользователей хранить etoken как зеницу ока и прописать ответственность за передачу третьим лицам.


    1. FeNUMe
      09.01.2017 17:22

      Далеко не всем и не везде нужен повышенный уровень безопасности. Ну и нет ничего сложного в прикручивании к уже существующему впн и/или терминальному серверу авторизации по токенам или генераторам одноразовых кодов. Для этих целей существует много проприетарных решений и опенсорсная privacyIDEA.


    1. 776166
      10.01.2017 00:42
      -3

      Авторизация по MAC/IP?


  1. abrca
    09.01.2017 17:41
    +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.


    1. BigD
      10.01.2017 00:04

      Он бесплатный для домашнего использования. Если компания — покупайте лицензию.
      А так сам его дома использую, да. И на работе — купленный.


      1. abrca
        10.01.2017 06:05

        Они год или два назад сменили лицензию, 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


  1. Jack38b
    09.01.2017 19:18

    Это не то же самое что и
    https://my.kettering.edu/offices-administration/information-technology/networks-security-storage/remote-desktop/remote
    ?
    Хороший старый трюк которым я пользовался еще 10 лет назад, но я почему то думал, что создатели нынешних версий ОС уже успели сделать все, чтобы он перестал работать.


    1. BigD
      10.01.2017 00:05

      ну тот же принцип, которому сто лет в обед, да


    1. mayorovp
      10.01.2017 08:45

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


      1. Jack38b
        10.01.2017 13:00

        Не знаю. После ухода XP большая часть скриптов и команд которыми я пользовался рабоать перестали.
        Кроме того, поменялись исползвуемые для login протоколы (NTLM — 2 вместо NTLM) etc… не знаю влияет ли это
        Поскольу я 8 лет назад вернулся в девелопмент из того, что сейчас называют DevOps, так что мне теперь это не так важно.


      1. Jack38b
        19.01.2017 01:28

        Только до меня дошло о чем вы :) В том, о чем спрашивал я (то же самое решение) выполняемый файл создавать не надо. Вообще, OpenSSL я не очень понимаю зачем тут нужен — для административных решений достаточно скриптов, не нужно никаких исполнимых файлов — как мне кажется, но судя по всему тут вопрос вкуса :) Я OpenSSL использовал для всяких алгоритмов типа blowfish, RSA и т.п. для реализации защиты от копирования и привязки к компу (тогда еще не было flexlm).
        Но, в независимости от решения, тут многое зависит от OC и что разрешено а что нет с точки зрения протоколов, файрволов и т.п. Например, введут какой нибудь дополнительный уровень защиты и все — не выйдет ничего (я об ОС будующего ) :)


  1. buldozerptz
    10.01.2017 10:46

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


    1. Tibor128
      10.01.2017 10:48

      Не приемлемо. Люди перемещаются. Доступ нужен из любой точки и в любое время. Сомнительное удовольствие подрываться в 3 ночи после бурной «пятницы» настраивать кому-то vpn.


      1. MegaShIzoID
        11.01.2017 09:24

        все решается приказом о вызубривании инструкции для самостоятельной настройки впн, делов то. если это не работает то слать надо подальше такое руководство и такую шаражку


    1. VolCh
      11.01.2017 08:32

      Меня бы кто приструнил, а то звонят и спрашивают «неужели ни одного компании рядом нет!»


  1. Maxlinus
    10.01.2017 10:48

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


  1. ninetailedfirefox
    10.01.2017 10:49

    Прошу прощения, уважаемые гуру! У меня одного не соединяется на стадии запроса 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»


    1. Tibor128
      10.01.2017 10:53

      Вы указываете --user=«домен\пользователь» видимо подразумевая пользователя конечной машины а программа думает что Вы логинитесь на ssh.
      К сожалению я не предусмотрел, что кому-либо может вздуматься дважды указать один и тот же ключ и логика выстроена таким образом что Вы можете его указать хоть трижды — актуальным будет последний.


      1. ninetailedfirefox
        10.01.2017 10:56

        Не знал) благодарю за столь неожиданно скорый ответ:) Спасибо за ваше время. А есть какой-то вариант указать параметр «домен\пользователь» для конечной машины? Дабы от пользователя даже не требовалось вводить логин для RDP сервера?


        1. Tibor128
          10.01.2017 11:22

          боюсь, что если этого нельзя указать программе которую Вы запускаете ключём --cmd, то ничего не получится.


        1. mayorovp
          10.01.2017 11:54

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


  1. nickolaym
    10.01.2017 14:30
    -1

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


    1. mayorovp
      10.01.2017 14:35

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


      1. nickolaym
        10.01.2017 15:48

        А можно поподробнее?


        1. mayorovp
          10.01.2017 15:57
          +1

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


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


  1. Barafu
    11.01.2017 03:55

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


    1. VolCh
      11.01.2017 08:48

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


  1. shaivam
    12.01.2017 06:39

    Спасибо автору, а то я делал 100% тоже самое огородом из plink+cmd+key+.rdp в архиве!
    Новым юзерам буду выдывать exe!


  1. loderunner84
    12.01.2017 06:39

    не работает с последними OpenSSH серверами (например, в ubuntu 16.04). видимо, приоритеты алгоритмов шифрования поменять нужно


    1. Tibor128
      12.01.2017 12:11

      Спасибо! Видимо в новых сборках сервера исключили некоторые алгоритмы по умолчанию. Исправил.


  1. TheSima
    16.01.2017 08:48

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