đ Klientregistrering
Klientregistrering er en sentral del av tilgangsstyring med OAuth 2.0 og OIDC. NÄr du registrerer en klient, fÄr applikasjonen sin egen identitet og kan autentisere seg mot de valgte identitetstilbyderne.
Vi anbefaler Ă„ ha et bevisst forhold til hvilke tjenester som skal dele samme audience
.
Det er ofte mer hensiktsmessig Ä velge en restriktiv tilnÊrming, der hver tjeneste fÄr sin egen klientregistrering,
fremfor Ä gruppere flere tjenester under én felles klient. Dette gir bedre kontroll over tilgangsstyring og sikkerhet.
Felles for alle identitetstilbydere pÄ SKIP er at klientregistrering stÞttes fra plattformen ved hjelp av Kubernetes-operatorer.
- Digdirator hÄndterer klientregistrering mot Digdir sine felleslÞsninger: ID-porten og Maskinporten.
- Azurerator hÄndterer klientregistrering mot Microsoft Entra ID (tidligere kjent som Azure Active Directory).
NÄr man skal registrere en klient mot en eller flere av identitetstilbyderne, har man tre valg. Man kan benytte seg av Skiperator dersom klientregistreringen hÞrer til en SKIP-applikasjon. Alternativt kan man bruke CRD-ene fra Digdirator og Azurerator direkte.
- Skiperator
- Digdirator / Azurerator
Skiperator tilbyr et forenklet API i CRD-en Application
for Ă„ registrere klienter mot ID-porten og Maskinporten.
Det jobbes ogsÄ med et forenklet API for Ä registrere klienter mot Entra ID, men dette er ikke helt klart ennÄ.
Fordelen med Ä benytte Skiperator for klientregistrering er at hemmelighetene som Digdirator oppretter blir automatisk injisert som miljÞvariabler i deploymenten til applikasjonen. Dette gjÞr at applikasjonen enkelt kan fÄ tilgang til hemmelighetene i et kjÞretidsmiljÞ.
- Entra ID
- ID-porten
- Maskinporten
đ§ UNDER UTVIKLING đ§â
Opprettelse av app-registrering i Entra ID via spesifikasjonen til Application
jobbes med, men er ikke klart helt ennÄ.
Skiperator tilbyr stĂžtte for Ă„ sette opp en klientintegrasjon mot ID-porten
via spesifikasjonen til Application
.
Eksempelet under setter opp en integrasjon mot ID-porten med fĂžlgende konfigurasjon.
- Integrasjonstypen settes til
api_klient
. - Redirect path settes til
/oauth/callback
. - Scopene
openid
ogprofile
settes.
Resten av feltene som stĂžttes kan du finne i Skiperator sin API-dokumentasjon.
apiVersion: skiperator.kartverket.no/v1alpha1
kind: Application
metadata:
name: application
namespace: tilgangsstyring-main
spec:
image: image
port: 8080
idporten:
enabled: true
integrationType: "api_klient"
redirectPath: "/oauth/callback"
scopes:
- "openid"
- "profile"
Skiperator tilbyr stĂžtte for Ă„ sette opp en klientintegrasjon mot Maskinporten
via spesifikasjonen til Application
.
Eksempelet under setter opp en integrasjon mot Maskinporten med fĂžlgende konfigurasjon.
- Scopet
innsyn
opprettes og organisasjonene HUSLĂS HURTIG TIGER AS og KOSTBAR LEKKER APE AS settes som godkjente konsumenter av dette scopet.
Resten av feltene som stĂžttes kan du finne i Skiperator sin API-dokumentasjon.
apiVersion: skiperator.kartverket.no/v1alpha1
kind: Application
metadata:
name: application
namespace: tilgangsstyring-main
spec:
image: image
port: 8080
maskinporten:
enabled: true
scopes:
exposes:
- name: "innsyn"
enabled: true
product: "ProduktomrÄde"
consumers:
- name: HUSLĂS HURTIG TIGER AS
orgno: "987654321"
- name: KOSTBAR LEKKER APE AS
orgno: "123456789"
Hvis en Ăžnsker Ă„ opprette en klientintegrasjon uten Ă„ knytte den til en Skiperator-applikasjon, kan man benytte seg av CRD-ene som Digdirator og Azurerator introduserer direkte. Dette gjĂžr det mulig Ă„ opprette og vedlikeholde klientregistreringen uavhengig av en spesifikk applikasjon i Skiperator.
Fordelen med denne tilnÊrmingen er at man fÄr full kontroll over konfigurasjonen og stor fleksibilitet ved Ä frikoble registreringen fra applikasjonen. Ulempen er at det krever mer innsikt i oppsettet, og at injisering av hemmeligheter i deploymenten mÄ hÄndteres separat.
- Entra ID
- ID-porten
- Maskinporten
En kan registrere en klient mot Entra ID ved Ă„ opprette en AzureAdApplication
-ressurs.
Registreringer opprettet med Azureator fÞlger fÞlgende navnekonvensjon basert pÄ AzureAdApplication
-manifestet: cluster:namespace:name
.
Spesifikasjonen til AzureAdApplication
â
spec (object, required) â Spesifikasjon til AzureAdApplication
allowAllUsers (bool, required) â Bestemmer om alle brukere i tenanten som Azurerator er konfigurert mot skal fĂ„ tilgang.
claims (object, optional) â Definerer konfigurasjon av claims som inkluderes i tokenene som returneres til Entra ID applikasjonen.
groups ([]object, optional) â En liste over Entra ID gruppe ID-er som skal inkluderes i groups
-claimet i tokenene utstedt av Entra ID. Dette tildeler ogsÄ grupper til app-registreringen brukt for tilgangskontroll. Kun direkte medlemmer av gruppene fÄr tilgang.
id (string, required) â Objekt-ID-en (OID) til en Entra ID-gruppe.
replyUrls ([]object, required) â URL-er som applikasjonen godtar som svaradresser etter autentisering.
url (string, required) â En godkjent svaradresse (reply URL) for applikasjonen.
logoutUrl (string, optional) â URL-en brukere blir omdirigert til nĂ„r de logger ut av applikasjonen..
preAuthorizedApplications ([]object, optional) â Definerer andre app-registreringer som er forhĂ„ndsautorisert til Ă„ fĂ„ tilgang til denne applikasjonen. Her refereres det til tilsvarende AzureAdApplication
.
application (string, required) â Navnet pĂ„ den forhĂ„ndsgodkjente applikasjonen.
namespace (string, required) â Namespacet hvor den forhĂ„ndsgodkjente applikasjonen befinner seg.
cluster (string, required) â Clusteret hvor den forhĂ„ndsgodkjente applikasjonen befinner seg.
permissions (object, optional) â Spesifiserer hvilke claims den forhĂ„ndsautoriserte applikasjonen har.
scopes ([]string, optional) â Liste med egendefinerte tilgangs-scopes tildelt til den forhĂ„ndsautoriserte appliaksjonen.
roles ([]string, optional) â Liste med egendefinerte tilgangs-roller tildelt til den forhĂ„ndsautoriserte appliaksjonen.
secretName (string, required) â Navnet pĂ„ den resulterende Secret
-ressursen som vil bli opprettet.
secretKeyPrefix (string, optional) â Et valgfritt brukerdefinert prefiks som brukes pĂ„ nĂžklene i den genererte hemmeligheten, og erstatter standardprefikset (AZURE).
secretProtected (bool, optional) â Angir om hemmeligheten skal tilbaketrekkes selv nĂ„r den ikke er i bruk.
singlePageApplication (bool, optional) â Angir om denne Entra ID-applikasjonen skal registreres som en single-page-application for bruk i klient-side-applikasjoner uten tilgang til hemmeligheter.
Eksempelâ
FĂžlgende eksempel oppretter app-registreringen atgcp1-sandbox:tilgangsstyring-main:test-app
.
Den gir kun tilgang til direkte medlemmer av gruppene med objekt-ID 2720e397-081d-4d9b-852e-0d81f45a304f
eller c3c94454-aefc-44f9-9076-58ea47547941
.
Den forhÄndsautoriserer ogsÄ Entra ID klienten atgcp1-dev:other-namespace:other-app
.
NÄr registrering er fullfÞrt vil Azurerator opprette Kubernetes-hemmeligheten entraid-secret
i namespacet tilgangsstyring-main
.
apiVersion: nais.io/v1
kind: AzureAdApplication
metadata:
name: test-app
namespace: tilgangsstyring-main
spec:
allowAllUsers: false
claims:
groups:
- id: 2720e397-081d-4d9b-852e-0d81f45a304f
- id: c3c94454-aefc-44f9-9076-58ea47547941
replyUrls:
- url: https://test-app.atgcp1-sandbox.kartverket-intern.cloud/oauth2/callback
preAuthorizedApplications:
- application: other-app
namespace: other-namespace
cluster: atgcp1-dev
En kan registrere en klient mot ID-porten ved Ă„ opprette en IDPortenClient
-ressurs.
Spesifikasjonen til IDPortenClient
â
spec (object, required) â Spesifikasjon til IDPortenClient
secretName (string, required) â Navnet pĂ„ den resulterende Secret
-ressursen som vil bli opprettet.
integrationType (string, optional) â Definerer integrasjonstypen for klienten. Bestemmer hvilke scopes som kan registreres. Kan ikke endres etter opprettelse. Tillatte verdier: krr
, idporten
, api_klient
.
scopes ([]string, optional) â Definerer OAuth2-scopes for klienten. Begrenset basert pĂ„ integrationType
.
frontchannelLogoutURI (string, optional) â URL som ID-porten omdirigere til nĂ„r en utlogging utlĂžses av en annen applikasjon.
postLogoutRedirectURIs ([]string, optional) â Liste over gyldige URI-er hvor ID-porten kan omdirigere etter utlogging.
redirectURIs ([]string], optional) â Liste over redirect URI-er som skal registreres hos DigDir.
accessTokenLifetime (integer, optional) â Maksimal levetid i sekunder for access_token
som returneres fra ID-porten. Min: 1, maks: 3600.
clientURI (string, optional) â URL til klienten brukt av DigDir nĂ„r en 'tilbake'-knapp vises eller ved feil.
clientName (string, optional) â Navnet pĂ„ klienten registrert hos DigDir. Vises under innlogging for brukerorienterte flyter.
sessionLifetime (integer, optional) â Maksimal Ăžktlevetid i sekunder for en innlogget sluttbruker for denne klienten. Min: 3600, maks: 28800.
ssoDisabled (bool, optional) â Kontrollerer Single Sign-On-oppsettet for klienten. Hvis satt til true
, er SSO deaktivert.
Eksempelâ
FĂžlgende eksempel registrerer en klientintegrasjon mot ID-porten av typen idporten
.
NÄr registrering er fullfÞrt vil Digdirator opprette Kubernetes-hemmeligheten idporten-secret
i namespacet tilgangsstyring-main
.
apiVersion: nais.io/v1
kind: IDPortenClient
metadata:
name: test-client
namespace: tilgansstyring-main
spec:
clientName: Test Application
clientURI: https://test-app.atgcp1-sandbox.kartverket-intern.cloud
frontchannelLogoutURI: https://test-app.atgcp1-sandbox.kartverket-intern.cloud/oauth2/logout
integrationType: idporten
redirectURIs:
- https://test-app.atgcp1-sandbox.kartverket-intern.cloud/oauth2/callback
scopes:
- openid
- profile
secretName: idporten-secret
En kan registrere en klient mot Maskinporten ved Ă„ opprette en MaskinportenClient
-ressurs.
Spesifikasjonen til MaskinportenClient
â
spec (object, required) â Spesifikasjon til MaskinportenClient
secretName (string, required) â Navnet pĂ„ den resulterende Secret
-ressursen som vil bli opprettet.
clientName (string, optional) â Navnet pĂ„ klienten registrert hos DigDir. Vises under innlogging for brukerorienterte flyter, og er ellers en lesbar mĂ„te Ă„ skille mellom klienter i DigDirs selvbetjeningsportal.
scopes ([]object, optional) â Definerer hvilke scopes applikasjonen konsumerer og hvilke den eksponerer.
consumes ([]object, optional) â En liste med scopes din klient kan forespĂžrre tilgang til.
name (string, required) â Scopene som applikasjonen konsumerer for Ă„ fĂ„ tilgang til en ekstern organisasjons API.
exposes ([]object, optional) â En liste med scopes din applikasjon Ăžnsker Ă„ eksponere til andre organisasjoner hvor tilgang er basert pĂ„ organisasjonsnummer.
enabled (bool, required) â Hvis true
, sÄ er detkonfigurerte scopet tilgjengelig for bruk og til Ä bli konsumert av organisasjoner som har fÄtt godkjent tilgang.
name (string, pĂ„krevd) â Det faktiske sub-scopet kombinert med product
.
product (string, valgfritt) â ProduktomrĂ„de tilknyttet scopet. Dette vil inkluderes i resultatet: org:<product><name>
.
atMaxAge (int, valgfritt) â Maksimal tillatt levetid for token i sekunder. Defaulter til 30 sekunder.
allowedIntegrations ([]string, valgfritt) â Liste over tillatte integrasjonstyper for dette eksponerte omfanget. Defaulter til maskinporten
.
consumers ([]object, valgfritt) â Liste over eksterne konsumenter som har tilgang til Ă„ konsumere dette scopet og som kan forespĂžrre access_token
.
orgno â Det eksterne organisasjonsnummeret.
name â Beskrivende felt brukt utelukkende for oversikt.
accessibleForAll â Tillater alle organisasjoner Ă„ fĂ„ tilgang til scopet.
delegationSource â Delegasjonskilde for scopet. Default er tomt, noe som betyr at ingen delegasjon er tillatt.
separator â Tegnet som skiller product
og name
i det endelige scopet. Resultatet blir da <prefix>:<product><separator><name>
. Defaulter til :
med mindre name
inneholder /
, i det tilfellet defaultes det til /
.
visibility â Kontrollerer synligheten til scopet. Offentlige scopes er synlige for alle, mens private scopes kun er synlige for organisasjonen som eier scopet og organisasjoner som har fĂ„tt tilgang som konsumenter. Defaulter til public
. Tillatte verdier: private
, public
.
Eksempelâ
FĂžlgende eksempel registrerer en klientintegrasjon mot Maskinporten og definerer scopet innsyn
.
Den setter HUSLĂS HURTIG TIGER AS og KOSTBAR LEKKER APE AS som godkjente konsumenter av scopet.
NÄr registrering er fullfÞrt vil Digdirator opprette Kubernetes-hemmeligheten maskinporten-secret
i namespacet tilgangsstyring-main
.
apiVersion: nais.io/v1
kind: MaskinportenClient
metadata:
name: test-client
namespace: tilgangsstyring-main
spec:
clientName: innsikt-secure-deltashare
scopes:
exposes:
- enabled: true
name: "innsyn"
product: "ProduktomrÄde"
consumers:
- name: HUSLĂS HURTIG TIGER AS
orgno: "987654321"
- name: KOSTBAR LEKKER APE AS
orgno: "123456789"
secretName: maskinporten-secret