Der Trino-Agent ist eine Systemzugriffskontrolle namens grantforge: Der Coordinator fragt ihn zu jedem Katalog, Schema, jeder Tabelle, Spalte, Routine, Sitzungseigenschaft und jedem Benutzer, den eine Abfrage berührt, und er antwortet aus den signierten Richtlinien des trino-Datendiensts. Trino 470 bis 478 laufen auf Java 23 oder 24 und Trino 479 und neuer auf Java 25, daher liefert die Distribution zwei JARs, jedes mit seinen Abhängigkeiten eingebettet und verschoben:
| Trino | JAR |
|---|---|
| 470 bis 478 | agents/trino/470/grantforge-agent-trino-470-<version>.jar |
| 479 und neuer | agents/trino/479/grantforge-agent-trino-479-<version>.jar |
Die Testcontainers-Integrationstests des Repositorys führen das erste JAR in Trino 470 und 476 aus und das zweite in 479 und 484. Das zertifiziert nicht jede andere Version. Das Dienst-Plug-in beschreibt Trino.
Funktionsweise
- Jede Prüfung wird in jedem Geltungsbereich entschieden, den sie nennt. Eine Berechtigung auf einem Katalog, Schema oder einer Tabelle umfasst, was darin liegt, daher entscheidet der Agent eine Spalte in ihrem Katalog, ihrem Schema, ihrer Tabelle und bei sich selbst: Eine Verweigerung in einem davon lehnt ab, eine Erlaubnis in einem davon gewährt.
- Auflistungen lassen weg, was nicht verwendet werden darf.
SHOW CATALOGS,SHOW SCHEMAS,SHOW TABLES,SHOW FUNCTIONS,information_schemaund die Metadaten des Treibers zeigen nur, was der Benutzer verwenden darf oder worin er etwas verwenden darf. - Was Daten beschreibt, bleibt offen. Das
information_schemajedes Katalogs, die Schemasjdbcundmetadatades Katalogssystem, die JDBC-Treiber und BI-Werkzeuge lesen, und Trinos eingebaute Funktionen brauchen keine Richtlinie; ihre Zeilen werden wie Auflistungen gefiltert. - Zeilen werden gefiltert und Spalten maskiert. Zeilenfilterrichtlinien gelten für jede Abfrage, die die Tabelle liest, und Masken werden an den Typ der Spalte angepasst, damit eine Maske nie eine Abfrage bricht: Textmasken gelten für
varchar- undchar-Spalten und werden zurück in den Typ der Spalte umgewandelt, die Jahresmaske für Datums- und Zeitstempelwerte, ein eigener Ausdruck wird in den Typ umgewandelt, und jede andere Spalte, die eine Textmaske nennt, liest sich alsNULLihres Typs. - Identitätswechsel und fremde Abfragen unterliegen Richtlinien. Eine Abfrage als anderer Benutzer braucht
impersonateauf diesem Benutzer; die Abfragen eines anderen Benutzers zu sehen oder abzubrechen brauchtview_queryoderkill_queryauf ihm. Jeder darf Abfragen ausführen und seine eigenen sehen und abbrechen. - Ablehnungen sagen, warum. Der Client erhält
Access Denied: alice may not select hive.sales.orders.card: GrantForge policy 6 denies it, oder dass keine Richtlinie es erlaubt oder noch keine Richtlinien gekommen sind. - Entscheidungen werden behalten und Zugriffe zusammengefasst. Die Entscheidungen des aktuellen Snapshots werden behalten, standardmäßig 100.000 für 10 Sekunden, und ein neuer Snapshot beginnt von vorn. Gleiche erlaubte Zugriffe innerhalb eines Fensters, standardmäßig 10 Sekunden, werden als ein Zugriffsereignis gemeldet, das sagt, wie viele es waren; Ablehnungen werden einzeln und sofort gemeldet. Jedes Ereignis nennt die Abfrage.
- Berechtigungen gehören GrantForge. Trinos
GRANT,REVOKE,DENYund Rollenanweisungen werden abgelehnt, da Richtlinien in GrantForge verwaltet werden.
| Anweisung | Benötigter Zugriff |
|---|---|
SELECT |
select auf jeder gelesenen Spalte; eine Abfrage, die keine Spalte liest, etwa count(*), auf der Tabelle |
INSERT, DELETE, TRUNCATE |
insert; delete für die beiden anderen |
UPDATE |
update auf jeder geschriebenen Spalte |
CREATE SCHEMA, CREATE TABLE, CREATE VIEW, CREATE MATERIALIZED VIEW |
create auf dem, was angelegt wird |
DROP eines Schemas, einer Tabelle, Sicht oder materialisierten Sicht |
drop darauf |
ALTER einer Tabelle, Sicht oder Spalte, COMMENT, SET PROPERTIES, SET AUTHORIZATION, ALTER TABLE ... EXECUTE |
alter darauf |
| Umbenennen eines Schemas, einer Tabelle, Sicht oder materialisierten Sicht | alter darauf und create auf dem neuen Namen |
REFRESH MATERIALIZED VIEW |
insert darauf |
| Eine Sicht, die ihr Eigentümer ausführt | Ihr Eigentümer braucht select auf den Spalten und execute auf den Funktionen, die sie liest |
SHOW SCHEMAS, SHOW TABLES, SHOW COLUMNS, SHOW FUNCTIONS, SHOW CREATE |
Irgendein Zugriff darauf oder darin |
CREATE CATALOG, DROP CATALOG |
create oder drop auf dem Katalog |
Eine Funktion aufrufen; CREATE FUNCTION, DROP FUNCTION |
execute; create_function, drop_function auf der Funktion |
CALL |
execute auf der Prozedur |
SET SESSION |
set auf der Sitzungseigenschaft des Katalogs oder des Systems |
| Als anderer Benutzer ausführen, fremde Abfragen sehen oder abbrechen | impersonate, view_query, kill_query auf dem Benutzer |
| Systeminformationen lesen oder schreiben: Knoten, Statistiken und Thread-Dumps der REST-API und Weboberfläche von Trino | read oder write auf system_information |
Ab Trino 479 prüft das zweite JAR auch Tabellen-Branches: Sie aufzulisten braucht, die Tabelle sehen zu dürfen, und einen anzulegen, zu löschen oder vorzuspulen braucht alter auf ihr; eine Sicht zu aktualisieren und Eigentümer oder Kommentar einer materialisierten Sicht zu ändern braucht alter darauf.
Bereitstellung
-
Fügen Sie einen
trino-Datendienst hinzu und konfigurieren Sie seine Richtlinien. Öffnen Sie Datenberechtigungen → Agenten, wählen Sie den Dienst und stellen Sie ein Agent-Token aus. Es wird nur einmal angezeigt; legen Sie es in einer Datei ab, die nur Trinos Konto lesen kann. -
Kopieren Sie das JAR zur Version des Coordinators in ein eigenes Verzeichnis in Trinos Plug-in-Verzeichnis, etwa
/usr/lib/trino/plugin/grantforge/. Nur der Coordinator prüft Zugriffe; die Worker brauchen nichts. -
Legen Sie auf dem Coordinator
etc/access-control.propertiesan und ersetzen Sie Beispieladresse, Pfade und Instanznamen: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-cacheDas Cache-Verzeichnis muss für Trinos Konto beschreibbar sein. GrantForge ersetzt Trinos dateibasierte oder andere Zugriffskontrolle, statt neben ihr zu laufen.
-
Starten Sie den Coordinator neu. Bis der Agent seinen ersten Snapshot hat, werden Abfragen abgelehnt, außer für das, was Daten beschreibt.
-
Vorhandene Regeln zuerst übertragen: Die Regeln von Trinos dateibasierter Zugriffskontrolle gelten nicht mehr. Legen Sie vorher passende Richtlinien an.
| Einstellung | Zweck |
|---|---|
grantforge.server.url, grantforge.token.file, grantforge.instance, grantforge.cache.dir |
Erforderlich: der GrantForge-Server, die Datei des Agent-Tokens, ein Name für diesen Coordinator und ein beschreibbares Verzeichnis für den signierten Snapshot und zwischengespeicherte Ereignisse |
grantforge.signing.key.file |
Optionale Datei, die den Signaturschlüssel der Snapshots festlegt; kopieren Sie den Base64-kodierten X.509-Ed25519-Public-Key von der Seite Agenten. Ohne sie wird der Schlüssel beim ersten Kontakt vom Server geholt |
grantforge.connect.timeout.ms, grantforge.read.timeout.ms |
Verbindungs- und Lese-Timeout zu GrantForge, Standard 5000 / 8000 Millisekunden |
grantforge.refresh.interval.ms |
Wie oft der Agent nach neuen Richtlinien fragt, Standard 30000, mindestens 1000 Millisekunden |
grantforge.audit.batch.size, grantforge.audit.queue.capacity, grantforge.audit.flush.interval.ms, grantforge.audit.spool.limit.bytes |
Zugriffsereignisse: Batchgröße (Standard 500), Warteschlangengröße (Standard 10000), Sendeintervall (Standard 5000 Millisekunden) und Spool-Grenze (Standard 64 MiB) |
grantforge.audit.fold.window.ms |
Wie lange gleiche erlaubte Zugriffe zu einem Ereignis zusammengefasst werden, Standard 10000, bis 3600000 Millisekunden; 0 meldet jeden |
grantforge.decision.cache.size, grantforge.decision.cache.ttl.ms |
Die meisten behaltenen Entscheidungen, Standard 100000, bis 10000000, 0 behält keine; und wie lange, Standard 10000, 1..3600000 Millisekunden |
Benutzer, Gruppen und Rollen
Richtlinien nennen den Sitzungsbenutzer der Abfrage, wie Trino ihn nach Authentifizierung und Benutzerzuordnung gibt. Gruppen sind die, die Trinos Gruppenanbieter dem Benutzer gibt, zusammen mit den Gruppen, in die GrantForge den Benutzer stellt; Rollen sind die, die GrantForge dem Benutzer gibt.
Entscheidungen und Grenzen
- Ohne verwendbaren Snapshot wird alles abgelehnt außer dem, was Daten beschreibt, dem Ausführen von Abfragen und den eigenen Abfragen. Ein nicht verwendeter Dienst lässt Trino ungeprüft, wie ohne Zugriffskontrolle; Trinos Berechtigungs- und Rollenanweisungen werden trotzdem abgelehnt.
- Ein Token, das an einen Dienst gebunden ist, dessen Typ nicht
trinoist, lehnt alles ab. - Trino fragt vor allem anderen, ob ein Benutzer einen Katalog überhaupt verwenden darf: Ein Benutzer ohne Berechtigung in einem Katalog erhält Trinos eigenes
Cannot access catalog. - Ein
SELECT, das eine Spalte liest, die der Benutzer nicht lesen darf, wird abgelehnt und nennt die erste solche Spalte; Spalten werden nicht aus dem Ergebnis entfernt. - Trino schreibt keine Tabelle, deren Spalten es für den Benutzer maskiert: Ein solches
INSERTschlägt fehl, solange die Maske gilt. - Eine Maske wird in den Typ der Spalte umgewandelt, daher zeigt ein begrenztes
varcharso viel vom maskierten Wert, wie hineinpasst, etwa 3 Zeichen eines Hashes invarchar(3). - Ein Zeilenfilter oder eine Maske, die der Snapshot nicht lesen kann, zeigt keine Zeilen bzw. die Spalte als
NULLstatt der Daten. - Entscheidungen werden für
grantforge.decision.cache.ttl.msbehalten, daher beginnt oder endet die Gültigkeit einer Richtlinie bis zu so viel später.
