Een begeleidende post introduceerde de minste privilege-afwijking als de gap tussen wat een AI-agent mag doen en wat hij wordt waargenomen. Dat bericht behandelde het concept: waarom de gap zich vormt, hoe eerst-lezen observatie een toegestane versus waargenomen diff produceert, en hoe policy-as-code deze sluit tijdens de toegangstijd. Dit bericht gaat nog een laag dieper: hoe drift een gestructureerde, geheime, triageerbare bevinding binnen de beveiligingsmodule wordt, en wat ermee gebeurt zodra deze bestaat.
De korte versie: drift is geen dashboardstatistiek of logregel. Het is een persistente entiteit met een classificatie, een ernst, een betrouwbaarheidsniveau en een triage-levenscyclus. Het voedt de anomaliewachtrij, verrijkt forensische tijdlijnen en is eerlijk over wat het wel en niet kan bewijzen.
De drie signaalbronnen
Elke rand in de toegangskaart registreert een toegangsrelatie tussen een oorsprong (een agent, een identiteit, een sessie) en een bron. Elke rand heeft twee Booleaanse vlaggen: Toegestaan en Waargenomen. De interessante randen zijn die waar deze vlaggen het niet eens zijn.
Maar de vlaggen komen niet uit de lucht vallen. Ze zijn afkomstig van verschillende signaalbronnen, elk met een ander vertrouwensprofiel:
Beleid (toegestaan). Een edge met signal_source=policy of signal_source=scoped_grant vertegenwoordigt een gedeclareerde toekenning: iets wat een referentie, een IAM-rol of het eigen bronbereikvlak van het platform zegt dat deze agent mag doen. Deze randen zijn permitted=true, observed=false totdat telemetrie ze bevestigt. Zij zijn het plafond. De identiteitsconnectoren (WIF-uitgevers, API-sleutelroosters, werkruimterollen) voeden deze kant. Een federatief serviceaccount heeft toegestaan dat het OAuth-bereik van de regel in een werkruimte zo’n voordeel is.
Telemetrie (waargenomen). Coöperatieve signalen van OpenTelemetry-traceringen, pgAudit-logboeken, CloudTrail-records, MCP-annotaties, A2A-protocolwaarnemingen en GitHub/GitLab-webhooks. Deze produceren randen waar observed=true. Hun betrouwbaarheid hangt af van de bron: een pgAudit READ-classificatie is attributed (de database weet wie de query heeft uitgevoerd en of het een lees- of schrijfactie was); een MCP readOnlyHint is approximate volgens specificatie - de MCP-specificatie zelf zegt dat gereedschapannotaties niet worden vertrouwd.
Kernel (grondwaarheid). De eBPF backstop (signal_source=ebpf) observeert op systeemcallniveau. Het is het signaal dat een agent niet kan omzeilen. Wanneer de eBPF-laag een connect() of een write() ziet die coöperatieve telemetrie niet heeft gerapporteerd, is dat geen log-gap - het is een anti-ontduikingssignaal. De beveiligingsmodule voegt de observaties aan de kernelkant en de coöperatieve kant samen tot een gecorreleerde anomalie, zodat een agent die zijn eigen telemetrie tot zwijgen brengt, een bevinding wordt en geen blinde vlek.
De toegangskaart is een query over deze randen, geen afzonderlijk schema. Least-privilege drift is de subset waar de twee vlaggen het niet eens zijn.
Hoe drift een vondst wordt
Een meningsverschil tussen Permitted en Observed is het ruwe signaal. De engine classificeert het in een van de twee soorten drift voordat het in de anomaliewachtrij terechtkomt:
// DriftKind classificeert een afwijking met de minste bevoegdheden tussen toegestaan en waargenomen.
type DriftKind string
const (
// DriftUnusedGrant is een toegestane toegang die nooit is waargenomen (overprovisioned).
DriftUnusedGrant DriftKind = "unused_grant"
// DriftViolation is een waargenomen toegang die niet is toegestaan.
DriftViolation DriftKind = "violation"
)
unused_grant betekent dat een beleid zegt dat de agent iets kan doen wat hij nog nooit heeft gezien. Dit is een dood voorrecht: risico wordt zonder voordeel gedragen. Het is het opruimsignaal voor periodieke toegangsbeoordelingen: intrekken wat niet wordt uitgeoefend.
violation betekent dat er is waargenomen dat de agent iets deed waarvoor geen beleid of vergunning was verleend. Dit is de actieve bevinding. Het is de rij in de diff-tabel met de tekst “unreviewed write” - de rand die er toe doet, degene die de anomaliewachtrij prioriteit geeft.
De classificatie is niet binair tussen ‘prima’ en ‘probleem’. De PrivilegeDrift-structuur koppelt de overtredende voorsprong aan zijn soort:
// PrivilegeDrift is een least-privilege-afwijking: een rand waarvan de vlaggen Permitted
// en Observed niet overeenkomen.
type PrivilegeDrift struct {
Edge AccessEdge
Kind DriftKind
}
De rand zelf draagt de volledige herkomst: de oorsprong (welke agent), de hulpbron, de read/write-modus, de signaalbron die deze heeft geproduceerd, het vertrouwen in de attributie en het observatievenster (FirstSeen, LastSeen, OccurrenceCount). Een driftbevinding betekent nooit dat er ergens iets mis is. Het verwijst naar een specifieke agent, een specifieke hulpbron, een specifieke toegangsmodus, waargenomen door een specifieke verzamelaar, met een tijdsbereik.
De anomaliewachtrij: niet alleen ‘anders’, maar geclassificeerd
Wanneer de beveiligingsmodule de afwijkende weergave bouwt (het GET /v1/m/security/anomalies-eindpunt), haalt deze de drift uit de access-edge store en classificeert elke violation in een geprioriteerde afwijking. De classificatie voegt context toe die de ruwe rand niet draagt:
Toegangsdrift. De basislijn: een waargenomen, maar niet-toegestane toegang. De anomalie heeft de titel “Onverwachte toegang: waargenomen maar niet toegestaan”, met een gemiddelde ernst, en is gemarkeerd met confidence=approximate omdat de drift op winkelniveau het ruwe signaal is - nog niet afgestemd op de volledige agent-naar-identiteitsgrafiek. De afgestemde weergave bevindt zich in het eigen /drift-eindpunt van de toegangskaart; de anomaliewachtrij verbruikt het ruwe signaal en labelt het eerlijk.
Egress/exfiltration vermoed. Wanneer de bron op de drift-edge een netwerkeindpunt is naar een externe, niet-privébestemming (de eBPF-connector zendt deze uit als tcp://host:port-URI’s), wordt de afwijking opnieuw geclassificeerd naar egress_exfil_suspected en gepromoveerd tot ernst hoog. Een agent die naar een extern eindpunt schrijft waartoe hij nooit toegang heeft gekregen, is een andere vorm van zoeken dan een agent die een databasetabel leest waarvoor hij niet was bedoeld.
Gevoeligheidsescalatie. Wanneer de resource een gevoeligheidslabel draagt (high of secret), wordt de ernst verhoogd, ongeacht of de toegang al dan niet uitgaand is. Een violation tegen een zeer gevoelige bron garandeert een snellere triage, zelfs als de bestemming intern is.
Elke anomalie heeft een evidence-kaart met de ruwe details:
ev := map[string]any{
"origin_kind": edge.OriginKind,
"origin_id": edge.OriginID.String(),
"resource_id": edge.ResourceID.String(),
"mode": string(edge.Mode),
"signal_source": string(edge.SignalSource),
"occurrence_count": edge.OccurrenceCount,
"reconciled": false,
}
De reconciled: false is opzettelijk. Het vertelt de consument dat dit het ruwe signaal op winkelniveau is, en niet het afgestemde, agent-tot-identiteitsbeeld van de toegangskaart. De anomaliewachtrij wacht niet tot afstemming een violation aan het licht brengt, maar doet niet alsof de toeschrijving stevig is, terwijl dat niet het geval is.
Betrouwbaarheidsniveaus: wat kan worden bewezen
Elke rand op de toegangskaart heeft een betrouwbaarheidsniveau. Het product maakt gebruik van twee:
-
Toegeschreven (
confidence=attributed): de toegang is stevig verbonden met de herkomst door het eigen bewijsmateriaal van de verzamelaar. Een pgAudit-record waarin de databaserol van de agent wordt genoemd, een CloudTrail-gebeurtenis gekoppeld aan de IAM-referenties van de agent, een eBPF-observatie gekoppeld aan een proces-ID die door de runtime is omgezet naar een agent. De attributieketen loopt van begin tot eind. -
Bij benadering (
confidence=approximate): de toeschrijving wordt afgeleid en kan verliesgevend zijn. Het signaal kwam van een gedeeld serviceaccount waarbij meerdere agenten dezelfde inloggegevens gebruiken, van een verliesgevende winkel (een Redis-instantie die de identiteit per verbinding niet registreert), of van een MCP-annotatie die volgens de specificatie niet vertrouwd is. De rand is nog steeds een signaal, maar de operator weet dat het bewijs zwakker is.
Het betrouwbaarheidsniveau beïnvloedt de prioriteitsscore van de anomalie. De prioriteitsfunctie (priorityFor) scoort elke anomalie van 0 tot 100, en een approximate-vertrouwensdrift wordt buiten beschouwing gelaten:
if confidence == string(sdkmodel.ConfidenceApproximate) {
// korting: onverzoenlijke drift is luidruchtig
}
Dit voorkomt dat een luidruchtig signaal met een gedeelde identiteit een stevige attributed violation opzij duwt. Beide verschijnen in de wachtrij; de approximate scoort lager. Het is hetzelfde principe waarop forensische verrijking van toepassing is: wanneer een gedeelde identiteit (SharedIdentity: true, AgentCount > 1) wordt gevonden, wordt in de tijdlijn opgemerkt dat “toeschrijving per agent dubbelzinnig kan zijn” in plaats van te doen alsof de toeschrijving exact is.
Het product vervalst nooit zekerheid. Een MCP-rand met alleen annotaties weegt niet hetzelfde gewicht als een eBPF-bevestigde rand. Een driftbevinding van een gedeeld serviceaccount heeft niet hetzelfde gewicht als een bevinding van een identiteit per agent. De operator ziet het verschil en voert een triage uit.
Drift in de forensische tijdlijn
Driftbevindingen bestaan niet alleen in de anomaliewachtrij. Wanneer een forensische zaak wordt geopend en de tijdlijn ervan wordt gereconstrueerd op basis van het aan hash gekoppelde auditgrootboek, verrijkt de beveiligingsmodule de reconstructie met de drift van het onderwerp:
out.Drift = subjectDrift(r.Context(), sc, c.SubjectRef)
De functie subjectDrift doorzoekt de access-edge store naar drift van het type violation, waarbij het onderwerp de oorsprong is, en retourneert een lijst met driftRefDTO-items - elk met de oorsprong, resource, toegangsmodus, signaalbron, aantal voorvallen en laatst geziene tijdstempel. Deze worden gelezen uit de eigen driftberekening van de winkel en worden niet opnieuw berekend door de beveiligingsmodule.
De tijdlijn bevat ook de identiteitstoeschrijving en de gegevensafkomst van het onderwerp, zodat een onderzoeker die een zaak beoordeelt het volledige beeld ziet: als wie de agent optreedt (en of die identiteit wordt gedeeld), waartoe hij toegang heeft gehad zonder dat hij die zou moeten hebben, en uit welke gegevens hij antwoorden heeft afgeleid. Elk van deze verrijkingen is tolerant ten opzichte van afwezige buren – als de kennismodule niet is geïnstalleerd, wordt de afstamming weggelaten in plaats van nagebootst; als de identiteit geen opgeloste agentbinding heeft, zegt attributie ‘nog niet gebonden’ in plaats van er een uit te vinden.
De triage-levenscyclus
Een door drift veroorzaakte bevinding komt het systeem binnen met de status open. Van daaruit volgt het de standaard levenscyclus van het vinden van triage:
- open: de bevinding bestaat, niemand heeft er nog actie op ondernomen.
- triaged: een operator heeft het erkend en ter beoordeling toegewezen.
- opgelost: de onderliggende oorzaak is verholpen (de subsidie is ingetrokken, het beleid is aangescherpt, de agent heeft een nieuwe scope gekregen).
- afgewezen: de operator heeft het beoordeeld en vastgesteld dat het geen reëel risico vormt (een bekend gedrag, een vals-positief uit de toeschrijving van approximate).
Elke verandering in de triagestatus wordt door de echte opdrachtgever zelf gecontroleerd. De handeling van het afwijzen van een bevinding wordt zelf vastgelegd in het fraudebestendige grootboek, zodat een auditor niet alleen kan zien welke afwijking er heeft plaatsgevonden, maar ook wie deze heeft beoordeeld en wat hij heeft besloten. Het bewijsmateriaal van de bevinding (de aard, ernst en detailhash) is na creatie onveranderlijk; triage verandert alleen de status van de workflow.
Wat dit in de praktijk betekent
Een agent krijgt een API-sleutel die is afgestemd op een Claude-werkruimte. De identiteitsconnector leest het rooster van de werkruimte en verzendt een beleidsrand: deze sleutel mag de API in deze werkruimte aanroepen. De agent loopt drie weken. Telemetrie laat zien dat het de API in die werkruimte aanroept - geen drift. Vervolgens geeft een implementatiewijziging de agent toegang tot de sleutel van een tweede werkruimte. Telemetrie observeert de agent die beide werkruimten aanroept. De tweede werkruimte heeft geen beleidsrand. Er wordt een driftbevinding van de soort violation gemaakt: waargenomen maar niet toegestaan. Het komt in de anomaliewachtrij terecht als access_drift, ernst medium, vertrouwen approximate (de rand is nog niet afgestemd op de identiteitsgrafiek). Als de resource in de tweede werkruimte het gevoeligheidslabel high draagt, neemt de ernst toe. De bevinding blijft in de wachtrij van de operator staan totdat iemand er een beoordeling van maakt.
Dat is het verschil tussen loggen en gestructureerde drift: de bevinding is geclassificeerd, attributed (met eerlijk vertrouwen), geprioriteerd en triageerbaar. Het blijft bestaan totdat iemand het oplost of afwijst. Het verschijnt in de forensische tijdlijn als de agent later het onderwerp is van een incidentzaak. En elke actie die daarop wordt ondernomen, wordt vastgelegd in een keten waarvan de integriteit door het product kan worden bewezen.
Drift is geen maatstaf die geminimaliseerd moet worden. Het is een bevinding om te triageen. De gap tussen wat een agent mag doen en wat hij doet, is het hoogste signaaloppervlak voor handhaving van de minste bevoegdheden - maar alleen als de gap gestructureerd, geclassificeerd en eerlijk is over wat hij kan bewijzen.
Om de toegangskaart en het driftoppervlak op een hardloopterrein te bekijken, gaat u naar de productpagina toegangskaart of het productoverzicht.