Привет, Хабр! Меня зовут Даниил Пасечник, в RWB я отвечаю за архитектуру управления пользовательского доступа в базы данных. В этой статье расскажу, как мы прошли путь от разрозненной, неконтролируемой выдачи доступов к БД до единого корпоративного процесса на базе Trino и Open Policy Agent — и почему это получилось не просто техническим решением, а полноценной кросс‑департаментной архитектурой.

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

Проблема, с которой всё началось

Когда мы начали разбираться, как устроен доступ к данным, картина была примерно такой:

  • Доступ к БД выдавался не гранулярно — фактически человек получал доступ сразу ко всей базе, а не к нужным ему таблицам или схемам;

  • Процесс отзыва доступа у сотрудника не был автоматизирован и зависел от ручной синхронизации между HR и отдельными инфраструктурными командами — это создавало операционные риски и требовало постоянного контроля;

  • Выдача нового доступа занимала от 1 до 17 дней, в среднем около 4 дней — пока заявка проходила все ручные согласования и локальное создание учётной записи;

  • Аудит того, кто и когда получил доступ и на каком основании, велся фрагментарно и не давал полной картины.

Мы проанализировали эти проблемы не изолированно, а в контексте потребностей бизнес‑подразделений — компания растёт, число проектов и команд, которым нужен доступ к данным, растёт вместе с ней, и с текущим процессом это просто не масштабировалось. Стало понятно: чинить это точечно бессмысленно, нужно закрывать проблему комплексно, на уровне единого централизованного процесса для всей компании.

Масштаб задачи: почему это невозможно сделать в одиночку

Прежде чем проектировать решение, были сформулированы требования, которым оно должно соответствовать:

  • Анонимный и парольный доступ к базам данных запрещён — только через единого провайдера идентификации.

  • Минимизация прав по умолчанию — доступ выдаётся ровно на то, что нужно, а не «с запасом».

  • Обязательный аудит операций — каждое действие с данными должно быть прослеживаемо, с обязательным логированием и хранением событий.

  • Цифровой след запроса доступа и его согласования — кто запросил, кто согласовал, когда и на каком основании.

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

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

Архитектура решения и как был организован процесс

В основе решения — простая идея: Trino как единая точка входа к данным, а OPA (Open Policy Agent) — как декларативный слой контроля доступа поверх неё. Вместо того, чтобы управлять правами внутри каждой отдельной СУБД, мы выносим всю логику доступа наружу, в политики, которые можно версионировать, тестировать и аудировать как обычный код.

Ключевые компоненты:

  • Trino Coordinator/Worker — принимает и исполняет запросы к данным.

  • OPA — на каждый запрос проверяет, разрешена ли операция политикой.

  • Keycloak — аутентификация пользователей через OIDC, без паролей и анонимного доступа.

  • Vault — хранение всех секретов и конфигураций.

  • S3 — длительное хранение событий безопасности.

  • Kafka — брокер сообщений для передачи событий безопасности в SOC.

  • Kubernetes — среда для всего этого хозяйства.

Главное, что мне хотелось получить от модели доступа, — чтобы она была понятной и однозначной, как код. 

Получилось так:

матрица доступов (group / catalog / owner / access / users)
        ↓  автогенерация
  Rego-политики
        ↓  CI/CD
  бандл в S3
        ↓
  OPA подхватывает без рестарта

Ожидаемая структура OPA-политики (grants / resources / operations / group)
Ожидаемая структура OPA‑политики (grants / resources / operations / group)

Технически гранулярность прав в OPA позволяет ограничивать доступ вплоть до отдельной колонки таблицы. На практике для большинства команд основным уровнем стал catalog / schema / table — этого достаточно для подавляющего большинства сценариев, а более тонкая настройка доступна там, где это действительно нужно.

Архитектуру и организацию процесса удалось закрыть своими силами, но реализация не была бы возможна без моего коллеги Максима Умнова, руководителя Rapid Response Team — на нём и его команде деплой, покрытие Trino по компании, а также постоянная поддержка сервиса. На сегодняшний день большая часть этих процессов уже автоматизирована.

Для полноты картины — вот как выглядит декомпозиция зон ответственности, к которой мы пришли:

Кто

За что отвечает

AI & Data Security

Идея, архитектура, дизайн процесса, организация

Core DevOps

Техническая реализация, деплой, автоматизация, поддержка

Отдел управления доступов

Владеет пространством OPA‑политик в GitLab, независимый надзор за политиками, ресертификация и актуализация владельцев групп/каталогов

SOC

Логирование и мониторинг событий Trino

