Kom i gang
Autorisasjonsregler i OPAâ
Autorisasjonsregler i OPA skrives med sprÄket Rego. Hver regel du skriver tilhÞrer en pakke, og bruk av OPA
innebÊrer Ä kalle hver enkelt regel pÄ endepunktet /v1/data/<navn pÄ pakke>/<navn pÄ regel>. Hvert endepunkt kan ta
i mot et JSON-objekt som input, samt bruke statisk data du har definert pÄ forhÄnd.
OPA vil for hver regel returnere et resultat enten som true/false eller strukturert data.
Strukturering av OPA-policies og dataâ
Figuren til hĂžyre viser en mulig struktur for OPA-policies og data. For Ă„ skille ut OPA-relatert kode fra
resten av applikasjonskoden, oppretter vi mappen opa i roten av prosjektet vÄrt. Under denne mappen har vi
tre mapper: policies, data og schemas.
I mappen opa/policies definerer vi reglene vÄre og tester for disse, organisert i undermapper etter tema
eller funksjonalitet. Innenfor hver mappe kan vi ha flere rego-filer.
I mappen opa/data legger vi statiske data hvis reglene vÄre trenger dette. Dersom reglene vÄre trenger
forskjellige data i ulike miljÞer, mÄ via organiere dataen i undermapper etter miljÞ.
I mappen opa/schemas legger vi JSON-skjema for input og data, som kan brukes for statisk validering av
reglene vÄre med opa check.
Filen .manifest brukes under bygging av en OPA-bundle for Ä avgrense tilgang mellom pakker. Den kan ogsÄ
brukes for versjonering av policies og for Ă„ angi metadata.
âââ opa/
âââ policies/
â âââ .manifest
â âââ group_access/
â âââ group_access.rego
â âââ group_access_test.rego
âââ data/
â âââ local/
â â âââ .manifest
â â âââ groups/
â â âââ data.json
â âââ dev/
â â âââ .manifest
â â âââ groups/
â â âââ data.json
â âââ prod/
â âââ .manifest
â âââ groups/
â âââ data.json
âââ schemas/
âââ input_schema.json
âââ data_schema.json
Eksempelet over er kun illustrasjon av hvordan policies, data og schemas kan struktureres. Hvilken struktur du velger er opp til deg, og bÞr baseres pÄ hva som gir mest mening for ditt brukstilfelle og team. Det viktigste er at det er lett Ä finne frem i, og at det er tydelig hvilke regler og data som hÞrer sammen.
Autorisasjonsregler i Regoâ
FÞlgende er et eksempel pÄ en OPA-regel som sjekker om en bruker har tilgang til Ä utfÞre en handling basert pÄ
hvilke grupper brukeren tilhĂžrer. Handlingen (input.action) og gruppene brukeren tilhĂžrer (input.groups) sendes som input i spĂžrringen, mens hvilke grupper som har tilgang til hvilke handlinger er definert i data.groups.
package group_access
import rego.v1
default my_rule := false
# METADATA
# entrypoint: true
my_rule if {
some group in input.groups
group in data.groups[input.action]
}
package group_accessdefinerer pakkenavnet. Dette sammen med regelenmy_ruledanner endepunktet applikasjonen kaller nÄr den skal sjekke tilgang:/v1/data/group_access/my_ruledefault my_rule := falsesÞrger for at regelen alltid har et definert svar (deny-by-default)inputer JSON-objektet applikasjonen sender med spÞrringendataer den statiske JSON-dataen som er lastet inn i OPA# METADATAer kommentarer som brukes under bygging av OPA-bundler for Ä angi metadata om regelen og/eller pakken.entrypoint: truevil gjÞre regelen tilgjengelig pÄ et eget endepunkt. Du kan lese mer om metadata og hvordan det brukes i OPA-bundler i OPA-dokumentasjonen.
Underveis i utviklingen av policyene dine kan du kjÞre opa eval lokalt for Ä teste logikken i reglene dine uten Ä mÄtte spinne opp en OPA-server. For eksempel:
echo '{"groups": ["viewers"], "action": "read"}' | \
opa eval -I \
-d .opa/policy \
-d .opa/data/local \
'data.group_access.my_rule'
Du kan lese mer om policy-sprÄket Rego i OPA-dokumentasjonen.
Testing av OPA-reglerâ
OPA har innebygd stĂžtte for Ă„ skrive og kjĂžre enhetstester for reglene dine.
Testfiler er en Rego-fil med suffixet _test.rego, og bruker pakkenavn
<original-pakke>_test. For eksempel sÄ kan group_access_test.rego se slik ut:
package group_access_test
import rego.v1
# NB: data.group_access refererer her til pakken group_access, ikke den statiske dataen
import data.group_access
# Vi mocker statisk data og bruker den med `with data.groups as mock_data`
mock_data := {
"read": ["viewers", "editors", "admins"],
"write": ["editors", "admins"],
"delete": ["admins"],
}
test_allow_when_group_permitted_for_read if {
group_access.my_rule == true with input as {
"groups": ["viewers"],
"action": "read",
}
with data.groups as mock_data
}
test_deny_when_group_not_permitted_for_action if {
group_access.my_rule == false with input as {
"groups": ["viewers"],
"action": "delete",
}
with data.groups as mock_data
}
KjĂžr testene med:
opa test opa/policies
Linting av OPA-reglerâ
Regal er en linter for Rego-sprÄket. Linting gjÞres med kommandoen regal lint .opa/policy.
Regal sĂžrger for at reglene er strukturert etter beste praksis, og fanger opp ubrukte variabler, manglende default,
forveksling av == og :=, og mye annet. Installasjonsguide finner du i OPA sin dokumentasjon.
Statisk validering av OPA-reglerâ
OPA har en kommando for statisk validering av reglene dine, opa check.
Den sjekker Rego-filer for parsing- og kompileringsfeil, samt for sirkulĂŠre avhengigheter mellom regler og pakker.
Statisk validering gjĂžres med:
opa check opa/policies
Vi kan ogsÄ validere at reglene samsvarer med forhÄndsdefinerte JSON-skjema for input og data.
I eksempelet under knytter vi input til input_schema og data til data_schema, som begge er OpenAPI-skjema definert
i opa/schemas. Skjemavalidering er kun statisk validering av Rego-koden din, og gjelder ikke runtime.
package group_access
import rego.v1
default my_rule := false
# METADATA
# entrypoint: true
# schemas:
# - input: schema["input_schema"]
# - data.groups: schema["data_schema"]
my_rule if {
some group in input.groups
group in data.groups[input.action]
}
Vi kan da gjÞre skjemarvalidering av reglene vÄre med:
opa check -s opa/schemas opa/policies