Ког­да в кино показы­вают, как на Зем­ле раз­ража­ется эпи­демия страш­ного вируса, людям там нуж­ны в основном тушен­ка и пат­роны. Ког­да эта фан­тасти­ка воп­лотилась в реаль­нос­ти, ока­залось, что нуж­нее все­го — туалет­ная бумага и уда­лен­ные рабочие мес­та. И если с пер­вым все понят­но, вто­рой пункт вызыва­ет воп­росы с точ­ки зре­ния безопас­ности и выбора ПО. Ког­да готовое решение не под­ходит, нуж­но брать­ся за сбор­ку сво­его велоси­педа.

Сер­висы, с помощью которых мож­но орга­низо­вать под­клю­чение сот­рудни­ков на уда­лен­ке, обыч­но работа­ют через свои сер­веры. Поч­ти всег­да соеди­нение получа­ется мед­леннее пря­мых под­клю­чений, да и безопас­ность таких служб тоже под боль­шим воп­росом. Чаще все­го архи­тек­тура этих решений пос­тро­ена вок­руг реали­зации VNC (Virtual Network Computing). Сис­тема базиру­ется на про­токо­ле RFB (Remote FrameBuffer). Управле­ние устро­ено так: с одно­го компь­юте­ра на дру­гой переда­ются нажатия кла­виш и дви­жения мыши и содер­жимое экра­на рет­ран­сли­рует­ся через сеть. Сам VNC не шиф­рует переда­ваемые дан­ные. Если тре­бует­ся обес­печить повышен­ную безопас­ность, сес­сия может быть уста­нов­лена через SSL, SSH или VPN-тун­нели, что нес­коль­ко усложня­ет задачу.

На пуб­личных сер­висах все соеди­нения уста­нав­лива­ются через сер­вер, который выда­ет ID кли­ентов, под­клю­чая их либо через VPN нап­рямую друг к дру­гу, либо через собс­твен­ный канал. Конеч­но, мож­но под­нять свой VPN-сер­вер, нас­тро­ить мар­шру­тиза­цию VPN-сети и локаль­ной сети пред­при­ятия и под­клю­чать сот­рудни­ков по пря­мым IP-адре­сам. В этом слу­чае кли­енту нуж­но, помимо логина, пароля и адре­са под­клю­чения, передать еще кли­ент VPN и дан­ные для авто­риза­ции. Для некото­рых поль­зовате­лей все это слож­новато, а это, в свою оче­редь усложнит под­дер­жку.

Проб­росить пор­ты на локаль­ные ПК тоже не вари­ант. Это небезо­пас­но, да и нас­тра­ивать мар­шру­тиза­цию замуча­ешь­ся, ког­да кли­ентов ста­новит­ся боль­ше двух. В Linux есть замеча­тель­ный кли­ент Remmina, который поз­воля­ет проб­расывать сес­сии RDP/VNC через SSH-соеди­нение без допол­нитель­ных кли­ентов. В Windows мож­но орга­низо­вать SSH-тун­нели через кли­ент­ские при­ложе­ния, которые необ­ходимо нас­тра­ивать на уда­лен­ных поль­зователь­ских машинах. SSH-кли­ент «из короб­ки» есть толь­ко в Windows 10, но как быть с юзе­рами семер­ки и вось­мер­ки? Да и для Windows 10 при­дет­ся писать бат­ник, и не один. Все это не добав­ляет бал­лов стан­дар­тным решени­ям. Но всег­да мож­но при­думать нес­тандар­тное. Чем мы пря­мо сей­час и зай­мем­ся.

 

Постановка задачи

Итак, задача у нас будет сле­дующая. Под­клю­чать поль­зовате­ля по RDP (как выяс­нилось, это нам­ного при­выч­нее для боль­шинс­тва из них). Самое глав­ное пре­иму­щес­тво RDP по срав­нению с VNC — это ско­рость. RDP быс­трее потому, что этот про­токол перери­совы­вает на сто­роне кли­ента толь­ко изме­нен­ную часть экра­на, а зна­чит, дан­ных переда­ется мень­ше. Под­клю­чение дол­жно быть безопас­ным. Под­клю­чение дол­жно выпол­нять­ся с минималь­ными нас­трой­ками и не тре­бовать от поль­зовате­ля никаких допол­нитель­ных дей­ствий.

 

А что скажет Google?

В общем‑то, задача не новая, и реали­заций пос­тро­ения SSH-тун­неля сущес­тву­ет доволь­но мно­го. В Google мож­но с ходу най­ти ре­шения на базе PuTTY или ва­риан­ты для Windows 10. Мы сво­их поль­зовате­лей любим (и свои нер­вы тоже). А зна­чит, надо дать им такой инс­тру­мент, который не нуж­но нас­тра­ивать и который будет работать надеж­но.

Ины­ми сло­вами, решение дол­жно отве­чать сле­дующим тре­бова­ниям:

  • прос­тота для поль­зовате­ля;
  • лег­кость под­дер­жки;
  • прос­тая и понят­ная под­готов­ка и нас­трой­ка «сер­верных час­тей».

Ре­шение будет осно­вано на тех­нологии RDP over SSH. Тех­ничес­ки мы орга­низу­ем это так:

  • кли­ент SSH для орга­низа­ции тун­неля с проб­росом пор­та до целево­го ПК под­клю­чения;
  • ав­томати­чес­кий старт RDP-сес­сии без допол­нитель­ного вво­да парамет­ров под­клю­чения.

