Клиент подключается к RDP через SSH туннель. Принцип работы построен на функционале ssh. Интересный материал на эту тему: https://habr.com/ru/post/331348/#t5
Клиетская часть подключается к серверу соединений производит поиск по ключевому полю запрошенную информацию. Определяет параметры подключения. Устанавливает соединение с конечным узлом.
ВНИМАНИЕ:
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 После успешного подключения учетные данные удаляются.
Сервер 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
🔲 Делать или не делать вот в чем вопрос?
- Реализация раздела настройки.
- Реализация ручного указания ip на в настройках приложения.