Trust Safety (T&S)

Длительное хранение логов и их доставка

Как выглядит выдача доступа на практике

В рамках миграции на Trino мы выстроили три параллельных сценария выдачи доступа — под разные жизненные ситуации.

Базовые матрицы доступа для проекта. Команда описывает нужный доступ в виде матрицы (кто, к какому каталогу, с какими правами). К самой матрице мы подошли с «юзерфрендли» стороны: сформировали инструкцию и шаблон её заполнения, что позволило снизить вовлечённость бизнес‑подразделений и их трудозатраты.

Дальше всё происходит автоматически: запускаются два автотеста (проверка, что запрашиваются только согласованные операции из белого списка, и что группы не вложены друг в друга), после успешного прохождения MR согласовывается и мержится в основную ветку проекта. Управление ресурсами и гранулярность доступов ведётся строго на уровне проекта — это делает процесс независимым, снижает количество точек отказа и даёт полностью прозрачный аудит доступа в разрезе каждого проекта и команды.

Обработка матрицы доступа: от заявки в Service Desk до генерации data.json/owners.json
Обработка матрицы доступа: от заявки в Service Desk до генерации data.json/owners.json
Формирование и согласование OPA-политик на основе матрицы: DevOps → RepoOwner → CI/CD → merge в main
Формирование и согласование OPA‑политик на основе матрицы: DevOps → RepoOwner → CI/CD → merge в main

Точечная выдача доступа пользователю в существующую группу. Этот процесс ещё проще для конечного пользователя: от инициатора требуется только заявка через Service Desk и двухуровневое согласование (владелец каталога и руководитель инициатора), дальше бэкенд‑процессор вносит изменение в Rego‑политику — без ручного MR со стороны пользователя.

С нашей стороны — пост‑контроль изменений на уровне Git. Если доступ не согласован или в процессе запроса выявлено нарушение, поступает алерт, и в заявку точечно подключается коллега из команды RRT для ручного сопровождения. Контроль выдачи доступа строится не только на жёстко заданных параметрах матриц, но и на ряде компенсирующих контрольных процедур, включая ступенчатую эскалацию, где уровень L2 закрывается совместно командой DevOps и отделом управления доступа.

На практике около 92% заявок отрабатывается автоматикой в режиме 24/7/365, ручная вовлечённость минимальна — для сравнения, до внедрения этого процесса соотношение было обратным: около 80% нагрузки закрывалось вручную и лишь 20% — редкой точечной автоматикой.

Временный доступ. Для разовых задач — включая внутренние инциденты команд и срочную разработку — предусмотрен параллельный процесс с TTL от 24 до 72 часов и возможностью получения прав RO или RW. Заявка проходит через Service Desk и интегратор, который определяет владельца базы через Global Inventory, получает согласование руководителя инициатора и владельца БД, выдаёт учётные данные через PrivateBin и автоматически отзывает их по истечении срока действия учётной записи.

Бизнес‑логика процесса передана на сопровождение отделу управления доступа, а техническая реализация — команде RRT. Мы также ведём дашборды в реальном времени по всем БД, проектам и инициаторам заявок. Если видим постоянный перезапрос прямого доступа к БД и явное злоупотребление повышенными привилегиями, включаем сотрудника и его команду в точечный аудит — разбираем причину запроса и бизнес‑обоснование к нему в деталях.

На практике такое случается редко: мы проводим регулярные рассылки и держим фокус внимания пользователей на работе с доступом именно через Trino. Временный доступ используется как исключение и компромисс ИБ в сторону бизнеса.

Диаграмма последовательности: временный доступ к БД — от заявки до автоматического отзыва
Диаграмма последовательности: временный доступ к БД — от заявки до автоматического отзыва
C4-диаграмма контейнеров: временный доступ к БД через Service Desk
C4-диаграмма контейнеров: временный доступ к БД через Service Desk

Отзыв доступа и безопасность в моменте

Одна из проблем, которая раньше требовала постоянного ручного контроля, — отзыв доступа при увольнении сотрудника. Сейчас связка Trino и Keycloak синхронизирована с HR‑системой и отзывает доступ сотрудника автоматически и практически мгновенно, без участия человека в цепочке.

При этом сами OPA‑политики — не бесконтрольная зона. За ними следит отдельный независимый контур: отдел управления доступов, у которого есть возможность в экстренной ситуации изъять доступ буквально за считанные секунды, не дожидаясь стандартного цикла согласований.

