GrantForge

    Хранилища данных и движки запросов

    Агент Trino

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

    Агент Trino — системный контроль доступа с именем grantforge: coordinator спрашивает его о каждом каталоге, схеме, таблице, столбце, подпрограмме, свойстве сеанса и пользователе, которых касается запрос, а он отвечает по подписанным политикам сервиса данных trino. Trino с 470 по 478 работает на Java 23 или 24, а Trino 479 и новее — на Java 25, поэтому дистрибутив содержит два JAR, в каждом из которых зависимости перемещены внутрь:

    Trino JAR
    С 470 по 478 agents/trino/470/grantforge-agent-trino-470-<version>.jar
    479 и новее agents/trino/479/grantforge-agent-trino-479-<version>.jar

    Интеграционные тесты Testcontainers в репозитории запускают первый JAR в Trino 470 и 476, а второй — в 479 и 484. Это не сертифицирует все остальные версии. Плагин сервиса описан в разделе Trino.

    Как это работает

    • Каждая проверка решается в каждой области, которую она называет. Право на каталог, схему или таблицу распространяется на то, что внутри, поэтому агент решает столбец в его каталоге, схеме, таблице и в нём самом: запрет в любой из них отклоняет, разрешение в любой из них предоставляет.
    • Списки не показывают того, что использовать нельзя. SHOW CATALOGS, SHOW SCHEMAS, SHOW TABLES, SHOW FUNCTIONS, information_schema и метаданные драйвера показывают только то, что пользователь может использовать или внутри чего может что-то использовать.
    • То, что описывает данные, остаётся открытым. information_schema каждого каталога, схемы jdbc и metadata каталога system, которые читают JDBC-драйверы и BI-инструменты, и встроенные функции Trino не требуют политик; их строки фильтруются так же, как списки.
    • Строки фильтруются, столбцы маскируются. Политики фильтрации строк применяются к каждому запросу, читающему таблицу, а маски подгоняются под тип столбца, чтобы маска никогда не ломала запрос: текстовые маски применяются к столбцам varchar и char и приводятся обратно к типу столбца, маска года — к датам и меткам времени, пользовательское выражение приводится к типу, а любой другой столбец, названный текстовой маской, читается как NULL своего типа.
    • Имперсонация и чужие запросы подчиняются политикам. Выполнение запроса от имени другого пользователя требует impersonate на этого пользователя; просмотр или завершение чужих запросов — view_query или kill_query на него. Любой может выполнять запросы, а также видеть и завершать свои.
    • Отказы объясняют причину. Клиент получает Access Denied: alice may not select hive.sales.orders.card: GrantForge policy 6 denies it, либо что ни одна политика этого не разрешает, либо что политик ещё нет.
    • Решения кэшируются, доступы объединяются. Решения текущего снимка кэшируются, по умолчанию 100 000 на 10 секунд, а новый снимок начинает с нуля. Одинаковые разрешённые доступы в пределах окна, по умолчанию 10 секунд, сообщаются одним событием доступа с указанием их числа; отказы сообщаются по одному и сразу. Каждое событие называет запрос.
    • Привилегии принадлежат GrantForge. Операторы Trino GRANT, REVOKE, DENY и операторы ролей отклоняются, так как политики управляются в GrantForge.
    Оператор Нужный доступ
    SELECT select на каждый читаемый столбец; запрос без чтения столбцов, например count(*), — на таблицу
    INSERT, DELETE, TRUNCATE insert; delete для двух других
    UPDATE update на каждый записываемый столбец
    CREATE SCHEMA, CREATE TABLE, CREATE VIEW, CREATE MATERIALIZED VIEW create на создаваемый объект
    DROP схемы, таблицы, представления или материализованного представления drop на него
    ALTER таблицы, представления или столбца, COMMENT, SET PROPERTIES, SET AUTHORIZATION, ALTER TABLE ... EXECUTE alter на него
    Переименование схемы, таблицы, представления или материализованного представления alter на него и create на новое имя
    REFRESH MATERIALIZED VIEW insert на него
    Представление, выполняемое от имени владельца Владельцу нужны select на читаемые столбцы и execute на функции
    SHOW SCHEMAS, SHOW TABLES, SHOW COLUMNS, SHOW FUNCTIONS, SHOW CREATE Любой доступ к объекту или внутри него
    CREATE CATALOG, DROP CATALOG create или drop на каталог
    Вызов функции; CREATE FUNCTION, DROP FUNCTION execute; create_function, drop_function на функцию
    CALL execute на процедуру
    SET SESSION set на свойство сеанса каталога или системы
    Выполнение от имени другого пользователя, просмотр или завершение чужих запросов impersonate, view_query, kill_query на пользователя
    Чтение или запись системной информации: узлов, статистики и дампов потоков из REST API и веб-интерфейса Trino read или write на system_information

    Начиная с Trino 479 второй JAR проверяет и ветки таблиц: для их просмотра нужно видеть таблицу, а создание, удаление или перемотка ветки требует alter на таблицу; обновление представления и смена владельца или комментария материализованного представления требуют alter на него.

    Развёртывание

    1. Добавьте сервис данных trino и настройте его политики. Откройте Права доступа к данным → Агенты, выберите сервис и выпустите токен агента. Он показывается один раз; сохраните его в файле, доступном для чтения только учётной записи Trino.

    2. Скопируйте JAR, соответствующий версии coordinator, в отдельный каталог внутри каталога плагинов Trino, например /usr/lib/trino/plugin/grantforge/. Доступ проверяет только coordinator; worker ничего не нужно.

    3. Создайте на coordinator файл etc/access-control.properties, заменив адрес, пути и имя экземпляра из примера:

      access-control.name=grantforge
      grantforge.server.url=https://grantforge.example.com
      grantforge.token.file=/etc/trino/grantforge.token
      grantforge.instance=coordinator-1
      grantforge.cache.dir=/var/lib/trino/grantforge-cache

      Каталог кэша должен быть доступен для записи учётной записи Trino. GrantForge заменяет файловый или иной контроль доступа Trino, а не работает рядом с ним.

    4. Перезапустите coordinator. Пока агент не получит первый снимок, запросы отклоняются, кроме того, что описывает данные.

    5. Сначала перенесите существующие правила: правила файлового контроля доступа Trino больше не действуют. Заранее создайте соответствующие политики.

    Параметр Назначение
    grantforge.server.url, grantforge.token.file, grantforge.instance, grantforge.cache.dir Обязательные: сервер GrantForge, файл токена агента, имя этого coordinator и доступный для записи каталог для подписанного снимка и буферизованных событий
    grantforge.signing.key.file Необязательный файл, закрепляющий ключ подписи снимков; скопируйте открытый ключ Ed25519 X.509 в Base64 со страницы «Агенты». Если не указан, ключ запрашивается у сервера при первом обращении
    grantforge.connect.timeout.ms, grantforge.read.timeout.ms Тайм-ауты соединения и чтения GrantForge, по умолчанию 5000 / 8000 миллисекунд
    grantforge.refresh.interval.ms Как часто агент запрашивает новые политики, по умолчанию 30000, не менее 1000 миллисекунд
    grantforge.audit.batch.size, grantforge.audit.queue.capacity, grantforge.audit.flush.interval.ms, grantforge.audit.spool.limit.bytes События доступа: размер пакета (по умолчанию 500), размер очереди (по умолчанию 10000), интервал отправки (по умолчанию 5000 миллисекунд) и предел буфера на диске (по умолчанию 64 МиБ)
    grantforge.audit.fold.window.ms Как долго одинаковые разрешённые доступы объединяются в одно событие, по умолчанию 10000, до 3600000 миллисекунд; 0 сообщает каждый
    grantforge.decision.cache.size, grantforge.decision.cache.ttl.ms Наибольшее число кэшируемых решений, по умолчанию 100000, до 10000000, 0 — без кэша; и как долго, по умолчанию 10000, 1..3600000 миллисекунд

    Пользователи, группы и роли

    Политики называют пользователя сеанса запроса — такого, каким его даёт Trino после аутентификации и сопоставления пользователей. Группы — те, что даёт пользователю поставщик групп Trino, вместе с группами, в которые пользователя помещает GrantForge; роли — те, что даёт пользователю GrantForge.

    Решения и ограничения

    • Без пригодного снимка отклоняется всё, кроме того, что описывает данные, выполнения запросов и собственных запросов. Неиспользуемый сервис оставляет Trino без проверок, как без контроля доступа; операторы привилегий и ролей Trino всё равно отклоняются.
    • Токен, привязанный к сервису, тип которого не trino, отклоняет всё.
    • Trino прежде всего спрашивает, может ли пользователь вообще использовать каталог: пользователь без прав в каталоге получает собственное сообщение Trino Cannot access catalog.
    • SELECT, читающий столбец, который пользователю читать нельзя, отклоняется с указанием первого такого столбца; столбцы не удаляются из результата.
    • Trino не записывает в таблицу, столбцы которой маскирует для пользователя: такой INSERT завершается ошибкой, пока действует маска.
    • Маска приводится к типу столбца, поэтому ограниченный varchar показывает столько маскированного значения, сколько помещается, например 3 символа хеша в varchar(3).
    • Фильтр строк или маска, которые снимок не может прочитать, не показывают строк или показывают столбец как NULL вместо данных.
    • Решения кэшируются на grantforge.decision.cache.ttl.ms, поэтому срок действия политики начинается или заканчивается с опозданием до этого времени.

    Связанные руководства

    Редактировать эту страницу на GitHub