Это действительно хорошее решение, поскольку Microsoft до сих пор не может понять, как предотвратить грубую атаку на сеансы RDP. Существует политика блокировки учетной записи (которая имеет некоторый недостаток, читайте дальше), которая очень хорошо описана в хорошем ответе @harrymc, так что те, кто имеет хотя бы версию Windows Pro, могут использовать такой рабочий процесс.
Если вы являетесь владельцем домашней версии, вы можете активировать политику блокировки учетной записи, отредактировав непосредственно реестр в следующем ключе:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteAccess\Parameters\AccountLockout
- Дважды щелкните значение
MaxDenials
и введите число неудачных попыток, прежде чем заблокировать учетную запись.
- Дважды щелкните значение
ResetTime
(mins) и измените значение по умолчанию 0xB40
которое является шестнадцатеричным в течение 2880 минут (два дня), на что-то разумное, скажем, 15-20 минут.
Проблема с политикой блокировки учетных записей Windows заключается в том, что ваш компьютер будет заблокирован, если кто-то попытается взломать пароль. Политика не зависит от IP-адреса отправителя, просто подсчитывает количество попыток входа в систему и инициирует событие блокировки учетной записи, поэтому эффективно отключает доступ как к владельцу, так и к злоумышленнику.
Другое ИМХО, намного более надежная защита - это использование аутентификации с открытым ключом SSH, которая намного сильнее, чем аутентификация на основе пароля.
Вы почти ответили на свой вопрос, упомянув SSH. Установите cygwin на ПК с Windows, запустите службу SSH и включите туннелирование sshd_config
и установите аутентификацию с открытым ключом, отключив аутентификацию по простому паролю (если соединение успешно установлено, проверьте соединение ssh, находясь в домашней сети).
На вашем маршрутизаторе перенаправьте не SSH-порт по умолчанию (22), например, 20202, как вы делали это для RDP, на эту машину Windows на порт 22 на ПК с Windows (не забудьте также ОТКЛЮЧИТЬ пересылку в RDP). Когда вы собираетесь подключиться к RDP, запустите первый сеанс SSH с удаленным ПК с Windows, используя следующий скрипт:
(скрипт для ОС на основе Unix, таких как Linux, BSD, MacOS, а также для тех, кто использует cygwin. Те, кто использует Windows в качестве клиента, видят раздел "Подключение" ниже)
#!/bin/sh
# Script that can be use on remote client that running Unix based OS
RemotePC_IP=1.2.3.4 # Public IP address of your home
WindowsUserName=Gates # Windows user name on remote computer
RDPlocalListenPort=12345 # Local port that that will be forwarded to RDP
Path2prvKey='/path/to/private/key' # Path to private key
RemoteSSHport=20202 # The port that opened on your home router
# and forwarded to SSH service port on Windows PC
ssh -N -L ${RDPlocalListenPort}:localhost:3389 \
-i ${Path2prvKey} -p ${RemoteSSHport} ${WindowsUserName}@${RemotePC_IP}
# If you also want to use bunch of useful Unix utilites (that doesn't
# exist natively on Windows) besides of port forwarding, you can remove
# `-N` option from this script and use cygwin's terminal to run Windows's
# and Unix's console base programs remotely without starting RDP session.
он будет перенаправлять ваш локальный порт 12345 на порт RDP(3389) на удаленной машине с Windows через надежно зашифрованный сеанс SSH, а затем, наконец, подключаться к RDP с помощью строки подключения localhost:12345
Преимущество такого способа защиты сеанса RDP заключается в том, что канал, зашифрованный с использованием асимметричной криптографии, намного надежнее любого сложного пароля. Помимо надежного шифрования можно использовать богатые утилиты Unix для управления по защищенному каналу удаленного ПК с Windows.
Еще одна изящная вещь, которую вы можете сделать, используя SSH, - если у вас нет статического IP-адреса дома, или вы не хотите полностью доверять таким компаниям, как LogMeIn или TeamViewer, или вашему ПК, расположенному за строгим брандмауэром, где вы не можете настроить переадресацию портов ИЛИ у вас нет контроля над основным шлюзом / брандмауэром, тогда можно настроить SSH в обратном режиме, когда ПК с Windows автоматически подключается к промежуточному серверу со статическим IP-адресом, которым вы управляете. Таким образом, вам не нужно подключаться напрямую к ПК с Windows, а подключаться к промежуточному серверу, который может обслуживать множество компьютеров. Такая настройка очень удобна, когда необходимо поддерживать мобильных клиентов, IP-адрес которых неизвестен, и когда ИТ-служба должна поддерживать мобильный ПК компании, не используя сторонние сервисы, из-за высокой секретности компании, которая снижает риск компрометации данных.
Хотя процесс установки, представленный ниже, выглядит довольно долго, на практике такая установка занимает 10-15 минут, когда вы понимаете, как она работает.
Подробности:
Установка Cygwin
Обновление: Начиная с Windows 10 v.1803 Microsoft поставлялась с уже предустановленными сервером и клиентом OpenSSH, поэтому приведенные ниже шаги предназначены для тех, у кого еще нет Windows 10 или она не обновлена до Windows 10 v.1803 и выше.
Чтобы установить SSH в Windows, следуйте документации Oracle, которая подробно описывает скриншоты, как настроить службу SSH.
Вам нужно только следовать разделам 5.3, 5.4, 5.5 здесь
Ниже я приведу наиболее важные шаги, которые необходимо выполнить для установки службы SSH.
- Загрузите исполняемый файл установки с основного сайта cygwin . Существует две версии установочных файлов:
setup-x86.exe
и setup-x86_64.exe
. Выберите подходящий файл для вашей машины. Если вы хотите использовать другие базовые утилиты Unix, кроме SSH, то я советую использовать версию x86
даже если ваша машина 64-битная, потому что не все утилиты перенесены на 64-битную версию.
- Процесс установки довольно прост и интуитивно понятен:
На экране выбора типа установки выберите «Установить из Интернета» и нажмите «Далее».
- На экране «Выберите каталог установки» введите C:\cygwin в качестве корневого каталога, затем нажмите «Далее». Установите
Install for
всех пользователей
- На экране Select Local Package Directory выберите каталог на локальном компьютере, в котором вы хотите сохранить загруженные установочные файлы, затем нажмите Next. (Вы можете оставить по умолчанию
c:\packages
)
- На экране «Выберите тип подключения» выберите соответствующие параметры для подключения к Интернету и нажмите «Далее». Если у вашего ПК есть прямой доступ к Интернету без прокси-серверов, выберите «
Direct connections
- На экране выбора сайтов загрузки выберите любой сайт из списка доступных и нажмите кнопку «Далее». Выберите там ближайший к вам сайт.
На экране выбора пакетов убедитесь, что вы выбрали как минимум следующие пакеты, а затем нажмите кнопку Далее:
openssh
, openssl
, unzip
, xz
, zip
, mc
- После выбора пакетов и нажатия кнопки «Далее» отобразится экран «Устранение зависимостей». Нажмите Далее, чтобы продолжить.
- Если вы думаете, что будете использовать утилиты на основе Unix, то на экране состояния установки и создания значков не вносите никаких изменений. Нажмите Finish, чтобы завершить процесс установки, в противном случае снимите флажки.
Настройка SSH
После установки Cygwin перейдите в каталог C:\cygwin
, откройте файл Cygwin.bat
в режиме редактирования с помощью любого редактора и добавьте следующую строку перед вызовом оболочки bash.
set CYGWIN=binmode ntsec
как в примере ниже:
@echo off
C:
chdir C:\cygwin\bin
set CYGWIN=binmode ntsec
bash --login -i
Чтобы проверить, правильно ли установлен Cygwin (cygrunsrv
), запустите
C:\cygwin\Cygwin.bat
и выполните следующую команду:
cygrunsrv -h
Если Cygwin установлен правильно, то все параметры справки Cygwin отображаются на экране. Однако, если эта команда возвращает сообщение об ошибке, возможно, вам придется переустановить Cygwin.
- Чтобы настроить службу
SSHD
, запустите C:\cygwin\Cygwin.bat
и выполните следующую команду:
ssh-host-config
После запуска команды вам будут предложены следующие вопросы:
*** Query: Should privilege separation be used? <yes/no>: yes
*** Query: New local account 'sshd'? <yes/no>: yes
*** Query: Do you want to install sshd as a service?
*** Query: <Say "no" if it is already installed as a service> <yes/no>: yes
*** Query: Enter the value of CYGWIN for the deamon: [] binmode ntsec
*** Query: Do you want to use a different name? (yes/no) yes/no
На этом этапе, если вы хотите использовать то же имя, то есть cyg_server
, введите no. Затем вам будут предложены следующие вопросы:
*** Query: Create new privileged user account 'cyg_server'? (yes/no) yes
*** Query: Please enter the password:
*** Query: Renter:
Однако, если вы хотите использовать другое имя, введите yes. Затем вам будут предложены следующие вопросы:
*** Query: Enter the new user name: cyg_server1
*** Query: Reenter: cyg_server1
*** Query: Create new privileged user account 'cyg_server1'? (yes/no) yes
*** Query: Please enter the password:
*** Query: Reenter:
Если конфигурация прошла успешно, вы увидите следующее сообщение:
Host configuration finished. Have fun!
- Сделайте резервную копию файла
c:\cygwin\etc\passwd
(если он существует) и выполните следующую команду:
/bin/mkpasswd -l >/etc/passwd
затем отредактируйте passwd
, запустив mcedit /etc/passwd
Удалите всех пользователей, которые не будут подключаться через SSH , особенно:
SYSTEM, LOCAL SERVICE, NETWORK SERVICE, NT SERVICE+TrustedInstaller, Guest
Точная настройка службы SSHD
- Отредактируйте
sshd_config
(служба SSH), запустив:
mcedit /etc/sshd_config
- Добавьте в конец файла следующий контент:
########################### Customization ##########################
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com
#
UseDNS no
UsePAM yes
LoginGraceTime 20
#
PermitRootLogin prohibit-password
PubkeyAuthentication yes
ChallengeResponseAuthentication no
PasswordAuthentication no
HostbasedAuthentication no
#
PermitTunnel yes
TCPKeepAlive no
ClientAliveInterval 30
ClientAliveCountMax 10
GatewayPorts no
AllowTcpForwarding yes
Теперь нужно сгенерировать ключи для аутентификации с открытым ключом
В терминале cygwin
выполните следующие команды:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
cd ~/.ssh
echo > ~/.ssh/authorized_keys
- Генерируйте ключи Unix способом: (замените "UserName" на учетную запись Windows, которая будет подключена через SSH)
В терминале cygwin
выполните следующие команды:
cd ~/.ssh
ssh-keygen -t ed25519 -o -a 127 -C "UserName" -f "UserName.ed25519.key"
cp -f UserName.ed25519.key.pub ~/.ssh/authorized_keys
- Windows способ:
Загрузите PuTTY
и запустите puttygen.exe
. Выберите ключ для генерации как ED25519
и нажмите Generate . Сохраните закрытый ключ в файл, который позже можно будет использовать в качестве ключа для авторизации. Выберите открытый ключ вверху из поля, помеченного как (Открытый ключ для передачи в OpenSSH), сделайте правый клик на выделении и выберите « copy
затем paste
скопированный контент в
~/.ssh/authorized_keys
Наконец, запустите службу SSH, выполнив следующую команду:
cygrunsrv -S sshd
Подключение от удаленного клиента к RDP через соединение SSH
- Для подключения в операционных системах на основе Unix, таких как Linux, FreeBSD, MacOS, можно использовать сценарий оболочки, размещенный в верхней части ответа. Отредактируйте переменные в верхней части скрипта, используйте закрытый ключ, сгенерированный на предыдущих шагах.
- Для подключения с компьютеров под управлением Windows можно использовать клиентскую программу PuTTY . Перед подключением к удаленному компьютеру через RDP(подключение к удаленному рабочему столу), запустите сначала PuTTY и настройте переадресацию портов и закрытый ключ:
- На левой панели дерева перейдите к
Connection->SSH->Auth
и, нажав кнопку Browse , добавьте путь к закрытому ключу, который был сгенерирован на предыдущих шагах.
- На левой панели дерева перейдите к
Connection->SSH->Tunnels
и введите в поле Source port
12345
и поместите localhost:3389
в поле destination
затем установите переключатели в Local
и Auto
и нажмите кнопку Add .
- На левой панели дерева перейдите в
Session
и введите в поле « Host Name
IP-адрес удаленного ПК с Windows, на котором работает SSH, а также задайте порт удаленного прослушивания домашнего маршрутизатора в поле « Port
.
- Добавьте описательное имя вашего сеанса в поле
Saved Sessions
и сохраните конфигурацию.
- Когда соединение через SSH установлено, запустите программу
Remote Desktop Connection
и используйте localhost:12345
для подключения к удаленному компьютеру через RDP через туннель SSH.