El agente de Trino es un control de acceso del sistema llamado grantforge: el coordinator le pregunta por cada catálogo, esquema, tabla, columna, rutina, propiedad de sesión y usuario que toca una consulta, y responde a partir de las políticas firmadas del servicio de datos trino. Trino 470 a 478 se ejecutan sobre Java 23 o 24 y Trino 479 y posteriores sobre Java 25, por lo que la distribución incluye dos JAR, cada uno con sus dependencias reubicadas dentro:
| Trino | JAR |
|---|---|
| 470 a 478 | agents/trino/470/grantforge-agent-trino-470-<version>.jar |
| 479 y posteriores | agents/trino/479/grantforge-agent-trino-479-<version>.jar |
Las pruebas de integración con Testcontainers del repositorio ejecutan el primer JAR dentro de Trino 470 y 476 y el segundo dentro de 479 y 484. Esto no certifica todas las demás versiones. Vea Trino para el plug-in de servicio.
Funcionamiento
- Cada comprobación se decide en cada ámbito que nombra. Un permiso sobre un catálogo, esquema o tabla cubre lo que contiene, así que el agente decide una columna en su catálogo, su esquema, su tabla y ella misma: una denegación en cualquiera de ellos rechaza, una autorización en cualquiera de ellos concede.
- Los listados omiten lo que no se puede usar.
SHOW CATALOGS,SHOW SCHEMAS,SHOW TABLES,SHOW FUNCTIONS,information_schemay los metadatos del controlador muestran solo lo que el usuario puede usar, o dentro de lo cual puede usar algo. - Lo que describe los datos queda abierto. El
information_schemade cada catálogo, los esquemasjdbcymetadatadel catálogosystem, que leen los controladores JDBC y las herramientas de BI, y las funciones integradas de Trino no necesitan política; sus filas se filtran como los listados. - Se filtran filas y se enmascaran columnas. Las políticas de filtrado de filas se aplican a cada consulta que lee la tabla, y las máscaras se ajustan al tipo de la columna, para que una máscara nunca rompa una consulta: las máscaras de texto se aplican a columnas
varcharychary se convierten de vuelta al tipo de la columna, la máscara de año a fechas y marcas de tiempo, una expresión personalizada se convierte al tipo, y cualquier otra columna que nombre una máscara de texto se lee como unNULLde su tipo. - La suplantación y las consultas ajenas están sujetas a políticas. Ejecutar una consulta como otro usuario requiere
impersonatesobre ese usuario; ver o terminar las consultas de otro usuario requiereview_queryokill_querysobre él. Cualquiera puede ejecutar consultas, y ver y terminar las suyas. - Los rechazos dicen por qué. El cliente recibe
Access Denied: alice may not select hive.sales.orders.card: GrantForge policy 6 denies it, o que ninguna política lo permite, o que aún no llegaron políticas. - Las decisiones se conservan y los accesos se agrupan. Las decisiones de la instantánea actual se conservan, por defecto 100 000 durante 10 segundos, y una nueva instantánea empieza de cero. Los accesos permitidos idénticos dentro de una ventana, por defecto 10 segundos, se informan como un único evento de acceso que indica cuántos hubo; los rechazos se informan uno a uno y de inmediato. Cada evento nombra la consulta.
- Los privilegios son de GrantForge. Las sentencias
GRANT,REVOKE,DENYy de roles de Trino se rechazan, ya que las políticas se gestionan en GrantForge.
| Sentencia | Acceso necesario |
|---|---|
SELECT |
select sobre cada columna leída; una consulta que no lee ninguna columna, como count(*), sobre la tabla |
INSERT, DELETE, TRUNCATE |
insert; delete para las otras dos |
UPDATE |
update sobre cada columna escrita |
CREATE SCHEMA, CREATE TABLE, CREATE VIEW, CREATE MATERIALIZED VIEW |
create sobre lo que se crea |
DROP de un esquema, tabla, vista o vista materializada |
drop sobre él |
ALTER de una tabla, vista o columna, COMMENT, SET PROPERTIES, SET AUTHORIZATION, ALTER TABLE ... EXECUTE |
alter sobre él |
| Renombrar un esquema, tabla, vista o vista materializada | alter sobre él y create sobre el nuevo nombre |
REFRESH MATERIALIZED VIEW |
insert sobre ella |
| Una vista que ejecuta su propietario | Su propietario necesita select sobre las columnas y execute sobre las funciones que lee |
SHOW SCHEMAS, SHOW TABLES, SHOW COLUMNS, SHOW FUNCTIONS, SHOW CREATE |
Cualquier acceso a él o dentro de él |
CREATE CATALOG, DROP CATALOG |
create o drop sobre el catálogo |
Llamar a una función; CREATE FUNCTION, DROP FUNCTION |
execute; create_function, drop_function sobre la función |
CALL |
execute sobre el procedimiento |
SET SESSION |
set sobre la propiedad de sesión del catálogo o del sistema |
| Ejecutar como otro usuario, ver o terminar consultas ajenas | impersonate, view_query, kill_query sobre el usuario |
| Leer o escribir la información del sistema: nodos, estadísticas y volcados de hilos de la API REST y la interfaz web de Trino | read o write sobre system_information |
Desde Trino 479, el segundo JAR también comprueba las ramas de tabla: listarlas requiere ver la tabla, y crear, eliminar o avanzar una requiere alter sobre ella; refrescar una vista y cambiar el propietario o el comentario de una vista materializada requieren alter sobre ella.
Despliegue
-
Añada un servicio de datos
trinoy configure sus políticas. Abra Permisos sobre los datos → Agentes, seleccione el servicio y emita un token de agente. Solo se muestra una vez; guárdelo en un archivo que solo pueda leer la cuenta de Trino. -
Copie el JAR de la versión del coordinator en un directorio propio dentro del directorio de plug-ins de Trino, como
/usr/lib/trino/plugin/grantforge/. Solo el coordinator comprueba el acceso; los workers no necesitan nada. -
Cree
etc/access-control.propertiesen el coordinator, sustituyendo la dirección, las rutas y el nombre de instancia de ejemplo: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-cacheEl directorio de caché debe poder escribirlo la cuenta de Trino. GrantForge sustituye el control de acceso basado en archivos u otro de Trino en lugar de ejecutarse junto a él.
-
Reinicie el coordinator. Hasta que el agente tenga su primera instantánea, las consultas se rechazan, salvo lo que describe los datos.
-
Migre primero las reglas existentes: las reglas del control de acceso basado en archivos de Trino dejan de aplicarse. Cree antes las políticas equivalentes.
| Ajuste | Propósito |
|---|---|
grantforge.server.url, grantforge.token.file, grantforge.instance, grantforge.cache.dir |
Obligatorios: el servidor GrantForge, el archivo del token de agente, un nombre para este coordinator y un directorio escribible para la instantánea firmada y los eventos en cola |
grantforge.signing.key.file |
Archivo opcional que fija la clave de firma de las instantáneas; copie la clave pública Ed25519 X.509 codificada en Base64 desde la página Agentes. Si se omite, la clave se obtiene del servidor en el primer contacto |
grantforge.connect.timeout.ms, grantforge.read.timeout.ms |
Tiempos de espera de conexión y lectura hacia GrantForge, por defecto 5000 / 8000 milisegundos |
grantforge.refresh.interval.ms |
Con qué frecuencia el agente pide nuevas políticas, por defecto 30000, al menos 1000 milisegundos |
grantforge.audit.batch.size, grantforge.audit.queue.capacity, grantforge.audit.flush.interval.ms, grantforge.audit.spool.limit.bytes |
Eventos de acceso: tamaño de lote (por defecto 500), tamaño de cola (por defecto 10000), intervalo de envío (por defecto 5000 milisegundos) y límite del búfer en disco (por defecto 64 MiB) |
grantforge.audit.fold.window.ms |
Durante cuánto tiempo se agrupan en un evento los accesos permitidos idénticos, por defecto 10000, hasta 3600000 milisegundos; 0 informa cada uno |
grantforge.decision.cache.size, grantforge.decision.cache.ttl.ms |
El máximo de decisiones conservadas, por defecto 100000, hasta 10000000, 0 no conserva ninguna; y durante cuánto tiempo, por defecto 10000, 1..3600000 milisegundos |
Usuarios, grupos y roles
Las políticas nombran al usuario de sesión de la consulta, tal como Trino lo da tras la autenticación y la asignación de usuarios. Los grupos son los que el proveedor de grupos de Trino da al usuario, junto con los grupos en los que GrantForge lo coloca; los roles son los que GrantForge le da.
Decisiones y limitaciones
- Sin una instantánea utilizable, todo se rechaza salvo lo que describe los datos, ejecutar consultas y las consultas propias. Un servicio que no está en uso deja Trino sin comprobar, como sin control de acceso; las sentencias de privilegios y roles de Trino se rechazan igualmente.
- Un token vinculado a un servicio cuyo tipo no es
trinolo rechaza todo. - Trino pregunta antes que nada si un usuario puede usar un catálogo: un usuario sin ningún permiso en un catálogo recibe el
Cannot access catalogpropio de Trino. - Un
SELECTque lee una columna que el usuario no puede leer se rechaza, nombrando la primera de esas columnas; las columnas no se quitan del resultado. - Trino no escribe en ninguna tabla cuyas columnas enmascara para el usuario: un
INSERTasí falla mientras la máscara se aplique. - Una máscara se convierte al tipo de la columna, así que un
varcharacotado muestra lo que quepa del valor enmascarado, como 3 caracteres de un hash envarchar(3). - Un filtro de filas o una máscara que la instantánea no puede leer no muestra filas, o muestra la columna como
NULL, en lugar de los datos. - Las decisiones se conservan durante
grantforge.decision.cache.ttl.ms, así que el periodo de validez de una política empieza o termina hasta ese tiempo después.
