L’agente Trino è un controllo degli accessi di sistema chiamato grantforge: il coordinator lo interroga su ogni catalogo, schema, tabella, colonna, routine, proprietà di sessione e utente che una query tocca, ed esso risponde dalle policy firmate del servizio dati trino. Trino da 470 a 478 gira su Java 23 o 24 e Trino 479 e successivi su Java 25, quindi la distribuzione fornisce due JAR, ciascuno con le dipendenze rilocate al suo interno:
| Trino | JAR |
|---|---|
| Da 470 a 478 | agents/trino/470/grantforge-agent-trino-470-<version>.jar |
| 479 e successivi | agents/trino/479/grantforge-agent-trino-479-<version>.jar |
I test di integrazione Testcontainers del repository eseguono il primo JAR in Trino 470 e 476 e il secondo in 479 e 484. Questo non certifica tutte le altre versioni. Vedete Trino per il plug-in di servizio.
Funzionamento
- Ogni controllo è deciso in ogni ambito che nomina. Un permesso su un catalogo, uno schema o una tabella copre ciò che contiene, quindi l’agente decide una colonna nel suo catalogo, nel suo schema, nella sua tabella e in sé stessa: un diniego in uno qualsiasi rifiuta, un consenso in uno qualsiasi concede.
- Gli elenchi omettono ciò che non si può usare.
SHOW CATALOGS,SHOW SCHEMAS,SHOW TABLES,SHOW FUNCTIONS,information_schemae i metadati del driver mostrano solo ciò che l’utente può usare, o in cui può usare qualcosa. - Ciò che descrive i dati resta aperto. L’
information_schemadi ogni catalogo, gli schemijdbcemetadatadel catalogosystem, letti dai driver JDBC e dagli strumenti di BI, e le funzioni integrate di Trino non richiedono policy; le loro righe sono filtrate come gli elenchi. - Le righe sono filtrate e le colonne mascherate. Le policy di filtro delle righe si applicano a ogni query che legge la tabella, e le maschere sono adattate al tipo della colonna, perché una maschera non rompa mai una query: le maschere di testo si applicano a colonne
varcharechare sono riconvertite al tipo della colonna, la maschera dell’anno a date e timestamp, un’espressione personalizzata è convertita al tipo, e ogni altra colonna nominata da una maschera di testo si legge come unNULLdel suo tipo. - L’impersonificazione e le query altrui sono sotto policy. Eseguire una query come un altro utente richiede
impersonatesu quell’utente; vedere o terminare le query di un altro utente richiedeview_queryokill_querysu di lui. Chiunque può eseguire query, e vedere e terminare le proprie. - I rifiuti dicono perché. Il client riceve
Access Denied: alice may not select hive.sales.orders.card: GrantForge policy 6 denies it, oppure che nessuna policy lo consente, o che non sono ancora arrivate policy. - Le decisioni sono conservate e gli accessi raggruppati. Le decisioni dello snapshot corrente sono conservate, per impostazione predefinita 100.000 per 10 secondi, e un nuovo snapshot riparte da zero. Gli accessi consentiti identici entro una finestra, per impostazione predefinita 10 secondi, sono segnalati come un unico evento di accesso che dice quanti erano; i rifiuti sono segnalati uno per uno, subito. Ogni evento nomina la query.
- I privilegi sono di GrantForge. Le istruzioni
GRANT,REVOKE,DENYe sui ruoli di Trino sono rifiutate, perché le policy si gestiscono in GrantForge.
| Istruzione | Accesso necessario |
|---|---|
SELECT |
select su ogni colonna letta; una query che non legge colonne, come count(*), sulla tabella |
INSERT, DELETE, TRUNCATE |
insert; delete per le altre due |
UPDATE |
update su ogni colonna scritta |
CREATE SCHEMA, CREATE TABLE, CREATE VIEW, CREATE MATERIALIZED VIEW |
create su ciò che si crea |
DROP di uno schema, una tabella, una vista o una vista materializzata |
drop su di esso |
ALTER di una tabella, vista o colonna, COMMENT, SET PROPERTIES, SET AUTHORIZATION, ALTER TABLE ... EXECUTE |
alter su di esso |
| Rinominare uno schema, una tabella, una vista o una vista materializzata | alter su di esso e create sul nuovo nome |
REFRESH MATERIALIZED VIEW |
insert su di essa |
| Una vista eseguita dal proprietario | Il proprietario ha bisogno di select sulle colonne e di execute sulle funzioni che legge |
SHOW SCHEMAS, SHOW TABLES, SHOW COLUMNS, SHOW FUNCTIONS, SHOW CREATE |
Un qualsiasi accesso all’oggetto o al suo contenuto |
CREATE CATALOG, DROP CATALOG |
create o drop sul catalogo |
Chiamare una funzione; CREATE FUNCTION, DROP FUNCTION |
execute; create_function, drop_function sulla funzione |
CALL |
execute sulla procedura |
SET SESSION |
set sulla proprietà di sessione del catalogo o del sistema |
| Eseguire come un altro utente, vedere o terminare query altrui | impersonate, view_query, kill_query sull’utente |
| Leggere o scrivere le informazioni di sistema: nodi, statistiche e dump dei thread dell’API REST e dell’interfaccia web di Trino | read o write su system_information |
Da Trino 479, il secondo JAR controlla anche i branch delle tabelle: elencarli richiede di vedere la tabella, e crearne, eliminarne o farne avanzare uno richiede alter su di essa; aggiornare una vista e cambiare proprietario o commento di una vista materializzata richiedono alter su di essa.
Distribuzione
-
Aggiungete un servizio dati
trinoe configuratene le policy. Aprite Permessi sui dati → Agenti, selezionate il servizio ed emettete un token dell’agente. Viene mostrato una sola volta; conservatelo in un file leggibile solo dall’account di Trino. -
Copiate il JAR della versione del coordinator in una directory propria nella directory dei plug-in di Trino, come
/usr/lib/trino/plugin/grantforge/. Solo il coordinator controlla gli accessi; i worker non hanno bisogno di nulla. -
Create
etc/access-control.propertiessul coordinator, sostituendo l’indirizzo, i percorsi e il nome di istanza di esempio: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-cacheLa directory della cache deve essere scrivibile dall’account di Trino. GrantForge sostituisce il controllo degli accessi basato su file o altro di Trino invece di affiancarlo.
-
Riavviate il coordinator. Finché l’agente non ha il primo snapshot, le query sono rifiutate, tranne ciò che descrive i dati.
-
Migrate prima le regole esistenti: le regole del controllo degli accessi basato su file di Trino non si applicano più. Create prima le policy corrispondenti.
| Impostazione | Scopo |
|---|---|
grantforge.server.url, grantforge.token.file, grantforge.instance, grantforge.cache.dir |
Obbligatorie: il server GrantForge, il file del token dell’agente, un nome per questo coordinator e una directory scrivibile per lo snapshot firmato e gli eventi in coda |
grantforge.signing.key.file |
File facoltativo che fissa la chiave di firma degli snapshot; copiate la chiave pubblica Ed25519 X.509 codificata in Base64 dalla pagina Agenti. Se omesso, la chiave viene ottenuta dal server al primo contatto |
grantforge.connect.timeout.ms, grantforge.read.timeout.ms |
Timeout di connessione e lettura verso GrantForge, predefiniti 5000 / 8000 millisecondi |
grantforge.refresh.interval.ms |
Ogni quanto l’agente chiede nuove policy, predefinito 30000, almeno 1000 millisecondi |
grantforge.audit.batch.size, grantforge.audit.queue.capacity, grantforge.audit.flush.interval.ms, grantforge.audit.spool.limit.bytes |
Eventi di accesso: dimensione del lotto (predefinita 500), dimensione della coda (predefinita 10000), intervallo di invio (predefinito 5000 millisecondi) e limite dello spool (predefinito 64 MiB) |
grantforge.audit.fold.window.ms |
Per quanto tempo gli accessi consentiti identici sono raggruppati in un evento, predefinito 10000, fino a 3600000 millisecondi; 0 segnala ciascuno |
grantforge.decision.cache.size, grantforge.decision.cache.ttl.ms |
Il massimo di decisioni conservate, predefinito 100000, fino a 10000000, 0 non ne conserva; e per quanto tempo, predefinito 10000, 1..3600000 millisecondi |
Utenti, gruppi e ruoli
Le policy nominano l’utente di sessione della query, come Trino lo fornisce dopo l’autenticazione e la mappatura degli utenti. I gruppi sono quelli che il provider di gruppi di Trino dà all’utente, insieme ai gruppi in cui GrantForge lo inserisce; i ruoli sono quelli che GrantForge gli assegna.
Decisioni e limiti
- Senza uno snapshot utilizzabile tutto è rifiutato tranne ciò che descrive i dati, l’esecuzione delle query e le proprie query. Un servizio non in uso lascia Trino senza controlli, come senza controllo degli accessi; le istruzioni su privilegi e ruoli di Trino sono comunque rifiutate.
- Un token legato a un servizio il cui tipo non è
trinorifiuta tutto. - Trino chiede prima di tutto se un utente può usare un catalogo: un utente senza permessi in un catalogo riceve il
Cannot access catalogdi Trino. - Una
SELECTche legge una colonna che l’utente non può leggere è rifiutata, nominando la prima di tali colonne; le colonne non vengono tolte dal risultato. - Trino non scrive in alcuna tabella di cui maschera colonne per l’utente: tale
INSERTfallisce finché la maschera si applica. - Una maschera è convertita al tipo della colonna, quindi un
varcharlimitato mostra quanto ci sta del valore mascherato, come 3 caratteri di un hash invarchar(3). - Un filtro delle righe o una maschera che lo snapshot non riesce a leggere non mostra righe, o mostra la colonna come
NULL, invece dei dati. - Le decisioni sono conservate per
grantforge.decision.cache.ttl.ms, quindi il periodo di validità di una policy inizia o finisce fino a quel tempo dopo.
