>_ DevTrendsde

Sprache

Start

Sprachen

Bereiche

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicherheit
Go

Wie Google Zugriffsberechtigungen für Milliarden von Nutzern prüft und was SpiceDB damit zu tun hat

Wenn ein Projekt ein einfaches Schema mit Admin- und Benutzerrollen überwächst, beginnt das Chaos. In einer Microservices-Architektur wird die Berechtigungsprüfung oft zu einem verworrenen Netz. Ein Service speichert Rollen in einer Datenbank, ein anderer validiert JWT-Token, ein dritter führt schwere SQL-Abfragen mit einem Dutzend JOINs aus. Seit 2021 ruft OWASP Sicherheitslücken bei der Zugriffskontrolle (Broken Access Control) als die größte Bedrohung für die Sicherheit von Webanwendungen aus.

Google stand dieses Problem vor vielen Jahren. Für Google Drive, YouTube und Cloud IAM entwickelte das Unternehmen ein einheitliches, zentralisiertes Autorisierungssystem namens Zanzibar. Im Jahr 2019 veröffentlichten Ingenieure ein Paper, das seine Architektur beschrieb, und das Authzed-Team nahm diese Idee und schuf SpiceDB — eine Open-Source-Datenbank für die Zugriffskontrollverwaltung.

Warum Autorisierung in eine separate Datenbank auslagern

Normale Datenbanken eignen sich gut zum Speichern von Geschäftsobjekten, aber sie tun sich schwer mit komplexen Berechtigungsgraphen. Stellen Sie sich ein Dokument vor, das in einem Ordner liegt, der sich in einem anderen Ordner befindet, der wiederum mit einer Gruppe von Benutzern geteilt wurde, zu der auch eine separate Unternehmensabteilung gehört. Die Berechnung, ob ein bestimmter Mitarbeiter Zugriff auf die Datei hat, wird mit einem Standard-DBMS schmerzhaft und langsam.

SpiceDB nimmt Ihnen diese Aufgabe ab. Sie senden eine einfache Abfrage an die Datenbank: „Kann Benutzer X Aktion Y auf Ressource Z ausführen?“. Die Antwort ist eine schnelle binäre Antwort.

Gleichzeitig übernimmt SpiceDB nur die Autorisierung (Zugriffsberechtigungen) und weiß nichts über die Authentifizierung (Identitätsüberprüfung). Das Überprüfen von Passwörtern, das Anmelden von Benutzern und das Ausstellen von Tokens sollte weiterhin von Ihrem Identitätsanbieter wie Keycloak oder Auth0 übernommen werden.

Wie das Schema und die Beziehungssprache funktionieren

Die Arbeit mit SpiceDB beginnt mit der Beschreibung eines Schemas. Das Schema definiert Objekttypen und Regeln für die Berechnung von Berechtigungen.

Die Schema-Syntax sieht lesbar und prägnant aus:

definition user {}

definition folder {
    relation parent: folder
    relation viewer: user

    permission view = viewer + parent->view
}

definition document {
    relation folder: folder
    relation viewer: user

    permission view = viewer + folder->view
}

In diesem Beispiel wird der Zugriff view auf ein Dokument automatisch Benutzern gewährt, die direkt in viewer aufgeführt sind, sowie denen, die die Berechtigung view auf dem übergeordneten Ordner haben. Die Verschachtelungskette kann beliebig tief sein.

Die tatsächlichen Daten werden als Beziehungen gespeichert. Dies sind einfache Fakten über das System, zum Beispiel:

  • folder:finance — ein Objekt vom Typ folder mit der ID finance
  • viewer — eine Beziehung
  • user:mikhail — ein Subjekt

Das Aufzeichnen einer solchen Beziehung bedeutet, dass Mikhail Leser des finance-Ordners wurde.

ReBAC und Attribute: Netflix-Erfahrung

Im Gegensatz zum klassischen RBAC (Role-Based Access Control) implementiert SpiceDB ReBAC (Relationship-Based Access Control). Der Zugriff wird durch Beziehungen zwischen Objekten in einem Graphen bestimmt.

Aber manchmal brauchen Unternehmen mehr als nur zu wissen, dass ein Benutzer Teil eines Teams ist. Sie müssen eine kontextuelle Bedingung überprüfen: zum Beispiel, ob die Person von einer Unternehmens-IP-Adresse aus zugreift oder ob die Anfrage während der Geschäftszeiten gestellt wurde.

Für solche Szenarien halfen Netflix-Ingenieure, einen Caveats-Mechanismus zu SpiceDB hinzuzufügen. Dies kombiniert ReBAC und ABAC (Attribute-Based Access Control). Eine kontextuelle Funktion wird an eine Beziehung angehängt und wird im Moment der Berechtigungsprüfung berechnet.

Architektur und Leistung unter Last

SpiceDB ist in Go geschrieben und für hohe Lasten konzipiert. Die Autoren geben 5ms Latenz bei p95 mit Millionen von Abfragen pro Sekunde und Milliarden von Beziehungen in der Datenbank an.

Als Speicher (Datastores) können Sie vertraute DBMS anschließen:

  • PostgreSQL
  • CockroachDB
  • MySQL (der Treiber für MySQL wurde vom Autorisierungsteam von GitHub geschrieben)
  • Google Cloud Spanner

Ein interessantes Feature ist das Consistency-Management auf individueller Abfrageebene. Wenn ein Benutzer gerade Zugriffsberechtigungen geändert hat und das Ergebnis sofort sehen möchte, sendet die Anwendung eine Anfrage, die vollständig konsistente Daten erfordert. Wenn wir jedoch einen öffentlichen Katalog rendern, wo eine Verzögerung von ein paar Sekunden nicht kritisch ist, erlauben wir Caching und reduzieren die Last auf die Datenbank.

SpiceDB kann auch „umgekehrte“ Fragen beantworten: „Auf welche Ressourcen hat der Benutzer Zugriff?

Ähnliche Projekte