
Параметр
Малое предприятие (слишком маленькое, чтобы оправдать установку шлюза служб терминалов) хочет, чтобы определенные пользователи могли получать доступ к своим рабочим столам Windows 10 из дома.
Мне повезло с Windows Remote Desktop для этой цели, однако лучшая практика подсказывает не открывать порт RDP напрямую. Эторекомендуется защищать RDP через VPN, однако раньше я обычно настраивал для этой цели SSH-туннель, поскольку он был мне более знаком.
Я предположу, что у клиента есть компьютер, на котором может работать SSH-сервер, и буду называть его SSH_SERVER
. В моем случае обычно локально уже есть компьютер Linux или BSD, который либо используется в качестве файлового сервера, либо выполняет функции брандмауэра (например, FreeNAS, pfSense), если нет, я обычно подключаю перестроенный ПК специально для выполнения этой задачи.
Версия переадресации портов SSH
В этом разделе я подробно расскажу, как настроить переадресацию портов SSH для клиента, которому необходим доступ к удаленному рабочему столу Windows.
- Настройте аутентификацию только по ключу для SSH
SSH_SERVER
и откройте брандмауэр, чтобы раскрыть его на каком-то нестандартном порту<EXT_SSH_PORT>
. Примечание: этотольковнешний порт я когда-либо открывал,всеСвязь с сетью осуществляется посредством переадресации портов по протоколу SSH. - Для каждого клиента, который хочет подключиться удаленно, я создаю пользователя
SSH_SERVER
с оболочкой, установленной на/bin/false
. - Добавьте ограничения SSH, позволяющие пользователю перенаправлять порты только для порта и устройства, к которым он хочет подключиться. Например, я добавляю в файл следующее
/etc/sshd_conf
:
Match User <USERNAME>
AllowAgentForwarding no
PermitOpen <USER'S_WINDOWS_DESKTOP_IP>:3389
ForceCommand echo 'This account is restricted.'
(более подробное обсуждениездесь).
- Для каждогоустройствок которому пользователь хочет подключиться, я генерирую пару ключей, которая зашифрована паролем, который я им предоставляю. Затем я (a) добавляю открытый ключ в
~/.ssh/authorized_keys
файл пользователя и (b) безопасно передаю закрытый ключ на устройство пользователя. - Я создаю способ простой настройки SSH-туннеля, либо с помощью простого скрипта, который просто запускается,
ssh -L 10000:<USER'S_WINDOWS_DESKTOP_IP>:3389 <OFFICE_EXTERNAL_IP> -p <EXT_SSH_PORT>
либо с помощью вспомогательного программного обеспечения (например,ОС Mac, дляОкна). - Я добавляю ярлык для сеанса RDP в
localhost:10000
.
Этот метод работал достаточно хорошо, но я всегда чувствовал, что он недостаточно «профессиональный», и что когда-нибудь мне придется преобразовать эти SSH-туннели в VPN.
Ограничения VPN-сети
Я исследовал это с помощью L2TP/IPSEC (на UniFi Dream Machine, хотя я думаю, что ограничения здесь не являются специфическими для маршрутизатора) и сразу же столкнулся с некоторыми ограничениями:
- Офисная сеть должна иметь IP-подсеть, отличную от клиентской подсети.Это было бы незначительной неприятностью, но предположим, я мог бы это сделать. С другой стороны, я нахожу довольно неудовлетворительным то, что вы по сути просто надеетесь, что выберете подсеть, которую клиентникогдаслучайно находитесь в сети — что, если они посещают какую-то другую компанию и используют ее Wi-Fi, а вы случайно выбрали ту же подсеть, что и поставщик ИТ-услуг оттуда?
- Непонятно, как ограничить связь одним портом для одного ПК для каждого пользователя.Я знаю, что могу настроить его так, чтобы пользователи VPN были помещены в отдельную VLAN, а затем добавить правила брандмауэра, которые ограничивают соединения из этой VLAN портом 3389 на определенных рабочих столах RDP, но это не остановит USER_A от попыток подключения к рабочему столу USER_B. Если я также открываю порты, отличные от RDP, по какой-то причине, то все пользователи VPN также будут иметь доступ к этим портам, если только я не добавлюкаждый пользовательв ихсобственныйVLAN, что, похоже, влечет за собой дополнительные административные издержки для функции, которая у меня по сути и так «бесплатно» есть благодаря SSH.
- Нет четкой защиты для каждого устройства.При подходе SSH, о котором я упоминал выше, если у USER_A украли ноутбук, то нет никаких реальных проблем. Во-первых, закрытый ключ зашифрован, поэтому, если ноутбук не был украден, когда пользователь был активно подключен, он не должен иметь доступа к офисной сети. Более того, для дополнительной безопасности я могу просто удалить ключ, связанный с украденным ноутбуком, из
~/.ssh/authorized_keys
, и все остальные устройства, которыми владеет клиент (например, персональный компьютер), продолжат работать без дополнительной настройки.
TL;DR: Почему кто-то предпочитает использовать VPN вместо переадресации портов SSH?
Похоже, единственный случай, когда VPN предпочтительнее, — это когда вы хотитевсесвязь осуществляется через офисную сеть, и у вас есть некоторый уровень осведомленности/контроля над удаленной сетью. (VPN типа «сеть-сеть» попадают в эту категорию.)
Я что-то упустил? VPN предлагают большую производительность и/или безопасность, чем переадресация портов SSH?
решение1
Предложенное вами решение SSH кажется мне слишком сложным для рассматриваемой проблемы.
Два предложения:
Используйте VPN в сочетании с решением 2FA/MFA, например Duo.
Если VPN вызывает проблемы, используйте другое решение для удаленного доступа, например Teamviewer, AnyDesk и т. д., в сочетании с поставщиком 2FA/MFA, например Duo.
Вы можете создать бесплатную учетную запись Duo для использования с 10 пользователями.