Hoe Google Toegangsrechten voor Miljarden Gebruikers Controleert en Wat SpiceDB Hiermee Te Maken Heeft
Wanneer een project groeit dan een simpel schema met admin- en gebruikersrollen, begint het chaos. In een microservices-architectuur verandert permissiecontrole vaak in een wirwar. De ene service slaat rollen op in een database, een andere valideert JWT-tokens, een derde voert zware SQL-queries uit met een dozijn JOINs. Sinds 2021 roept OWASP toegangscontrole-fouten (Broken Access Control) op als de nummer één bedreiging voor de beveiliging van webapplicaties.
Google kreeg dit probleem jaren geleden al. Voor Google Drive, YouTube en Cloud IAM ontwikkelde het bedrijf een uniform gecentraliseerd autorisatiesysteem genaamd Zanzibar. In 2019 publiceerden engineers een paper met de beschrijving van de architectuur, en het Authzed-team nam dit idee en creëerde SpiceDB — een open-source database voor toegangscontrolebeheer.
Waarom Autorisatie Verplaatsen naar een Separate Database
Reguliere databases zijn goed in het opslaan van business-entiteiten, maar worstelen met complexe permissiegrafieken. Stel je een document voor dat in een map staat die in een andere map staat, gedeeld met een groep gebruikers die een aparte bedrijfsafdeling bevat. Berekenen of een specifieke medewerker toegang heeft tot het bestand wordt pijnlijk en langzaam met een standaard DBMS.
SpiceDB neemt deze taak uit handen. Je stuurt een simpele query naar de database: "Kan gebruiker X actie Y uitvoeren op resource Z?". Het antwoord is een snel binair antwoord.
Tegelijkertijd handelt SpiceDB alleen autorisatie af (toegangsrechten) en weet niets over authenticatie (identiteitsverificatie). Wachtwoorden controleren, gebruikers inloggen en tokens uitgeven moet nog steeds worden afgehandeld door je identity provider zoals Keycloak of Auth0.
Hoe de Schema- en Relationship-taal Werkt
Werken met SpiceDB begint met het beschrijven van een schema. Het schema definieert objecttypen en regels voor het berekenen van permissies.
De schema-syntax ziet er leesbaar en beknopt uit:
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 dit voorbeeld wordt toegang view tot een document automatisch verleend aan gebruikers die direct vermeld staan in viewer, evenals aan diegenen die permissie view hebben op de bovenliggende map. De nesting-keten kan elke diepte hebben.
De daadwerkelijke data wordt opgeslagen als relationships. Dit zijn eenvoudige feiten over het systeem, bijvoorbeeld:
folder:finance— een object van het type map met IDfinanceviewer— een relatieuser:mikhail— een subject
Het vastleggen van zo'n relationship betekent dat Michail een lezer werd van de finance-map.
ReBAC en Attributen: Netflix' Ervaring
In tegenstelling tot klassiek RBAC (Role-Based Access Control) implementeert SpiceDB ReBAC (Relationship-Based Access Control). Toegang wordt bepaald door relaties tussen objecten in een graaf.
Maar soms hebben bedrijven meer nodig dan alleen weten dat een gebruiker deel uitmaakt van een team. Ze moeten een contextuele conditie controleren: bijvoorbeeld dat de persoon vanaf een bedrijfs-IP-adres toegang krijgt of dat het verzoek tijdens kantooruren is gedaan.
Voor zulke scenario's hielpen Netflix-engineers met het toevoegen van een caveats-mechanisme aan SpiceDB. Dit combineert ReBAC en ABAC (Attribute-Based Access Control). Een contextuele functie wordt gekoppeld aan een relationship, berekend op het moment van permissiecontrole.
Architectuur en Prestaties Onder Load
SpiceDB is geschreven in Go en ontworpen voor hoge belasting. De auteurs claimen 5ms latency bij p95 met miljoenen queries per seconde en miljarden relationships in de database.
Als opslag (datastores) kun je vertrouwde DBMS'en aansluiten:
- PostgreSQL
- CockroachDB
- MySQL (de driver voor MySQL is geschreven door GitHubs autorisatieteam)
- Google Cloud Spanner
Een interessant kenmerk is consistentiebeheer op individueel query-niveau. Als een gebruiker zojuist toegangsrechten heeft gewijzigd en het resultaat direct wil zien, stuurt de applicatie een verzoek dat volledig consistente data vereist. Echter, als we een openbare catalogus renderen waar een paar seconden vertraging niet kritisch is, staan we caching toe en verminderen we de belasting op de database.
SpiceDB kan ook "omgekeerde" vragen beantwoorden: "Tot welke resources heeft de gebruiker toegang?" of "Wie kan dit document bekijken?". Hiervoor gebruikt het intern reverse indexes.
Snelle Start met Docker en curl
Je kunt SpiceDB voor experimenten opstarten met een enkele Docker-opdracht:
docker run --rm -p 50051:50051 -p 8443:8443 \
authzed/spicedb serve \
--http-enabled true \
--grpc-preshared-key "somerandomkeyhere"
Na opstarten laad je het schema via de HTTP API:
curl --location 'http://localhost:8443/v1/schema/write' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer somerandomkeyhere' \
--data '{
"schema": "definition user {} \n definition folder { \n relation viewer: user \n permission view = viewer \n }"
}'
Voeg een relationship toe die aangeeft dat gebruiker anne map budget kan bekijken:
curl --location 'http://localhost:8443/v1/relationships/write' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer somerandomkeyhere' \
--data '{
"updates": [
{
"operation": "OPERATION_TOUCH",
"relationship": {
"resource": { "objectType": "folder", "objectId": "budget" },
"relation": "viewer",
"subject": { "object": { "objectType": "user", "objectId": "anne" } }
}
}
]
}'
Controleer nu de permissies:
curl --location 'http://localhost:8443/v1/permissions/check' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer somerandomkeyhere' \
--data '{
"resource": { "objectType": "folder", "objectId": "budget" },
"permission": "view",
"subject": { "object": { "objectType": "user", "objectId": "anne" } }
}'
We ontvangen status PERMISSIONSHIP_HAS_PERMISSION als antwoord.
Naast REST en gRPC API's bieden de ontwikkelaars een command-line utility zed en een browser-gebaseerde sandbox genaamd Playground (play.authzed.com). Het is handig voor het schetsen van een permissiemodel, het vullen met testdata en het testen van hypothesen voordat je code schrijft.
Voor Wie Dit Gereedschap Is
SpiceDB draait inmiddels in productie bij Red Hat, IBM, GitPod en Tubi.
Het introduceren van zo'n systeem in een kleine monolith waar alle permissies beperkt zijn tot een admin-paneel en een paar rollen heeft weinig zin — het is onnodige infrastructuurcomplexiteit. Echter, het gereedschap is perfect wanneer:
- Je een dozijn microservices hebt, en elk probeert op zijn eigen manier permissies te controleren.
- Je productlogica bestandsdeling, complexe maphiërarchieën of teamaccounts vereist.
- Je een security-audit nodig hebt en een enkelvoudig punt voor toegangscontrolebeheer.
Voor deployment in Kubernetes biedt Authzed een officiële operator. Het project ontwikkelt actief, en de GitHub-repository heeft inmiddels bijna 7.000 sterren.
Gerelateerde projecten