Сис­тема дол­жна быть лег­ко встра­иваемой, и дол­жен быть кли­ент для прод­винутых поль­зовате­лей (опци­ональ­но).

 

Готовим серверную часть

Прос­тые вещи вро­де нас­трой­ки RDP или SSH-сер­вера мы рас­смат­ривать не будем. Инс­трук­ций в интерне­те име­ется тьма, а у нас объ­ем огра­ничен, да и перег­ружать статью не хочет­ся. Так­же я не ста­ну под­робно рас­ска­зывать, как реали­зовать получе­ние дан­ных с Kerio Control: на стра­нице про­екта мож­но най­ти го­товый код.

Пер­вым делом нам нуж­но раз­решить RDP-под­клю­чения на кли­ент­ских машинах в локаль­ной сети. Если там реали­зова­но цен­тра­лизо­ван­ное управле­ние типа Active Directory, тебе повез­ло. Раз­реша­ем под­клю­чение к RDP в груп­повых полити­ках. Если нет, обхо­дим рабочие мес­та ногами и раз­реша­ем на целевых локаль­ных машинах RDP. Не забыва­ем и о фай­рво­лах.

Вто­рым шагом нам понадо­бит­ся дос­тупный из интерне­та SSH-сер­вер. Тех­ничес­ки подой­дет любое решение. Я исполь­зовал VPS с Debian 10 (один мой зна­комый под­нимал такой сер­вак даже на роуте­ре, что небезо­пас­но). Даль­ше сто­ит раз­делить решения на нес­коль­ко вер­сий, кон­крет­ная реали­зация зависит от того, как орга­низо­вано получе­ние дан­ных для авто­риза­ции поль­зовате­лей.

Пер­воначаль­но у нас исполь­зовал­ся Kerio с авто­риза­цией поль­зовате­лей через AD.

Схема подключения
Схе­ма под­клю­чения

Кли­ент под­клю­чал­ся по SSH, проб­расывал порт на API Kerio Control Server, затем под­клю­чал­ся к нему, выпол­нял поиск по задан­ным парамет­рам (логин или фамилия сот­рудни­ка), искал IP локаль­ного ПК. Далее раз­рывал SSH-соеди­нение и уста­нав­ливал новое уже с проб­росом пор­та на най­ден­ный IP, на порт RDP (3389), пос­ле чего штат­ными средс­тва­ми Windows под­нималась сес­сия RDP с переда­чей парамет­ров под­клю­чения.

Та­кое решение работа­ло доволь­но быс­тро, но нам это­го ста­ло мало, и мы раз­делили его на две час­ти. Сер­верный скрипт стал работать на SSH-сер­вере и сам вре­мя от вре­мени ходить в Kerio за информа­цией. Кли­ент­ская часть под­клю­чалась к сер­веру по SFTP, иска­ла нуж­ные дан­ные, офор­млен­ные в JSON, и выпол­няла под­клю­чение. В ито­ге ско­рость работы уве­личи­лась.

Ре­комен­дую сра­зу нас­тро­ить сер­вер OpenSSH с дос­тупом по клю­чам и под­готовить RSA-клю­чи для авто­риза­ции. Для это­го нуж­но соз­дать отдель­ного поль­зовате­ля и огра­ничить его в пра­вах, затем отдать ему пуб­личную часть клю­ча. Ниже при­веду часть /etc/ssh/sshd_config с нас­трой­ками этих двух поль­зовате­лей:

Match User sftp
PubkeyAuthentication yes
# PasswordAuthentication yes
ChrootDirectory /srv/sftp
ForceCommand internal-sftp
AllowTcpForwarding no
Match User user1
X11Forwarding no
ForceCommand /usr/bin/cmatrix # Подойдет и любая другая заглушка (можно заморочиться и отправлять пользователя в песочный bash)
PasswordAuthentication yes

Пер­вому поль­зовате­лю SFTP раз­решено под­клю­чать­ся толь­ко к это­му самому SFTP. Вто­рому — лишь для проб­роса пор­тов. Если у тебя исполь­зует­ся Kerio для получе­ния дан­ных о поль­зовате­лях, Active Directory или еще что‑то цен­тра­лизо­ван­ное, рекомен­дую завес­ти отдель­ную учет­ку и огра­ничить ее в пра­вах на вся­кий слу­чай.

 

Реализация

Итак, мы приб­лизились к реали­зации намечен­ной цели. Писать будем все это дело на Python 3.8. Во‑пер­вых, это муль­тип­латфор­менный язык, во‑вто­рых, собира­ется быс­тро и прос­то. В‑треть­их, он лег­кий в осво­ении, в‑чет­вертых, вклю­чает огромное количес­тво биб­лиотек.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

3 комментария

  1. Аватар

    K.-Poel

    19.10.2020 в 14:04

    Здорово. Я узнал о новом способе подключения )

  2. Аватар

    Sonya

    21.10.2020 в 12:19

    Это мега круто! SSH vpn + небольшой экскурс в python + qt5! Аж руки зачесались ))

    • Александр «Plus» Рак

      Александр «Plus» Рак

      28.10.2020 в 08:20

      Можно при подключении к ssh ( если из консоли устанавливается соединение ) передать ключ -w тогда с обеих сторон появятся по виртуальному интерфейсу, на которые можно назначить ip использовать как ip-ip туннель.

Оставить мнение