Ключевым звеном в zt является прокси. Именно с ней взаимодействуют все клиенты, от нее они получают вердикт - пустят их в админку или нет. 

Что должна уметь прокси в первую очередь:

  1. Устанавливать mTLS соединение с клиентом

  2. Корректно проксировать запросы от клиента в защищаемый сервис и обратно

  3. Работать с другими сервисами - Certification Authority и его middleware, OIDС, системой принятия решений (которая принимает решение пускать/не пускать)

Схема работы получается такая:

Что должна уметь прокси во вторую очередь:

  1. Работать не только с HTTP протоколом

  2. В режиме реального времени разрывать соединение

  3. Поддерживать гранулярную настройку доступа per route для HTTP. Например на /admin пускать только определенных пользователей.

  4. Обеспечивать поддержку machine-2-machine взаимодействия

  5. Иметь breaking glass механизм

Посмотрим, есть ли готовые решения для этих задач, что нужно допиливать самим, и подумаем, что нам нужно сделать в пост-MVP период.

Выбор решения из готовых

Первым критерием для выбора является открытые исходники. Готовые вендорские решения  не подходят - у них очень специфичные требования, продукты сырые, вендор всегда бежит медленнее чем ты. При выборе опенсорс ориентируемся на стек, так как решение планируем поддерживать, дописывать и переписывать.
Второй критерий - соответствие нашим требованиям к функционалу.

Из более-менее готовых решений можно выделить: ORY, Pomerium, Teleport. Каждый может оценить, что ему ближе. Нужно просто сразу принять, что на второй год эксплуатации всё придется поменять и переписать.

Поддержка MVP Функционала

Установка mTLS соединения

В целом достаточно несложная задача, некоторые решения умеют из коробки, некоторые придется дописать. 

Корректное проксирование соединения

Так как наша прокси стоит вразрез, к ней предъявляются высокие требования к стабильности. Также большое внимание нужно уделить процессу перевоза админок за нашу прокси. Разбрем на примере:

Существующая админка использует самописную систему авторизации и аутентификации пользователей. Пользователь идет в самописную систему, авторизуется в ней, она ставит ему HTTP заголовки и куки, после чего админка пользователя пропускает. При перевозе на единую OIDC это создает проблему - админка ждет определенные заголовки от пользователя, иначе его просто не пустит. Поэтому нам необходимо реализовать доработки на нашем едином OIDC и на нашей прокси, чтобы они прокидывали те заголовки, которые админка ожидает. Возможно, со стороны админки также потребуются доработки, но нам нужно свести их к минимуму. Это очень важный момент - чем легче ресурсу переехать на zt, тем быстрее и проще пройдет переезд других ресурсов, а в последствии и всей компании. В идеале мы должны сделать схему более удобной, чем она была. Пользователи получат удобство в доступе и работе, а мы получим более безопасную и технически зрелую инфраструктуру.

Взаимодействие с Certification Authority, OIDC, Системой принятия решений

Взаимодействие с CA реализуется в рамках задачи по mTLS соединению, с ней сложностей возникнуть не должно. 

С OIDC также - после проверки устройства мы должны редиректить пользователя на страницу ввода его логина и пароля / второго фактора, после чего корректно это обрабатывать и хранить его сессию.

Взаимодействие с Системой принятия решений. В СПР мы заложим функционал по анализу степени защищенности устройства, установки к ним требованиям и управления этими сущностями. На ней остановимся подробнее в следующих материалах, главное что отметим для себя тут - СПР должно иметь API, по которому прокси будет его опрашивать, а сама прокси должна поддерживать механизм кеширования, чтобы на каждый запрос пользователя не дергать СПР.  Отмечу, что в рамках MVP мы только проектируем эту часть, самое решение “пускать/ не пускать” пока что будет приниматься на уровне наличия и доверия сертификату.

Следующие шаги. Post MVP

Даже в процессе MVP после подключения нескольких админок у нас уже будет расти и множиться спискок функций, которые нам понадобятся. Перечислю и прокомментирую некоторые из них:

  • Поддержка не-HTTP протоколов. Было бы круто, если бы мы ходили админить наши сервера по ssh с zt функционалом - проверка устройства, единая удобная авторизация и так далее.

  • Разрыв соединения в реальном времени. При инциденте или выходе нового 0day в Chrome мы хотим понижать уровень доверия устройств и разрывать их соединение с админками.

  • Гранулярная настройка маршрутов внутри приложения позволит нам быстро и удобно подключать legacy админки и на уровне zt  контролировать доступ к чувствительному функционалу внутри них.

  • Machine-2-machine. Это очевидная и очень важная вещь - почти в любую админку ходят не только люди, но и другие сервисы, и их тоже нужно как-то проверять и авторизовывать. Тема сильно пересекается с проблемой межсервисной аутентификации, интегрировать эти две технологии в одну - сложная и интересная задача.

  • Breaking glass. В некоторых случаях мы все-таки пускать non-compliant  клиентов к нашим ресурсам. А в некоторых ситуациях наша zt инфраструктура может дать сбой, и нам нужно дать возможность пользователям продолжить работу при сбое.

Прокси - постоянно растущий и изменяющейся сервис. Важно определить для себя, что мы хотим в первую очередь, реализовать это, обеспечить надежность, а потом продолжить развитие.

Комментарии (1)


  1. johndow
    18.06.2025 03:36

    Используем Pomerium. Не идеально, но неплохо в целом.