Категория > Новости > RDP over SSH. Как я писал клиент для удаленки под винду - «Новости»

RDP over SSH. Как я писал клиент для удаленки под винду - «Новости»


20-10-2020, 00:00. Автор: Евлампия
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
AllowTcpForwardingno
Match User user1
X11Forwarding no
ForceCommand /usr/bin/cmatrix # Подойдет и любая другая заглушка (можно заморочиться и отправлять пользователя в песочный bash)
PasswordAuthentication yes

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


Реализация


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



Перейти обратно к новости