Fail-closed verifiëren zonder cluster
De fail-closed-stand van het portaal is lokaal aan te tonen, zonder oauth2-proxy, zonder Keycloak en zonder cluster. Dat is het punt: het auditbewijs is niet dat de code klopt, maar dat iemand het zelf kan naspelen.
Het waarom achter deze stand staat in portal-auth.
Met de testsuite
uv run pytest tests/api/test_auth_gate.py -v
Dekt: 403 zonder header, 200 met X-Forwarded-Email, X-Forwarded-User als
fallback, een lege header die niet als identiteit telt, /healthz altijd open, de
UI-route wél bewaakt, REQUIRE_AUTH=false laat door, en de actor in de trail.
Met een draaiende server
Start de app zoals het portaal dat doet — gebonden aan localhost:
uv run iso-audit ui --session <sessie-dir> --profile <slug> \
--norms examples/norms --memo-input <memo-input.yaml> \
--host 127.0.0.1 --port 8081
Dan, in een tweede terminal:
# default (REQUIRE_AUTH aan): geen identity-header -> 403
curl -si http://127.0.0.1:8081/findings | head -1
# mét de header die oauth2-proxy in productie zet -> 200
curl -si -H 'X-Forwarded-Email: jij@conduction.nl' \
http://127.0.0.1:8081/findings | head -1
# de probe blijft open, ook met de gate aan -> 200
curl -si http://127.0.0.1:8081/healthz | head -1
Voor lokale ontwikkeling zonder proxy:
REQUIRE_AUTH=false uv run iso-audit ui --session <sessie-dir> --profile <slug> \
--norms examples/norms --memo-input <memo-input.yaml>
Let op wat er dan in de trail komt te staan: actor wordt
dev:auth-uitgeschakeld. Dat is opzet — een dev-run mag niet als een mens
gelezen kunnen worden.
Controleren dat de actor klopt
Na een triage-beslissing via het portaal:
curl -s -H 'X-Forwarded-Email: jij@conduction.nl' \
http://127.0.0.1:8081/trail | python3 -m json.tool | grep actor
Er hoort je eigen adres te staan. Staat er "auditor", dan is de identiteit niet
doorgegeven en is de trail niet toewijsbaar.
Toegang beëindigen bij offboarding
Het uitzetten van een Keycloak-account is niet voldoende: de sessie-cookie draagt de identiteit zelf, dus een al uitgegeven cookie blijft geldig tot hij verloopt. Beëindig daarom beide:
- het account of de groepslidmaatschap in Keycloak, én
- de actieve sessies van die gebruiker in de realm (
Sessions→Logout), zodat er geen nieuwe cookie meer gemint kan worden.
De maximale restduur bij alleen stap 1 is de cookie-levensduur uit
deploy/oauth2-proxy.cfg. Die waarde is een vastgelegd geaccepteerd risico; zie
taak 1.6 van de change iso-portal.