- Je berekent vaste bytes en een vingerafdruk voor server, tool en alle argumenten.
- Je weigert een veranderde aanroep of ontoereikende actuele rechten zonder de gewone taak te blokkeren.
Je hebt toestemming gekregen om kaart-a te lezen. Vlak voor uitvoering verandert het doel ongemerkt in kaart-b, terwijl de applicatie nog dezelfde goedkeuring gebruikt. Een vinkje bij de toolnaam vertelt dan te weinig over het verzoek dat werkelijk wordt uitgevoerd.
Bewaar daarom eerst de precieze aanroep. Vergelijk bij uitvoering zowel dat vastgelegde verzoek als de huidige bevoegdheden. Deze oefening gebruikt eigen records; de vertrouwde context en goedkeuring zijn afzonderlijk aangeleverd, na authenticatie die buiten onze functies plaatsvindt.
1. Geef dezelfde aanroep dezelfde bytes
Een aanroep bevat server, tool en arguments. In ons kleine formaat zijn argumentnamen en waarden ids, zoals target en kaart-a. Alle velden horen bij de toestemming, ook als twee verzoeken dezelfde tool gebruiken.
Dicts kunnen dezelfde inhoud in een andere sleutelvolgorde bevatten. Spreek daarom één representatie af: gesorteerde keys, geen overbodige spaties en UTF-8 als bytecodering. Zo blijven betekenisvolle veranderingen zichtbaar zonder dat een andere invoegvolgorde een nieuw verzoek lijkt.
Noem de aanroep c, de canonieke JSON-weergave J en de omzetting naar UTF-8-bytes U. H is de vingerafdrukfunctie; SHA256 is de gebruikte standaard hashfunctie. Zij geeft hier een reeks van 64 kleine hextekens terug.
Dit ene verzoek heeft één argument. De afgesproken weergave telt 67 bytes; alle tekens in dit voorbeeld zijn ASCII en tellen elk als één byte. De code controleert de lengte en toont alleen de eerste acht tekens van de volledige vingerafdruk.
call = dict(server="kaarten",
tool="read",
arguments={"target":"kaart-a"})
raw = json.dumps(call, sort_keys=True,
ensure_ascii=False,
separators=(",", ":"))
print(len(raw.encode("utf-8")))
print(call_fingerprint(call)[:8])
# 67
# 8f84da43
01Een hash is geen toestemming en verbergt de argumenten niet. Iemand kan zelf een hash van een ongewenst verzoek berekenen. De referentie waarmee je vergelijkt moet daarom uit het afzonderlijk vertrouwde goedkeuringsrecord komen.
2. Controleer ook de huidige bevoegdheden
Onze context noemt actor, rol, audience en scopes. Audience is de server waarvoor deze oefencontext bedoeld is. Het applicatiebeleid noemt per volledig server/toolpaar toegestane rollen en vereiste scopes; de toolbeschrijving stelt dit beleid niet vast.
Je kunt ontbrekende scopes met twee kleine verzamelingen volgen. Het beleid vraagt read en audit, terwijl de context alleen read heeft. Er ontbreekt dus precies één scope, ook als het verzoek en de goedkeuring verder overeenkomen.
required = {"read", "audit"}
granted = {"read"}
missing = sorted(required - granted)
print(missing)
print(len(missing))
# ['audit']
# 1
De beslissing A vereist zeven booleaanse controles. p betekent dat het policypaar bestaat, a dat audience klopt, i dat de actor bij de goedkeuring hoort en s dat haar server klopt. h betekent gelijke callhash, r een toegestane huidige rol en q dat alle vereiste scopes aanwezig zijn.
In het gewone geval hieronder zijn alle zeven voorwaarden waar. De goedkeuring bewaart de actor, server en volledige vingerafdruk. De regel vraagt hier alleen read, zodat de normale taak door kan gaan.
context = dict(actor="alice",
role="reader", audience="kaarten",
scopes=["read"])
policy = [dict(server="kaarten",
tool="read", roles=["reader"],
scopes=["read"])]
approval = dict(actor="alice",
server="kaarten",
fingerprint=call_fingerprint(call))
reply = authorize_bound_call(
call, context, policy, approval)
print(reply["allowed"])
print(reply["reason"])
# True
# allowed
02Verander de call of de huidige bevoegdheden. Een oude goedkeuring past alleen bij hetzelfde vastgelegde verzoek en voldoende actuele rechten.
Voorgestelde aanroep
{
"server": "a",
"tool": "read",
"arguments": {
"target": "kaart-b",
"mode": "kort"
}
}Vingerafdruk van deze call
32d39ee5227bad01b890f5e5d24bc191309813c8eb4539483cf8f2ff54bcfe27Huidige vertrouwde context
- Actor
- alice
- Rol
- reader
- Audience
- a
- Scopes
- read
Deze context is apart vertrouwd na authenticatie buiten de oefening.
Afzonderlijke goedkeuring
- Actor
- alice
- Server
- a
Vastgelegde vingerafdruk
6de0afc38bff7c90a607216ef5b276d328c5c0509fa8acafbf8632970abc5c53Huidig applicatiebeleid
a/read- Toegestane rollen
- reader
- Vereiste scopes
- read
Dit beleid wordt niet uit de toolbeschrijving afgeleid.
Alleen de callhash vergeleken: verschillend.
Canonieke JSON van deze aanroep
{"arguments":{"mode":"kort","target":"kaart-b"},"server":"a","tool":"read"}De goedkeuring hoort bij andere aanroepbytes.
Ontbrekende scopes bij deze reden: []
De eerste weigering bepaalt de reden. Alleen bij reden scope worden ontbrekende scopes genoemd. Dit eigen id-mapformaat vervangt geen volledig toolschema, authenticatie of eenmalige goedkeuringsadministratie.
Alle beschrijvingen, aanroepen, bevoegdheden en pins zijn eigen oefengegevens. Deze vergelijking roept geen echte tool of server aan.
3. Veranderingen vragen een nieuwe beoordeling
Een veelgemaakte fout is de goedgekeurde hash behandelen als blijvende bevoegdheid. Een gewijzigd argument moet de vergelijking laten mislukken; gewijzigde rollen of scopes moeten opnieuw door het huidige beleid worden getoetst. De functie rapporteert de eerste weigering volgens de afgesproken prioriteit.
changed = dict(server="kaarten",
tool="read",
arguments={"target":"kaart-b"})
reply = authorize_bound_call(
changed, context, policy, approval)
print(reply["allowed"])
print(reply["reason"])
# False
# fingerprint
Wij bouwen hiermee geen JWT-verificatie, tokenuitgifte, verval of eenmalige consumptie. Een herhaalde identieke aanroep kan onder hetzelfde huidige beleid weer slagen. De functies laten precies zien welke binding onze eigen beslissing controleert.
Samenvatting
- Leg server, tool en alle argumenten samen vast.
- Vergelijk met een apart vertrouwde goedkeuring en toets actuele bevoegdheden.
- Een gelijke vingerafdruk vervangt geen actor-, audience-, rol- of scopecontrole.
Hierna onderzoek je wat er gebeurt wanneer de tooldefinitie zelf verandert nadat je haar eerder hebt beoordeeld.