OPA på SKIP
Hvis du har kommet hit har du skrevet OPA-policies og gjort de nødvendige endringene i applikasjonen din for å kalle OPA ved autorisasjonssjekker. Neste steg er å bygge en OPA-bundle og gjøre den tilgjengelig for OPA-sidecaren. Du kan lese mer om hva en bundle er her, men kort fortalt er det en zippet pakke som inneholder reglene (Rego-policies) og/eller dataene OPA trenger for å ta avgjørelser. OPA kan laste inn en eller flere bundles og bruke reglene og dataene i disse for å ta autorisasjonsbeslutninger.
Hvis du trenger ulik statisk data i ulike mijløer, må du bygge og publisere regler og data for hvert miljø i separate bundles.
Bygge bundle i GitHub Actions
Team Tilgangsstyring har lagd workflowen kartverket/github-workflows/.github/workflows/build-and-push-opa-bundle.yml, som gjør det enkelt for deg å bygge og publisere OPA-bundler til GHCR i GitHub Actions.
Eksempel på bruk av workflow
Følgende eksempel viser hvordan du kan bruke workflowen i ditt eget repo for å bygge og publisere en OPA bundle til GHCR når du pusher til ditt repo:
I tillegg til å bygge og publisere OPA-bundlen, vil workflowen også generere en SLSA provenance-attestasjon for bundlen og publisere den i GitHub's attestasjonssystem. Dette gjør at du kan verifisere hvordan bundlen ble bygd.
name: Build and push OPA bundle
on: [push]
permissions:
contents: read # for å kunne bygge fra repoet
packages: write # for å kunne pushe til GHCR
id-token: write # for å kunne kunne generere en OIDC-token for å signere provenance-attestasjonen med Sigstore
attestations: write # for å kunne publisere provenance-attestasjonen i GitHub's attestasjonssystem
security-events: write # for å kunne laste opp sarif-resultatet av `regal lint` i GitHub Advanced Security
actions: read # for å kunne hente metadata om workflowen som bygger bundlen og inkludere det i provenance-attestasjonen
jobs:
build:
uses: kartverket/github-workflows/.github/workflows/build-and-push-opa-bundle.yml@<release tag>
with:
# artifact-name (**påkrevd**) er navnet på det resulterende artefakten i GHCR (uten tag).
# Den er nødt til å starte med `ghcr.io/kartverket/<repo>`.
artifact-name: ghcr.io/${{ github.repository }}/opa-policies
# path (**påkrevd**) spesifiserer hvilken katalog det skal bygges en OPA bundle fra.
# Katalogen kan inneholde policyer skrevet i Rego og
path: opa/policies
# push er en boolean som spesifiserer om den bygde bundlen skal pushes til GHCR eller ikke.
# Defaulter til `true`.
push: true
# additional-tags` er en kommaseparert liste med ekstra tags som artefakten som pushes til GHCR skal tagges med.
# Workflowen vil alltid tagge artefakten med `sha256-<sha256sum av bygd bundle>` for å unngå opplasting av duplikate bundles.
additional-tags: ${{ github.ref_name }}
# test er en boolean som spesifiserer om `opa test` skal kjøres før bygging.
# Alle tester definert i filer som slutter på `_test.rego` i `path`-katalogen vil da kjøres.
# Defaulter til `false`.
test: true
# lint er en boolean som spesifiserer om `regal lint` skal kjøres før bygging.
# Alle Rego-filer definert i `path`-katalogen vil da bli lintet.
# Defaulter til `false`.
lint: true
# lint-config-file spesifiserer en filsti til en Regal-konfigurasjonsfil som brukes under linting.
# Hvordan du konfigurerer Regal gjennom en slik fil kan du lese mer om på https://www.openpolicyagent.org/projects/regal/configuration.
lint-config-file: .regal/config.yaml
# check er en boolean som spesifiserer om `opa check` skal kjøres før bygging.
# Alle filer definert i `path`-katalogen vil da bli statisk validert.
# Defaulter til `false`.
check: true
# check-schema-path er en sti til en JSON Schema-mappe eller fil som brukes under `opa check` for å
# validere at reglene dine samsvarer med skjemaet for `input` og `data`.
check-schema-path: opa/schemas
Konfigurere OPA-sidecar med SecurityConfig
Du har nå bygd en OPA bundle og publisert den til GHCR, og er klar til å bruke den i applikasjonen din. For å bruke OPA
trenger du å få OPA injisert som en sidecar sammen med din applikasjon. Dette gjøres ved å
spesifisere OPA som tilgjengelig sidecar-tjeneste.
Deretter konfigurerer du hvilke bundles OPA skal benytte under autorisajon med en SecurityConfig-ressurs.
Eksempel på SecurityConfig
Følgende SecurityConfig konfigurerer OPA-sidecaren til å laste inn to bundles.
- En bundle bestående av autorisasjonsregelene bygd fra mappen
opa/policies - En bundle bestående av produksjonsspesifikke data som reglene dine bruker, bygd fra mappen
opa/data/<MILJØ>
Vi konfigurerer også at Accesserator skal verifisere provenance-attestasjonen for bundlene, det vil si at Accesserator skal
verifisere at bundlene er bygd fra repoet kartverket/<REPO>, av workflowen .github/workflows/build-opa-bundle.yml, fra main-branchen.
spec.opa.bundleUrls[*].verification er under aktiv utvikling, og støtter per nå kun verifikasjon av bundles bygd fra workflow runs i åpne GitHub repoer.
apiVersion: accesserator.kartverket.no/v1alpha
kind: SecurityConfig
metadata:
name: security-config
namespace: tilgangsstyring-main
spec:
applicationRef: min-app
opa:
enabled: true
bundleUrls:
- name: group_access
url: ghcr.io/kartverket/<REPO>/opa-policies:<TAG>@sha256:<DIGEST>
verification:
source:
repository: kartverket/<REPO>
workflow: .github/workflows/build-opa-bundle.yml
ref: refs/heads/main
- name: group_access_data
url: ghcr.io/kartverket/<REPO>/opa-data-<MILJØ>:<TAG>@sha256:<DIGEST>
verification:
source:
repository: kartverket/<REPO>
workflow: .github/workflows/build-opa-bundle.yml
ref: refs/heads/main
Når Accesserator ser denne konfigurasjonen, vil den:
- Slå opp bundlen i i GHCR.
- Hente SLSA provenance-attestasjonen og verifisere den mot Sigstore.
- Sjekke at attestasjonen ble produsert i
repository, avworkflow, frarefdu spesifiserte. - Hvis SLSA provenance-attestasjonen ikke stemmer med det du har spesifisert, eller hvis den ikke er signert av en gyldig Sigstore-nøkkel, vil Accesserator avvise
SecurityConfigen og ressursen vil ikke bli lagd.
Hvilke felter som eksisterer for OPA i SecurityConfig og hva de gjør kan du lese mer om i API-dokumentasjonen.
Kalle OPA fra applikasjonen
Kubernetes-operatoren som injiserer OPA som sidecar vil også injisere miljøvariabelen OPA_URL. Applikasjonen din kan
bruke denne når den kaller OPA for autorisasjonssjekker.
curl -X POST "$OPA_URL/v1/data/group_access/my_rule" \
-H "Content-Type: application/json" \
-d '{"input":{"groups": ["viewers"], "action": "read"}}'