rdp:доступ-к-windows-rdp-по-e-mail

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
rdp:доступ-к-windows-rdp-по-e-mail [2020/12/20 01:04]
admin
rdp:доступ-к-windows-rdp-по-e-mail [2020/12/20 14:38] (текущий)
admin
Строка 3: Строка 3:
 Сразу оговоримся: с программированием не знаком и не считаю себя скриптером или кодером. То, что будет описано в данной заметке успешно работает на моем сервере 1С уже в течении 2х месяцев. Проблем в работе не наблюдалось. Сразу оговоримся: с программированием не знаком и не считаю себя скриптером или кодером. То, что будет описано в данной заметке успешно работает на моем сервере 1С уже в течении 2х месяцев. Проблем в работе не наблюдалось.
  
-Из-за самоизоляции большей части бухгалтеров пришлось работать удаленно. Самым быстрым решением был проброс RDP наружу. Что бы в тот же час сервер не начали ломать, был изменен внешний порт, установлены правила на маршрутизаторе от подбора портов и зафильтрован порт RDP на самом сервере. После нескольких часов работы стало понятно, что вручную вносить IP адреса в брандмауэр не выход. Самым подходящим способом оказалась корпоративная почта. Логика должна заключаться в том, что бы пользователь отправлял свой внешний IP адрес (который предварительно посмотрит на 2ip.ru) в теме письма на определенный адрес, после чего скрипт будет его смотреть и обрабатывать.+Из-за самоизоляции большей части бухгалтеров пришлось работать удаленно. Самым быстрым решением был проброс RDP наружу. Что бы в тот же час сервер не начали ломать, был изменен внешний порт, установлены правила на маршрутизаторе от подбора портов и зафильтрован порт RDP на самом сервере. После нескольких часов работы стало понятно, что вручную вносить IP адреса в брандмауэр не выход. Самым подходящим способом оказалась корпоративная почта. Логика должна заключаться в том, что бы пользователь отправлял свой внешний IP адрес (который предварительно посмотрит на [[https://2ip.ru/ | 2ip.ru]]) в теме письма на определенный адрес, после чего скрипт будет его смотреть и обрабатывать.
  
 Корпоративная почта располагается на сервисе ЯндексКоннект. Для начала создал ящик 1с@example.com и в нем папку access. Правилами обработки входящей почты указал, что бы письма от сотрудников которым разрешен доступ перемещались в папку access. Не лишним будет сделать автоответ: «Ваш IP адрес добавлен в белый список. Подождите 5 минут до применения правил». Для всех остальных письма будут приходить в папку входящие, которую скрипт обрабатывать не будет. Корпоративная почта располагается на сервисе ЯндексКоннект. Для начала создал ящик 1с@example.com и в нем папку access. Правилами обработки входящей почты указал, что бы письма от сотрудников которым разрешен доступ перемещались в папку access. Не лишним будет сделать автоответ: «Ваш IP адрес добавлен в белый список. Подождите 5 минут до применения правил». Для всех остальных письма будут приходить в папку входящие, которую скрипт обрабатывать не будет.
Строка 11: Строка 11:
 Теперь создаем папку scripts, и в нее кладем файл mail.py с данным содержанием (используется Pyhon 3.7×64): Теперь создаем папку scripts, и в нее кладем файл mail.py с данным содержанием (используется Pyhon 3.7×64):
  
-<code python>+<file python mail.py>
 import imaplib import imaplib
 import email import email
Строка 20: Строка 20:
 import ipaddress import ipaddress
 import os import os
- +
 #подключение к серверу #подключение к серверу
 imap = imaplib.IMAP4_SSL('imap.yandex.ru') imap = imaplib.IMAP4_SSL('imap.yandex.ru')
-imap.login('1с@example.com', 'PASSWORD'+imap.login('[EMAIL]', '[PASSWORD]') 
- +
 #выбор каталога #выбор каталога
 imap.select('access') imap.select('access')
- +
 #просмотр непрочитанных (u-unread) #просмотр непрочитанных (u-unread)
 r, d = imap.search(None, '(UNSEEN)') r, d = imap.search(None, '(UNSEEN)')
Строка 35: Строка 35:
 matches = re.finditer(regex, c, re.MULTILINE) matches = re.finditer(regex, c, re.MULTILINE)
 for matchNum, match in enumerate(matches, start=1): for matchNum, match in enumerate(matches, start=1):
-carray.extend ("{match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))+   carray.extend ("{match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
 i = len(carray) i = len(carray)
 ii=0 ii=0
- +
 def check_ip(ip): def check_ip(ip):
-try: +    try: 
-ipaddress.ip_address(ip) +        ipaddress.ip_address(ip) 
-except ValueError: +    except ValueError: 
-return 0 +        return 0 
-else: +    else: 
-return 1 +        return 1 
-  + 
-while ii &amp;lt; i: +while ii i: 
-result, data = imap.search(None, '(UNSEEN)'+    result, data = imap.search(None, '(UNSEEN)'
-ids = data[0] # Получаем сроку номеров писем +    ids = data[0] # Получаем сроку номеров писем 
-id_list = ids.split() # Разделяем ID писем +    id_list = ids.split() # Разделяем ID писем 
-latest_email_id = id_list[-1] # Берем последний ID +    latest_email_id = id_list[-1] # Берем последний ID 
-result, data = imap.fetch(latest_email_id, "(RFC822)") # Получаем тело письма (RFC822) для данного ID +    result, data = imap.fetch(latest_email_id, "(RFC822)") # Получаем тело письма (RFC822) для данного ID 
-raw_email = data[0][1] # Тело письма в необработанном виде +    raw_email = data[0][1] # Тело письма в необработанном виде 
-email_message = email.message_from_bytes(raw_email) +    email_message = email.message_from_bytes(raw_email) 
-efrom = make_header(decode_header(email_message['From'])) +    efrom = make_header(decode_header(email_message['From'])) 
-esubject = make_header(decode_header(email_message['Subject'])) +    esubject = make_header(decode_header(email_message['Subject'])) 
-sesubject = str(esubject) +    sesubject = str(esubject) 
-edate = email_message['Date'+    edate = email_message['Date'
-ipv = check_ip(str(esubject)) +    ipv = check_ip(str(esubject)) 
-f = open('log.txt', 'a'+    f = open('log.txt', 'a'
-f.write(edate) +    f.write(edate) 
-f.write(' ') +    f.write('  ') 
-f.write(str(efrom)) +    f.write(str(efrom)) 
-f.write(' IP:'+    f.write('  IP:'
-f.write(str(esubject)) +    f.write(str(esubject)) 
-f.write(' ') +    f.write('  ') 
-f.close() +    f.close() 
-print('Log1 updated'+    print('Log1 updated'
-if ipv == 1: +    if ipv == 1: 
-f = open('access.txt', 'a'+          f = open('access.txt', 'a'
-f.write(sesubject) +          f.write(sesubject) 
-f.write(','+          f.write(','
-f.close() +          f.close() 
-print('Access list updated'+          print('Access list updated'
-else: +    else: 
-f = open('log.txt', 'a'+          f = open('log.txt', 'a'
-f.write('WARNONG INVALID IP:'+          f.write('WARNONG INVALID IP:'
-f.write(sesubject) +          f.write(sesubject) 
-f.close() +          f.close() 
-print('Log2 updated'+          print('Log2 updated'
-f = open('log.txt', 'a'+    f = open('log.txt', 'a'
-f.write('\n'+    f.write('\n'
-f.close() +    f.close() 
-  +     
-ii = ii+1 +    ii = ii+1 
-if ii == i: +    if ii == i: 
-break +       break 
- +
 f = open('access.txt', 'r') f = open('access.txt', 'r')
 ipslist = f.read().split(",") ipslist = f.read().split(",")
Строка 95: Строка 95:
 ips = str(ips) ips = str(ips)
 os.system('netsh advfirewall firewall set rule name="Дистанционное управление рабочим столом (TCP - входящий)" new remoteip='+str(ips)) os.system('netsh advfirewall firewall set rule name="Дистанционное управление рабочим столом (TCP - входящий)" new remoteip='+str(ips))
-</code>+</file>
  
 Для корректного работы скрипта требуется: Для корректного работы скрипта требуется:
  
-Заменить имя почтового ящика (1с@example.com) и пароль (PASSWORD) на ваши. +  - Заменить имя почтового ящика (1с@example.com) и пароль (PASSWORD) на ваши. 
-Заменить имя RDP доступа на ваше. У меня указано для Windows 7 ( Дистанционное управление рабочим столом (TCP — входящий) ) +  Заменить имя RDP доступа на ваше. У меня указано для Windows 7 ( Дистанционное управление рабочим столом (TCP — входящий) ) 
-Создать файл access.txt и log.txt +  Создать файл access.txt и log.txt 
-В access.txt заранее через запятую внести IP адреса с которых должен быть доступ (как правило это внутренние подсети и ip администратора) +  В access.txt заранее через запятую внести IP адреса с которых должен быть доступ (как правило это внутренние подсети и ip администратора) 
-Наконец создать файл start.cmd с содержанием: +  Наконец создать файл start.cmd с содержанием: 
-? + 
-+<file dos start.cmd>
-2+
 cd C:\scripts\ cd C:\scripts\
 mail.py mail.py
 +</file>
 +
 После чего дергайте скрипт через планировщик каждые 5 минут. После чего дергайте скрипт через планировщик каждые 5 минут.
  • rdp/доступ-к-windows-rdp-по-e-mail.1608401063.txt.gz
  • Последнее изменение: 2020/12/20 01:04
  • admin