Test din AuthPolicy
Ztoperator følger en deklarativ tilnærming, der tilgangsstyringen flyttes ut av applikasjonskoden og inn i teamets infrastrukturkode (IaC) – typisk i et apps-repo.
Denne tilnærmingen gir mange fordeler, men kan gjøre det mer utfordrende å teste tilgangsstyringen i integrasjonstester.
For å håndtere dette kan du bruke GitHub Actionen test-authpolicy-action
,
som lar deg verifisere at en AuthPolicy
du har definert for å styre tilgangen til applikasjonen faktisk fungerer som forventet.
📖 Eksempel
For å illustrere hvordan test-authpolicy-action
fungerer, ser vi på et konkret eksempel.
🔐 AuthPolicy
Følgende AuthPolicy
tillater uautentiserte forespørsler til URL-stien /public
og alle under-stier.
Samtidig sikrer den at kun autentiserte forespørsler med claimet role: admin
får tilgang til /admin
og alle under-stier.
Alle andre forespørsler som ikke omfattes av ignoreAuthRules
eller authRules
må være autentisert.
apiVersion: ztoperator.kartverket.no/v1alpha1
kind: AuthPolicy
metadata:
name: auth-policy
spec:
enabled: true
ignoreAuthRules:
- paths:
- /public*
authRules:
- paths:
- /admin*
when:
- claim: role
values:
- admin
denyRedirect: true
audience: some-audience
oAuthCredentials:
secretRef: oauth-secret
clientIDKey: CLIENT_ID_KEY
clientSecretKey: CLIENT_SECRET_SECRET
autoLogin:
enabled: true
loginPath: /login
logoutPath: /logout
redirectPath: /oauth2/callback
scopes:
- offline_access
- openid
wellKnownURI: https://login.microsoftonline.com/7f74c8a2-43ce-46b2-b0e8-b6306cba73a3/v2.0/.well-known/openid-configuration
selector:
matchLabels:
app: application
🚀 test-authpolicy-action
Du kan teste nevnte AuthPolicy
direkte i repoet der den er definert (typisk et apps-repo) ved å inkludere den i en GitHub Workflow-jobb.
Før test-authpolicy-action
kjøres, må setup-skip-action
være kjørt for å sette opp det nødvendige miljøet som kreves for å gjennomføre testene.
name: Test AuthPolicy
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v3
# 🚨 Må kjøres først 🚨
- name: Setup SKIP
uses: kartverket/setup-skip-action@v0.0.1
- name: Test AuthPolicy
uses: kartverket/test-authpolicy-action@v0.0.1
with:
test: test.yaml
authpolicy: authpolicy.yaml
🧪 Test-fil
test-authpolicy-action
har to input: filstien til AuthPolicy
-ressursen som skal testes, og filstien til en testfil som beskriver selve testene.
Testfilen må følge JSON-skjemaet definert her.
Testfilen består av et navn (name
) og en samling forespørsler (requests
). Hver forespørsel definerer:
- Én eller flere URL-stier.
- Én eller flere HTTP-metoder.
- En forventet respons (
expected_response
).
I tillegg kan du angi det boolske feltet auth
for at forespørselen skal autentiseres, dvs. at en gyldig JWT legges ved i headeren Authorization: Bearer <JWT>
.
Du kan også oppgi en liste med claims
som skal inkluderes i JWT-en.
Følgende er et eksempel på en test-fil som kan brukes til å teste AuthPolicy
-ressursen ovenfor. Test-filen vil oversettes til HTTP-forespørsler i en hurl-fil,
og en hurl-test blir kjørt og evaluerer forespørslene.
Hvis test-authpolicy-action
kjøres i en pull request så vil den legge ved resultatet av hurl-testen som en kommentar. Den vil der vise hurl-testen som ble opprettet på
bakgrunn av test-filen. Hvis testen feiler vil den i tillegg vise hvilken HTTP-forespørsel i hurl-filen som feilet, og peke på hvilken forespørsel i testen denne stammer fra.
name: Test AuthPolicy
requests:
# Verifiser at stien /public og alle under-stier er åpne
- paths:
- /public
- /public123
expected_response: allowed
# Verifiser at stien /admin og alle under-stier blir blokkert uten gyldig JWT
- paths:
- /admin
- /admin123
expected_response: denied
# Verifiser at stien /admin og alle under-stier ikke slipper gjennom med kun autentisert JWT (krever også claimet role: admin)
- paths:
- /admin
- /admin123
auth: true
expected_response: denied
# Verifiser at stien /admin og alle under-stier er åpne når autentisert JWT med claimet role: admin legges ved
- paths:
- /admin
- /admin123
auth: true
claims:
- claim: role
values:
- admin
expected_response: allowed
# Verifiser at stier som ikke er nevnt i AuthPolicy-ressursen ikke er åpne og omdirigerer til innlogging
- paths:
- /something
expected_response: login_redirect
# Verifiser at stier som ikke er nevnt i AuthPolicy-ressursen krever autentisert JWT
- paths:
- /something
auth: true
expected_response: allowed