Skip to content

sor88/rdpoverssh

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

Repository files navigation

RDP over SSH (клиент SSH + RDP).

Клиент подключается к RDP через SSH туннель. Принцип работы построен на функционале ssh. Интересный материал на эту тему: https://habr.com/ru/post/331348/#t5
Реализация клиент серверной версии. Разделено на две части клиентскую и серверную.
Серверная часть работает с API керио и готовит файл или бд (mongo BD) с данными пользователей.
Клиетская часть подключается к серверу соединений производит поиск по ключевому полю запрошенную информацию. Определяет параметры подключения. Устанавливает соединение с конечным узлом.

ВНИМАНИЕ:
1. Не используйте ключи авторизации ssh, выложеные в проекте. они исключительно для ознакомления. Мануалов по генерации ключа в сети полно, например, тут https://habr.com/ru/post/122445/.
2. Текущая реализация предполагает наличие SSH сервера(с встроенным sftp), доступного из сети Интернет, ( опционально Kerio Control с авторизацией пользователей через MAC/IP адрес.) В проекте используются библиотеки json, sshtunnel, PyQt5, threading и api Kerio Control доступный по ссылке https://manuals.gfi.com/en/kerio/api/control/reference/index.html,а также в качестве готовых python библиотек: pykerio, python-kerio-api

Принцип работы:

1.1 Приложение подключается к SSH серверу, доступному из сети Интернет и запрашивает данные для ip для подключения к RDP (Варианты расположения ssh могут быть самые разные. Вариант на схеме: проброшенный порт фаервола на SSH сервер предприятия. Сам файервол может выступать в роли SSH сервера. Вторым сервером с белым ip и ip локальной сети.).
1.2 Запрашивает в бд или json файле информацию о пользователе.
1.3 Определяет локальный IP и устанавливает соединение с пк в локальной сети по ssh с пробросом на порт RDP(3389). 1.4 Добавляет в систему учетные данные для подключения в диспетчер учетных записей пользователя.
1.5 Создается новый процесс с вызовом mstsc и передачей параметров подключения.
1.6 После успешного подключения учетные данные удаляются.

Alt-текст


Подготовка серверной части:

Сервер SSH с белым IP. Для безопастности с ограниченным пользователем: nologin, песочный bash. Доступ по встроенному sftp или подключение к СУБД. Авторизация по ключу. Пробросить необходимые порты. Создать пользователя Kerio Control с ограниченными правами, только для чтения. (опционально, JSON файл можно подготовить в ручную или взял данные из AD или другой системы учета пользователей) Пример JSON файла:

[
    {
    	"User": {
            "login": "Логин 1",
        	"FullName": "Логин1 Иван,
        	"ipaddress": {
                "ip": [
                	"192.168.0.2"
            	]
        	}
    	}
	},
	{
        "User": {
        	"login": "Логин2",
        	"FullName": "Логин2 Степан Борисович",
        	"ipaddress": {
                "ip": [
                	"192.168.0.3"
            	]
        	}
    	}
	},
	...
]

Настройка:

Основной файл запуска программы remotecli.py
Файл настроек подключений sshconnect.py Файл дизайна для python desing.py
Файл графических ресурсов res.py
В каталоге kerio находится серверная часть для парсинга учетных записей с kerio api. Основной файл настройки подключения sshconnect.py

publicipadress = ('Public_IP', PORT)  # Публичный IP адрес и порт ssh сервера
...
...
def sshtunconnect(address):
    """
     Функция установки ssh соединения с найденным ip.
    """
    server = open_tunnel (
        publicipadress,
        ssh_username="ssh_login", # логин ssh сервера
        #       ssh_password="password", # пароль ssh
        ssh_pkey="srv.key",  # файл ключа ssh
        remote_bind_address=address,
        local_bind_address=('localhost', 2222)  # адрес и порт пробрасываемого порта.
    )
    server.start ()
    print (server.local_bind_port)
...
...
  def rdpdataconnection():
    """
    Вызов  RDP с параметрами.
    """
    import subprocess
    global login, password
    if len(login.split()) > 0:
        login = login.split()[0]
        print(login)
    subprocess.call(
        f"cmdkey /add:localhost /user:DOMAIN\{login} /pass:{password}")  # Если пользователи не доменные DOMAIN\ убрать
    time.sleep(3)
    subprocess.call ("mstsc /v:localhost:2222")
    time.sleep(15)
    delkeyuser()
  

Получения данных с Kerio Control в JSON вынесено в файл /kerio/keriofunction.py функция main. Принцип работы простой - получает данные с Kerio и записывает их в JSON файл на sftp сервере.

Файл kerio/kerio.py

username = "kerio_admin_read_access_login" логин от kerio control, достаточно ограниченной учетной записи с правами только для чтения
password = "kerio_admin_read_admin_pass"    пароль от kerio control

Планы:

🔲 Делать или не делать вот в чем вопрос?

  1. Реализация раздела настройки.
  2. Реализация ручного указания ip на в настройках приложения.