Web-bastion: RDP и SSH через браузер без прямого NAT
Цикл «Не светим лишнего». Выпуск 13.

Динамический allow-list хорош, но у него фундаментальное ограничение: после открытия firewall видит внешний IP. Если за ним сто человек, сетевой допуск получают все сто. Их ещё остановит авторизация целевого сервиса, но индивидуального сетевого коридора нет.
Для RDP, SSH и VNC можно не публиковать прямой коридор вообще. Пользователь входит на web-bastion, выбирает разрешённую машину и работает внутри браузера.
Как устроен Apache Guacamole
Apache Guacamole называют clientless remote desktop gateway. На пользовательском устройстве нужен только современный браузер.
Веб-приложение отвечает за интерфейс и авторизацию. Компонент guacd устанавливает настоящие RDP, SSH или VNC-соединения к внутренним узлам и переводит их в протокол, который понимает браузер.
Наружу опубликован только HTTPS самого Guacamole. Серверы Windows не имеют внешнего DNAT на 3389, а SSH-хосты — на 22. Между guacd и целевыми узлами действуют отдельные внутренние firewall-правила.
Что получаем кроме «работает в браузере»
Пользователь известен bastion по индивидуальной учётке, OIDC или LDAP. Ему можно показать только назначенные соединения. Общий NAT больше не мешает — действия проходят внутри отдельной веб-сессии.
Guacamole умеет управлять буфером обмена, передачей файлов, SFTP и записью графических сеансов. Это полезно для подрядчиков и чувствительного администрирования, если правила хранения и доступа к записям определены заранее.
Плюсы
- никакого клиента и VPN-профиля;
- внутренние RDP/SSH/VNC-порты не публикуются;
- индивидуальная авторизация не зависит от внешнего IP;
- единый список разрешённых подключений;
- аудит и запись сеансов;
- можно отключить clipboard и передачу файлов;
- удобно выдавать временных пользователей.
Минусы
- весь интерактивный трафик идёт через bastion;
- задержка и производительность зависят от него;
- не все сценарии толстых клиентов переносятся в браузер;
- появляется критичная база подключений и прав;
- сложнее обеспечить высокую доступность;
- учётные данные целевых систем надо либо спрашивать, либо где-то хранить.
Где можно больно ошибиться
Выставить guacd наружу. Он должен быть доступен только веб-приложению по изолированной сети. Публичной точкой остаётся HTTPS.
Хранить общие админские пароли без защиты. Лучше персональные учётки на целевых системах, интеграция с каталогом или безопасное хранилище секретов.
Оставить всё включённым. Clipboard, drive redirection и загрузка файлов удобны, но для подрядчика могут стать каналом выноса данных или заноса исполняемых файлов.
Разрешить произвольные ad-hoc назначения. Если пользователь сам указывает любой ssh://10.x.x.x, bastion превращается в внутренний сканер. Нужны разрешённые ресурсы и сетевые ACL от guacd.
Записывать всё без правил. В записи могут оказаться персональные данные, пароли на экране и коммерческая информация. Определяем срок хранения, доступ и причину записи.
Забыть MFA и обновления. Bastion — единая внешняя дверь к множеству систем. Компрометация его учётки особенно неприятна.
Когда bastion лучше прямого доступа
Для подрядчиков, временной поддержки, администрирования с чужого устройства и доступа из общего NAT — почти всегда интереснее прямого DNAT. Постоянному сетевому инженеру иногда удобнее нативный SSH и WinBox; тогда TOTP + heartbeat может открыть узкий прямой доступ.
В финальной архитектуре эти способы не спорят: разные группы ресурсов проходят через разные точки применения политики.
Ранее в цикле
- 10. Авторизующий reverse proxy: доступ к приложению, а не к сети
- 12. Heartbeat: firewall открыт, пока жива вкладка