Авторизующий reverse proxy: доступ к приложению, а не к сети

Цикл «Не светим лишнего». Выпуск 10.

Basic Auth хорош, пока пользователей трое. Потом нужен четвёртый, один увольняется, другой забывает пароль, руководитель просит TOTP, а безопасник — журнал по именам. В этот момент лучше перестать улучшать htpasswd.

Авторизующий reverse proxy отправляет пользователя к нормальному провайдеру идентичности: Keycloak, Authentik, Authelia, Entra ID или другому OIDC-совместимому сервису. После входа прокси получает подтверждённую личность и решает, можно ли пропустить запрос к конкретному приложению.

Несколько новых слов

IdP, Identity Provider — система, которая аутентифицирует пользователя и сообщает другим сервисам, кто это.

OIDC, OpenID Connect — распространённый протокол входа поверх OAuth 2.0. Пользователь логинится у IdP, а приложение получает подписанные данные о его личности.

SSO — единый вход. Один раз прошли корпоративную авторизацию и используем несколько разрешённых приложений без отдельных паролей.

Identity-aware proxy — прокси, который принимает решение не только по IP, но и по пользователю, группе, MFA и другим признакам.

Как идёт запрос

Пользователь открывает внутренний hostname. Proxy видит, что действующей сессии нет, и отправляет его на страницу IdP. После пароля, passkey или TOTP пользователь возвращается с подтверждением. Proxy создаёт защищённую cookie и пропускает запрос к backend.

Внутреннее приложение может само ничего не знать про OIDC. Если ему нужна личность, proxy передаёт проверенные заголовки вроде X-User или X-Email.

Плюсы

Минусы

Где можно больно ошибиться

Backend доверяет заголовкам от клиента. Внешний пользователь сам присылает X-User: admin. Proxy обязан удалять такие заголовки и записывать собственные. Backend должен принимать трафик только от proxy.

Неправильно определён реальный IP. OAuth2 Proxy отдельно предупреждает: X-Forwarded-* надо принимать только от доверенных адресов reverse proxy. Иначе IP можно подделать строкой заголовка.

Слишком длинная cookie. Человек ушёл с общего компьютера, а сессия живёт неделю. Нужны разумный срок, logout и повторная сильная авторизация для опасных действий.

Нет защиты origin. Если backend доступен напрямую, вся identity-aware-логика обходится одним прямым запросом.

Proxy стал единственной защитой. На самом приложении всё равно оставляем минимальные роли и обновления. Для критичной админки можно совместить IdP с IP allow-list или клиентским сертификатом.

Что этот метод не решает

Он отлично защищает веб-приложения, но не открывает обычный SSH-клиент, RDP, WinBox или подключение к базе. Для произвольных протоколов понадобится bastion, VPN или динамический firewall.

Следующая наша схема как раз про динамический firewall: пользователь вводит TOTP на портале, а его текущий IP временно попадает в нужный access-list.

Ранее в цикле

Документация и источники

#network