Der Kafka-Agent ist ein Autorisierer der Authorizer-API von Kafka, angegeben in authorizer.class.name: Broker und Controller fragen ihn zu jeder Anfrage, und er antwortet aus den signierten Richtlinien des kafka-Datendienstes. Die Distribution liefert ihn als ein Java-8-kompatibles JAR, agents/kafka/grantforge-agent-kafka-<version>.jar, mit eingebetteten, umbenannten Abhängigkeiten.
Die Testcontainers-Integrationstests des Repositorys führen das JAR in Kafka 3.7.2, 3.9.2, 4.1.2 und 4.3.1 aus, in KRaft-Knoten, die zugleich Broker und Controller sind. Das zertifiziert nicht jede andere Version. Das Dienst-Plug-in beschreibt Apache Kafka.
Funktionsweise
- Jede Anfrage wird geprüft. Für jede Ressource, die eine Anfrage berührt, fragt Kafka nach einer ACL-Operation; der Agent antwortet aus den Richtlinien, mit Kafkas Ressourcentypen als Ressourcenebenen und seinen Operationen als Zugriffsarten. Eine Ablehnung erreicht den Client als Kafkas eigener Fehler, etwa
TOPIC_AUTHORIZATION_FAILED. - Idempotente Producer brauchen nur ein Topic. Kafka lässt einen Producer ohne
idempotent_writeauf dem Cluster starten, wenn er in irgendein Topic schreiben darf, und fragt den Autorisierer danach. Der Agent antwortet aus den Richtlinien selbst: Ein erlaubteswriteauf einem beliebigen Topic zählt, eine Verweigerung nur in einer Richtlinie, die jedes Topic abdeckt. - Die Richtlinien erscheinen als ACLs.
kafka-acls --listunddescribeAclsder Admin-API zeigen die jetzt geltenden Richtlinien: einen Wert ohne Platzhalter als Literal-ACL, einen Wert wieorders*als Präfix-ACL und*als Kafkas Platzhalter; Benutzer alsUser:-Principals, Gruppen alsGroup:, Rollen alsRole:und die GruppepublicalsUser:*. Was ACLs nicht ausdrücken können, fehlt: andere Platzhalter, ausgeschlossene Werte, Einträge mit Bedingungen und die Einträge einer Richtlinie mit Ausnahmen davon. Das Anlegen oder Löschen von ACLs wird abgelehnt: the ACLs of this cluster are GrantForge policies; change them in GrantForge. - Entscheidungen werden behalten. Ein Broker stellt bei jedem Produce und Fetch dieselben Fragen; der Agent behält die Entscheidungen des aktuellen Snapshots, standardmäßig 100.000 davon für 10 Sekunden. Ein neuer Snapshot beginnt von vorn, sodass eine Richtlinienänderung gilt, sobald der Agent sie hat.
- Wiederholte Zugriffe werden zusammengefasst. Gleiche erlaubte Zugriffe innerhalb eines Fensters, standardmäßig 10 Sekunden, werden als ein Zugriffsereignis gemeldet, das sagt, wie viele es waren und wann der letzte geschah; die Konsole zeigt N gleiche Zugriffe. Zugriffe sind gleich, wenn Benutzer, Client-Adresse, Ressource, Zugriffsart, Anfragetyp und entscheidende Richtlinie übereinstimmen. Ablehnungen werden sofort einzeln gemeldet. Kafka wählt, was zu melden ist: Es verlangt zum Beispiel keine Meldung für die Topics, die es aus einer Liste weglässt.
- Superuser werden nicht geprüft. Die Principals aus
super.usersdürfen alles, wie mit Kafkas eigenem Autorisierer, und werden nicht auditiert.
Bereitstellung
-
Fügen Sie einen
kafka-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; speichern Sie es in einer Datei, die nur Kafkas Konto lesen kann. -
Kopieren Sie das JAR nach
libsjedes Brokers und Controllers, etwa/opt/kafka/libs. -
Ergänzen Sie die Einstellungen in der
server.propertiesjedes Knotens und ersetzen Sie die Beispiel-Principals, Adresse, Pfade und den Instanznamen:authorizer.class.name=org.devlive.grantforge.kafka.agent.GrantForgeKafkaAuthorizer super.users=User:kafka grantforge.server.url=https://grantforge.example.com grantforge.token.file=/etc/kafka/grantforge.token grantforge.instance=broker-1 grantforge.cache.dir=/var/lib/kafka/grantforge-cachesuper.usersmuss die Principals nennen, die Broker und Controller untereinander verwenden, etwa den des Inter-Broker-Listeners, oder Richtlinien müssen ihnen erlauben, was sie tun, etwacluster_actionauf dem Cluster. Verbindungen zu einemPLAINTEXT-Listener sindUser:ANONYMOUS; nennen Sie ihn nur, wenn kein Client einen solchen Listener erreicht. Das Cache-Verzeichnis muss für Kafkas Konto beschreibbar sein. -
Starten Sie Broker und Controller nacheinander neu. Andere Listener als die der Controller öffnen, sobald der Agent seinen ersten Snapshot hat, spätestens nach
grantforge.start.timeout.ms; bis dahin und immer, wenn kein Snapshot da ist, werden Anfragen abgelehnt. -
Vorhandene ACLs zuerst übertragen: ACLs, die Kafkas eigener Autorisierer gespeichert hat, gelten nicht mehr, sobald der Agent ihn ersetzt. Listen Sie sie vorher mit
kafka-acls --listauf und legen Sie 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 Broker oder Controller und ein beschreibbares Verzeichnis für den signierten Snapshot und gepufferte Ereignisse |
grantforge.signing.key.file |
Optionale Datei, die den Signaturschlüssel der Snapshots festlegt; kopieren Sie den Base64-kodierten öffentlichen X.509-Ed25519-Schlüssel von der Agentenseite. 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 Puffergrenze (Standard 64 MiB) |
grantforge.audit.fold.window.ms |
Wie lange gleiche erlaubte Zugriffe zu einem Ereignis zusammengefasst werden, Standard 10000, höchstens 3600000 Millisekunden; 0 meldet jeden einzeln |
grantforge.decision.cache.size, grantforge.decision.cache.ttl.ms |
Höchstzahl behaltener Entscheidungen, Standard 100000, höchstens 10000000, 0 behält keine; und wie lange, Standard 10000, 1..3600000 Millisekunden |
grantforge.start.timeout.ms |
Wie lange Listener auf den ersten Snapshot warten, Standard 30000, 0..600000 Millisekunden |
Der Agent liest seine Einstellungen aus der Konfiguration, die Kafka seinem Autorisierer übergibt. Ein Knoten, der zugleich Broker und Controller ist, erstellt für jede Rolle einen Autorisierer; beide teilen sich einen Agenten.
Benutzer, Gruppen und Rollen
Richtlinien nennen den Principal, den Kafka der Verbindung gibt: den SASL-Benutzernamen, den Kurznamen eines Kerberos-Principals nach sasl.kerberos.principal.to.local.rules oder den Namen eines TLS-Zertifikats nach ssl.principal.mapping.rules. Kafka kennt keine Gruppen oder Rollen; die der Richtlinien sind die, die GrantForge dem Benutzer gibt.
Entscheidungen und Grenzen
- Ohne verwendbaren Snapshot wird alles außer den Anfragen der Superuser abgelehnt. Ein nicht genutzter Dienst lässt Kafka ungeprüft, wie ohne Autorisierer.
- Ein Token, das an einen Dienst gebunden ist, dessen Typ nicht
kafkaist, lehnt alles ab. - Die Verweigerung einer Zugriffsart verweigert auch, was sie einschließt:
writeauf einem Topic zu verweigern verweigertdescribe, sodass der Benutzer es nicht sieht. Kafkas eigene ACLs verhalten sich hier anders. - Kafkas Frage, ob ein Benutzer auf irgendeine Ressource eines Typs zugreifen darf, ist kein Zugriff und wird nicht gemeldet.
- Entscheidungen werden
grantforge.decision.cache.ttl.mslang behalten, sodass der Gültigkeitszeitraum einer Richtlinie bis zu so viel später beginnt oder endet. - Der Agent arbeitet in Brokern und Controllern. Die REST-API von Kafka Connect, Schema-Registries und andere Dienste rund um Kafka sind nicht abgedeckt.