Параллельно с этим весь трафик Trino проходит через event‑listener в Kafka и дальше в SOC, где настроены алерты на:

  • массовый перебор системного каталога (enumeration);

  • неавторизованные попытки изменения данных (DDL/DML);

  • аномальный всплеск запросов (DoS/abuse);

  • имперсонацию — работу от имени другого пользователя;

  • подозрительные или устаревшие клиенты подключения.

Готовых практик мониторинга Trino под наши задачи на рынке просто не существовало — правила алертинга я писал с нуля, опираясь на реальную эксплуатацию и собственные тесты. После того как логика была готова, совместно с SOC реализовали отдельный канал передачи событий: поскольку работа с данными порождает огромный объём логов, лог разделили на уровне Kafka, и SOC получает только ту часть, которая необходима для работы их правил — этого полностью достаточно для мониторинга и алертинга.

Модель эскалации инцидентов — это тоже отдельный управленческий результат, который мы построили сами: готовых наработок под Trino не существовало ни у нас, ни на рынке. Мы с нуля описали три уровня: L1 закрывается силами SOC в рамках их внутренних процессов, L2 — совместно командой DevOps и отделом управления доступа, а L3 подразумевает подключение DataSec к разбору инцидента и, при необходимости работы с полным логом, — обращение SOC к архиву в S3. На практике грамотно выстроенная последовательность действий позволяет пресекать несанкционированную активность ещё на уровне L1 и заметно реже — на L2.

Логи для расследований и форензики инцидентов хранятся в S3 длительный срок — условия и период хранения установлены в соответствии с рекомендацией надзорных органов и реализованы силами команды T&S. Все секреты — только в Vault, вся конфигурация — только через IaC, без возможности ручных правок на проде.

Бизнес‑эффект: было / стало

Главная метрика, которая для меня лично значит больше всего, — время выдачи доступа:

  • Было: в среднем ~4 дня, в диапазоне от 1 до 17 дней;

  • Стало: 3–10 минут — это время, за которое MR проходит проверку в Git.

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

Похожий контраст — и в скорости подключения новых команд целиком, а не только отдельных пользователей. Сегодня, если появляется новая команда или новый источник данных, мы разворачиваем для неё полную архитектуру доступа «по кнопке» и в течение одного рабочего дня предоставляем полностью рабочую инфраструктуру. Это позволяет бизнесу без простоя сосредоточиться на своих задачах, а весь технический бэкграунд — предоставление доступа, онбординг пользователей, мониторинг и алертинг на аномальную активность — остаётся на нашей стороне.

Результаты роста:

  • 1250+ кластеров PostgreSQL в проде подключено через Trino;

  • 700+ уникальных пользователей работают через систему ежедневно;

  • 90+ проектов компании подключено к Trino;

  • 45+ проектов используют процесс временного доступа.

Отчет автоматически обновляется, контроль внедрения trino в realtime

Дашборд «Статус по Trino»: 94 проекта, 1261 кластер PostgreSQL
Дашборд «Статус по Trino»: 94 проекта, 1261 кластер PostgreSQL

Поддержка и онбординг пользователей

Технология без поддержки живёт плохо, поэтому мы с самого начала выстраивали процесс не только для инженеров, но и для конечных пользователей:

  • Организовали единый канал поддержки Trino support, работающий 24/7/365.

  • Подготовили обучающие ролики для новых сотрудников.

  • Подробно описали процесс и собрали FAQ по частым вопросам.

  • Всё, что выходит за рамки типовых сценариев, эскалируется в Core DevOps через тот же канал поддержки.

Дашборд зрелости

Отдельно хочу рассказать про инструмент, который мы внедрили для прозрачности всего процесса, — дашборд зрелости в BI‑системе, с изолированным окружением и доступом на чтение для всех желающих.

Динамика подключения кластеров и проектов, статус настройки проектов по Trino

Дашборд показывает, какие проекты компании уже подключены к Trino, какие ещё нет, и какой у каждого проекта уровень «здоровья» — по сути, зрелости с точки зрения информационной безопасности. Это не просто красивая визуализация: инструмент даёт публичную мотивацию командам подключаться и позволяет нам контролировать исполнение задач по миграции без ручных напоминаний.

Итоги

Если подводить черту: мы проанализировали проблему и потребности бизнес‑подразделений, собрали команду с чёткой декомпозицией зон ответственности и спроектировали корпоративную архитектуру — а вместе с Максимом Умновым, командой RRT, а также другими командами Core DevOps мы реализовали её в кратчайшие сроки. В результате получился не костыль поверх старых процессов, а рабочий, прозрачный и удобный для пользователей бизнес‑процесс.

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

Спасибо за внимание!