Агент 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 на него.
Развёртывание
-
Добавьте сервис данных
trinoи настройте его политики. Откройте Права доступа к данным → Агенты, выберите сервис и выпустите токен агента. Он показывается один раз; сохраните его в файле, доступном для чтения только учётной записи Trino. -
Скопируйте JAR, соответствующий версии coordinator, в отдельный каталог внутри каталога плагинов Trino, например
/usr/lib/trino/plugin/grantforge/. Доступ проверяет только coordinator; worker ничего не нужно. -
Создайте на 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, а не работает рядом с ним.
-
Перезапустите coordinator. Пока агент не получит первый снимок, запросы отклоняются, кроме того, что описывает данные.
-
Сначала перенесите существующие правила: правила файлового контроля доступа 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, поэтому срок действия политики начинается или заканчивается с опозданием до этого времени.
