From 2561af492b8bb0ef789ef1d9dd3358c0b047ecda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigvald=20H=C3=B8yheim?= Date: Mon, 26 Jan 2026 14:22:52 +0100 Subject: [PATCH 1/5] add generated checklist for idporten, maskinporten and ansattporten --- _docs/Maskinporten/maskinporten_checklist.md | 264 +++++++++++++++ .../maskinporten_samtykke_checklist.md | 123 +++++++ _docs/ansattporten/ansattporten_checklist.md | 253 ++++++++++++++ _docs/idporten/idporten_checklist.md | 317 ++++++++++++++++++ 4 files changed, 957 insertions(+) create mode 100644 _docs/Maskinporten/maskinporten_checklist.md create mode 100644 _docs/Maskinporten/maskinporten_samtykke_checklist.md create mode 100644 _docs/ansattporten/ansattporten_checklist.md create mode 100644 _docs/idporten/idporten_checklist.md diff --git a/_docs/Maskinporten/maskinporten_checklist.md b/_docs/Maskinporten/maskinporten_checklist.md new file mode 100644 index 000000000..4807ada39 --- /dev/null +++ b/_docs/Maskinporten/maskinporten_checklist.md @@ -0,0 +1,264 @@ +--- +title: Sjekkliste for Maskinporten Integrasjon +description: Krav og anbefalinger for integrasjon mot Maskinporten + +sidebar: maskinporten_sidebar +product: Maskinporten +--- + +# Sjekkliste for Maskinporten Integrasjon + +Denne sjekklisten gir en oversikt over krav og anbefalinger for integrasjon mot Maskinporten for både API-tilbydere og API-konsumenter. + +## Om Maskinporten + +Maskinporten er en tjeneste som tilbyr en enkel modell for API-sikring basert på OAuth2 protokollen og bruk av JWT-bearer grants. Den lar API-tilbydere definere tilganger til sine API, modellert som scopes, basert på konsumenten sine organisasjonsnummer. + +## For API-tilbyder + +### Før Oppstart + +#### Krav + +- [ ] **Få tildelt API-prefiks** + - Første gang må du bli manuelt satt opp som API-tilbyder + - Bestem `scope-prefix` du ønsker å bruke for dine APIer + - Send inn skjema for å få tildelt prefiks + - [Les mer: Manuell tildeling av prefix](maskinporten_guide_apitilbyder#1-manuell-tildeling-av-prefix) + +- [ ] **Akseptere bruksvilkår** + - Inngå Digdir sine bruksvilkår for fellesløsninger + +### Administrasjon av API/Scopes + +#### Krav + +- [ ] **Følge syntaks for scopes** + - Syntaks: `scope ::= prefix ':' subscope` + - Subscope bør beskrive ressursen best mulig (f.eks. `nav:trygdeopplysninger`) + - Bruk postfix for å skille lese/skrive-tilgang (f.eks. `.write`, `.read`) + - Fravær av postfix tolkes som kun lese-tilgang + - [Les mer: Beskrivelse av APIer](maskinporten_guide_apitilbyder#beskrivelse-av-apier) + +- [ ] **Sette synlighet på scope** + - `PUBLIC`: Synlig for alle på /scopes/all endepunkt + - `PRIVATE`: Kun synlig for API-tilbyder og konsumenter med tilgang + - `INTERNAL`: Intern bruk i Digitaliseringsdirektoratet + - [Les mer: Synlighet](maskinporten_guide_apitilbyder#synlighet) + +- [ ] **Sette scope-begrensninger** + - Sett `allowed_integration_types` for å begrense bruken + - Kan begrenses til kun maskinporten (server-til-server) eller idporten (brukerinnlogging) + - [Les mer: Scope-begrensninger](maskinporten_guide_apitilbyder#scope-begrensninger) + +- [ ] **Opprette scopes via selvbetjening** + - Bruk enten web-grensesnitt på Samarbeidsportalen eller selvbetjenings-API + - [Les mer: Opprette et API - via Samarbeidsportalen](maskinporten_guide_apitilbyder#1a-opprette-et-api---via-samarbeidsportalen) + - [Les mer: Opprette APIer - OAuth2-selvbetjeningsklient](maskinporten_guide_apitilbyder#2a-opprette-apier---oauth2-selvbetjeningsklient) + +### Tilgangsstyring + +#### Krav + +- [ ] **Gi tilgang til konsumenter** + - Gi tilgang basert på konsumentens organisasjonsnummer + - Kan gjøres via Samarbeidsportalen eller selvbetjenings-API + - [Les mer: Tilgangsstyring - via Samarbeidsportalen](maskinporten_guide_apitilbyder#1b-tilgangsstyring---via-samarbeidsportalen) + - [Les mer: Tilgangsstyring - OAuth2-selvbetjeningsklient](maskinporten_guide_apitilbyder#2b-tilgangsstyring---oauth2-selvbetjeningsklient) + +- [ ] **Revokere tilganger ved behov** + - Trekk tilbake tilganger ved å slette dem i selvbetjening + - [Les mer: Tilgangsstyring - via Samarbeidsportalen](maskinporten_guide_apitilbyder#1b-tilgangsstyring---via-samarbeidsportalen) + +### Token-validering + +#### Krav + +- [ ] **Validere token korrekt** + - Sjekk at `issuer` stemmer med Maskinporten ("https://maskinporten.no/" i prod) + - Validere signering og signeringssertifikat mot JWK-endepunkt + - Verifisere at `scope` stemmer med ditt API-endepunkt + - Validere at token ikke er utløpt (`exp`) + - [Les mer: Validere token](maskinporten_guide_apitilbyder#4-validere-token) + +- [ ] **Bruke consumer-claim for tilgangskontroll** + - Det er `consumer`-claimet som forteller hvilken konsument som har fått tokenet + - **Ikke** bruk `client_id` eller `client_org` (gamle claims som fjernes) + - [Les mer: Validere token](maskinporten_guide_apitilbyder#4-validere-token) + +- [ ] **Håndtere leverandør-informasjon korrekt (ved delegering)** + - Ved bruk av leverandør får du `supplier` og `delegation_source` claims + - Nyttig for logging og sporbarhet + - [Les mer: Validere token](maskinporten_guide_apitilbyder#4-validere-token) + +### Delegering via Altinn (valgfritt) + +#### Krav (hvis du bruker Altinn-delegering) + +- [ ] **Være tjenesteeier i Altinn** + - Påkrevd for å kunne bruke Altinn-delegering + - [Les mer: Bruke delegering i Altinn](maskinporten_guide_apitilbyder#bruke-delegering-i-altinn) + +- [ ] **Opprette delegeringsoppsett** + - Opprett scope med **delegeringskilde** + - Lag "delegerbar ressurs" i Altinn med det aktuelle scopet + - Gi tilgang til konsumenter (ikke leverandøren direkte) + - [Les mer: Bruke delegering i Altinn](maskinporten_guide_apitilbyder#bruke-delegering-i-altinn) + - [Les mer: Ekstern delegering](maskinporten_func_delegering) + +#### Anbefalinger + +- [ ] **Forstå begrensninger ved delegering** + - Scopes uten delegeringskilde kan ikke bruke Altinn-delegering + - Scopes med delegeringskilde kan ikke bruke interne delegeringsmekanismer (onbehalfof) + - [Les mer: Bruke delegering i Altinn](maskinporten_guide_apitilbyder#bruke-delegering-i-altinn) + +## For API-konsument + +### Opprette Integrasjon + +#### Krav + +- [ ] **Få tilgang til scope fra API-tilbyder** + - API-tilbyder må gi din organisasjon tilgang til scopet først + - [Les mer: Overordnet prosedyre](maskinporten_guide_apikonsument#overordnet-prosedyre-for-api-sikring-med-maskinporten) + +- [ ] **Opprette Maskinporten-integrasjon** + - Opprett en OAuth2-klient i Maskinporten + - Kan gjøres via Samarbeidsportalen eller selvbetjenings-API + - [Les mer: Opprett en integrasjon](maskinporten_guide_apikonsument#4-opprett-en-integrasjon-i-maskinporten) + +- [ ] **Konfigurere integrasjon med riktige egenskaper** + - `integration_type`: "maskinporten" + - `token_endpoint_auth_method`: "private_key_jwt" + - `grant_types`: "urn:ietf:params:oauth:grant-type:jwt-bearer" + - `scopes`: Scope(s) du har fått tildelt tilgang til + - `description`: God beskrivelse av tjenesten + - [Les mer: Opprett en integrasjon](maskinporten_guide_apikonsument#4-opprett-en-integrasjon-i-maskinporten) + +- [ ] **Velge autentiseringsmetode** + - Enten virksomhetssertifikat eller egen asymmetrisk nøkkel + - Maskinporten aksepterer kun sertifikat og nøkler (ikke client_secret) + - [Les mer: Opprett en integrasjon](maskinporten_guide_apikonsument#4-opprett-en-integrasjon-i-maskinporten) + +#### Anbefalinger + +- [ ] **Lage separate klienter for ulike APIer** + - Sikkerhetsrisiko å la samme klient ha tilgang til for mange APIer + - [Les mer: Opprett en integrasjon](maskinporten_guide_apikonsument#4-opprett-en-integrasjon-i-maskinporten) + +- [ ] **Bruke egen nøkkel fremfor virksomhetssertifikat** + - Unngå å spre virksomhetssertifikatet til mange systemer + - Opprett asymmetriske nøkler knyttet til enkelt-integrasjoner + - [Les mer: Registrere klient som bruker egen nøkkel](maskinporten_guide_apikonsument#registrere-klient-som-bruker-egen-nøkkel) + +### Token-forespørsel (JWT-grant) + +#### Krav + +- [ ] **Generere og signere JWT korrekt** + - Bruk virksomhetssertifikat eller registrert asymmetrisk nøkkel for signering + - [Les mer: Be om token](maskinporten_guide_apikonsument#5-be-om-token) + +- [ ] **Inkludere påkrevde claims i JWT** + - `aud`: https://maskinporten.no/ (eller aktuelt miljø fra well-known) + - `iss`: Din egen client_id + - `scope`: Space-separert liste over scopes + - `iat`: Tidspunkt for når JWT ble laget (UTC-tid) + - `exp`: Utløpstidspunkt (Maks 120 sekunder: exp - iat <= 120) + - [Les mer: Be om token](maskinporten_guide_apikonsument#5-be-om-token) + +- [ ] **Ikke gjenbruke JWT** + - Hver JWT må være unik + - Bruk `jti` (JWT ID) for å sikre unikhet + - [Les mer: Be om token](maskinporten_guide_apikonsument#5-be-om-token) + +#### Anbefalinger + +- [ ] **Be om ett scope per token** + - Sikkerhetsmessig problematisk å be om mange scopes i samme token + - [Les mer: Be om token](maskinporten_guide_apikonsument#5-be-om-token) + +### API-kall + +#### Krav + +- [ ] **Bruke access_token som Authorization-header** + - Typisk format: `Authorization: Bearer ` + - Følg API-tilbyders dokumentasjon + - [Les mer: Sende API-kall med token](maskinporten_guide_apikonsument#6-sende-api-kall-med-token) + +- [ ] **Håndtere token-utløp** + - Ved 401-respons fra API: Hent nytt token + - Gjenbruk token for flere API-kall innen levetiden + - [Les mer: Sende API-kall med token](maskinporten_guide_apikonsument#6-sende-api-kall-med-token) + +### Delegering via Altinn (for leverandører) + +#### Krav (hvis du er leverandør) + +- [ ] **Registrere integrasjon korrekt** + - **Viktig**: Opprett integrasjon som tilhørende deg selv + - **Ikke** velg "på vegne av en kunde" eller "på vegne av flere kunder" + - Hvis du bruker selvbetjenings-API: Bruk `idporten:dcr.write` (ikke `idporten:dcr.supplier`) + - Ikke sett `client_orgno` i registreringskallet + - [Les mer: Bruke delegering som leverandør](maskinporten_guide_apikonsument#bruke-delegering-som-leverandør) + +- [ ] **Inkludere consumer_org i JWT-grant** + - Oppgi konsumentens organisasjonsnummer som `consumer_org` claim + - Maskinporten sjekker Altinn om gyldig delegeringsforhold finnes + - [Les mer: Bruke delegering som leverandør](maskinporten_guide_apikonsument#bruke-delegering-som-leverandør) + +- [ ] **Få delegering fra konsument i Altinn** + - Konsumentens bemyndiget ansatt må logge inn i Altinn og delegere tilgangen til deg + - [Les mer: Bruke delegering som konsument](maskinporten_guide_apikonsument#bruke-delegering-som-konsument) + - [Les mer: Altinns dokumentasjon](https://altinn.github.io/docs/utviklingsguider/sikkerhet-i-eoppslag/tilgangsstyrer/) + +## Generelle Krav + +### Sikkerhet og Nøkkelhåndtering + +#### Krav + +- [ ] **Etablere sikker nøkkelhåndtering** + - Beskytte private nøkler og virksomhetssertifikater + - Definere prosedyrer for oppbevaring, backup, og tilgangsstyring + - Dokumentere rutiner for fornyelse og kompromitteringshåndtering + +- [ ] **Gjennomføre risikovurdering** + - Vurder sikkerhet i egen løsning + - Vurder hvor mange APIer en klient skal ha tilgang til + +- [ ] **Åpne for Maskinporten sine IP-adresser** + - Dersom utgående brannmur: Åpne for Maskinporten sine IP-adresser + +### Logging og Sporing + +#### Krav + +- [ ] **Implementere tilstrekkelig logging** + - Logg token-forespørsler og API-kall + - Logg feil og sikkerhetshendelser + - For API-tilbydere: Logg consumer-informasjon for sporbarhet + +### Testing + +#### Krav + +- [ ] **Teste i riktig testmiljø** + - Bruk test-miljø før produksjon + - Verifiser at integrasjon fungerer som forventet + +## Ressurser + +- [Maskinporten overordnet](maskinporten_overordnet) +- [Maskinporten på Samarbeidsportalen](https://samarbeid.digdir.no) +- [Guide for API-tilbydere](maskinporten_guide_apitilbyder) +- [Guide for API-konsumenter](maskinporten_guide_apikonsument) +- [JWT-grant spesifikasjon](maskinporten_protocol_jwtgrant) +- [Ekstern delegering](maskinporten_func_delegering) +- [Selvbetjenings-API](../../idporten/oidc/oidc_api_admin) +- [Selvbetjenings-API for Maskinporten](../../idporten/oidc/oidc_api_admin_maskinporten) +- [Samtykketoken i Maskinporten](maskinporten_func_samtykke) +- [Sjekkliste for Samtykketoken](maskinporten_samtykke_checklist) +- [Altinn: Sikkerhet i eOppslag](https://altinn.github.io/docs/utviklingsguider/sikkerhet-i-eoppslag/tilgangsstyrer/) diff --git a/_docs/Maskinporten/maskinporten_samtykke_checklist.md b/_docs/Maskinporten/maskinporten_samtykke_checklist.md new file mode 100644 index 000000000..577e8ab5a --- /dev/null +++ b/_docs/Maskinporten/maskinporten_samtykke_checklist.md @@ -0,0 +1,123 @@ +--- +title: Sjekkliste for Samtykketoken i Maskinporten +description: Krav og anbefalinger for bruk av samtykketoken + +sidebar: maskinporten_sidebar +product: Maskinporten +--- + +# Sjekkliste for Samtykketoken i Maskinporten + +Denne sjekklisten gir en oversikt over krav og anbefalinger for bruk av samtykketoken i Maskinporten. + +## For API-tilbyder/Tjenesteeier + +### Krav + +- [ ] **Opprette samtykkeressurs i Altinn 3** + - Samtykkeressursen må opprettes i Altinn 3 før løsningen kan tas i bruk + - [Les mer om samtykke for tjenesteeier](https://docs.altinn.studio/nb/authorization/guides/resource-owner/consent/) + - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) + +- [ ] **Validere ID-claim i tokenet** + - API-tilbyder må validere at `id` (samtykkets uuid) i tokenet er korrekt + - [Les mer: For API-tilbyder/Tjenesteeier](maskinporten_func_samtykke#for-api-tilbydertjenesteeier) + +- [ ] **Validere from-claim i tokenet** + - API-tilbyder må validere at `from` (hvem som har gitt samtykket) i tokenet er korrekt + - [Les mer: For API-tilbyder/Tjenesteeier](maskinporten_func_samtykke#for-api-tilbydertjenesteeier) + +- [ ] **Validere to-claim i tokenet** + - API-tilbyder må validere at `to` (organisasjonen samtykket er gitt til) i tokenet er korrekt + - [Les mer: For API-tilbyder/Tjenesteeier](maskinporten_func_samtykke#for-api-tilbydertjenesteeier) + +- [ ] **Validere scope i tokenet** + - API må validere at riktig scope er inkludert i tokenet + - [Les mer: Respons](maskinporten_func_samtykke#respons) + +- [ ] **Sikre at sluttbruker aksepterer samtykket** + - Samtykket må aksepteres av sluttbruker før det kan brukes + - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) + +- [ ] **Følge datatilsynets krav til samtykke** + - Samtykkeløsningen må oppfylle [datatilsynets krav til samtykke for å behandle personopplysninger](https://www.datatilsynet.no/rettigheter-og-plikter/virksomhetenes-plikter/behandlingsgrunnlag/veileder-om-behandlingsgrunnlag/?id=176) + - [Les mer: Bakgrunn](maskinporten_func_samtykke#bakgrunn) + +### Anbefalinger + +- [ ] **Bruke uuid fra Altinn ved oppretting** + - Oppbevar den uuid som returneres fra Altinn ved oppretting av samtykkeressurs + - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) + +- [ ] **Les Altinns dokumentasjon** + - Les grundig gjennom [Altinns guide - Kom igang med samtykke](https://docs.altinn.studio/nb/authorization/getting-started/consent/) for mer detaljer + - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) + +## For Datakonsument/Tjenesteleverandør + +### Krav + +- [ ] **Opprette Maskinporten-integrasjon** + - Datakonsument må opprette en Maskinporten-integrasjon gjennom selvbetjening på [Samarbeidsportalen](https://samarbeid.digdir.no) + - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) + +- [ ] **Ha tilgang til API-tilbyders scope** + - Klienten må ha tilgang til å knytte API-tilbyders/tjenesteeiers scope til klienten + - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) + +- [ ] **Bruke RAR-forespørsel av type `urn:altinn:consent`** + - Forespørselen må bruke riktig type i henhold til OAuth2-utvidelsen for Rich Authorization Requests (RAR) + - [Les mer: Grensesnittsdefinisjon](maskinporten_func_samtykke#grensesnittsdefinisjon) + +- [ ] **Inkludere påkrevde claims i forespørselen** + - `type`: Må alltid være `urn:altinn:consent` + - `id`: Samtykkeressursens uuid + - `from`: Orgno eller pid på den som har gitt samtykket (format: `urn:altinn:person:identifier-no:12345678910` eller `urn:altinn:organization:identifier-no:123456789`) + - [Les mer: Forespørsel](maskinporten_func_samtykke#forespørsel) + +- [ ] **Forespørre ett eller flere OAuth2 scopes** + - JWT-grantet må alltid inkludere ett eller flere OAuth2 scopes + - [Les mer: Forespørsel](maskinporten_func_samtykke#forespørsel) + +- [ ] **Kun spørre på ett samtykke om gangen** + - Det er kun mulig å forespørre ett samtykke per token-request + - [Les mer: Forespørsel](maskinporten_func_samtykke#forespørsel) + +- [ ] **Sikre at consumer matcher to-claim** + - Leverandørens organisasjonsnummer i `consumer`-claimet må matche verdien i `to` for å få et samtykketoken + - [Les mer: Respons](maskinporten_func_samtykke#respons) + +- [ ] **Håndtere delegering ved bruk av delegerte scopes** + - Ved bruk av delegerte scopes må samtykket være gitt til den som har delegert scopet til den gitte Maskinporten-klienten + - [Les mer om delegering](maskinporten_func_delegering) + - [Les mer: Hva inneholder et samtykke-token?](maskinporten_func_samtykke#hva-inneholder-et-samtykke-token-) + +### Anbefalinger + +- [ ] **Les dokumentasjon om delegering** + - Hvis tilgang til scope ikke er gitt direkte til tjenesteleverandør, les nærmere om [delegering](https://docs.digdir.no/docs/Maskinporten/maskinporten_func_delegering.html) + - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) + +## Generelle anbefalinger + +- [ ] **Forstå samtykke-tokenets innhold** + - Gjør deg kjent med alle claims som inkluderes i responsen: `type`, `id`, `from`, `to`, `consented`, `validTo`, `consentRights` + - [Les mer: Respons](maskinporten_func_samtykke#respons) + +- [ ] **Sjekk validTo-tidsstempel** + - Vær oppmerksom på at samtykket har et utløpstidspunkt (`validTo`) + - [Les mer: Respons](maskinporten_func_samtykke#respons) + +- [ ] **Forstå samtykkerettigheter (consentRights)** + - Sjekk at du forstår strukturen på `consentRights` som inneholder `action`, `resource` og eventuelt `metadata` + - [Les mer: Respons](maskinporten_func_samtykke#respons) + +## Ressurser + +- [Samtykketjenesten på Samarbeidsportalen](https://samarbeid.digdir.no/altinn/samtykketjenesten/2337) +- [Datatilsynets krav til samtykke](https://www.datatilsynet.no/rettigheter-og-plikter/virksomhetenes-plikter/behandlingsgrunnlag/veileder-om-behandlingsgrunnlag/?id=176) +- [Altinn: Samtykke for tjenesteeier](https://docs.altinn.studio/nb/authorization/guides/resource-owner/consent/) +- [Altinn: Kom igang med samtykke](https://docs.altinn.studio/nb/authorization/getting-started/consent/) +- [RFC 9396: Rich Authorization Requests (RAR)](https://datatracker.ietf.org/doc/rfc9396/) +- [Maskinporten: JWT-grant](maskinporten_protocol_jwtgrant) +- [Maskinporten: Delegering](maskinporten_func_delegering) diff --git a/_docs/ansattporten/ansattporten_checklist.md b/_docs/ansattporten/ansattporten_checklist.md new file mode 100644 index 000000000..7ecccd310 --- /dev/null +++ b/_docs/ansattporten/ansattporten_checklist.md @@ -0,0 +1,253 @@ +--- +title: Sjekkliste for Ansattporten Integrasjon +description: Krav og anbefalinger for integrasjon mot Ansattporten + +sidebar: ansattporten +product: Ansattporten +--- + +# Sjekkliste for Ansattporten Integrasjon + +Denne sjekklisten gir en oversikt over krav og anbefalinger for integrasjon mot Ansattporten. + +## Om Ansattporten + +Ansattporten er en egen innloggingtjeneste med funksjonalitet tilpasset innlogging i ansatt/representasjonskontekst. Den deler samme kildekode-base som ID-porten, men er en selvstendig tjeneste med egne særtrekk. + +## Før Oppstart + +### Krav + +- [ ] **Akseptere bruksvilkår** + - Alle kunder som har inngått Digdir sine bruksvilkår for fellesløsninger kan bruke Ansattporten + - [Les mer: Hvem kan bruke Ansattporten?](ansattporten_om#hvem-kan-bruke-ansattporten-) + - [Les mer: Hvordan administrerer jeg Ansattporten?](ansattporten_om#hvordan-administrerer-jeg-ansattporten-) + +- [ ] **Registrere integrasjon i selvbetjening** + - Bruk selvbetjeningsløsningen på Samarbeidsportalen til å registrere integrasjonen + - **Kritisk**: Sett `integration_type` til `ansattporten` (ikke `idporten`) + - [Les mer: Hvordan administrerer jeg Ansattporten?](ansattporten_om#hvordan-administrerer-jeg-ansattporten-) + +- [ ] **Forstå forskjellen mellom Ansattporten og ID-porten** + - Ansattporten er en egen "port" - isolert fra ID-porten + - Ingen SSO mellom ID-porten og Ansattporten + - Ingen SSO mellom ulike tjenester i Ansattporten (isolert SSO-sesjon) + - [Les mer: Egen "port"](ansattporten_om#egen-port) + - [Les mer: Ingen SSO-funksjonalitet mellom tjenester](ansattporten_om#ingen-sso-funksjonalitet-mellom-tjenester) + +### Anbefalinger + +- [ ] **Vurdere bruksscenario** + - Ansattporten støtter tre brukerreiser: + 1. Vanlig innlogging (med isolert SSO) + 2. Innlogging på vegne av virksomhet + 3. Datadeling på vegne av virksomhet + - [Les mer: Hvilken bruk-scenario støttes?](ansattporten_om#hvilken-bruk-scenario-støttes-) + +## Autentiseringsforespørsel + +### Krav + +- [ ] **Bruke PKCE (Proof Key for Code Exchange)** + - Alle klienter må som hovedregel bruke PKCE i autentiseringsforespørselen + - `code_verifier` må være minst 43 karakterer lang, og ikke lengre enn 128 karakterer + - Støtter kun `code_challenge_method=S256` + - [Les mer: PKCE](../../idporten/oidc/oidc_func_pkce) + +- [ ] **Inkludere påkrevde parametere i autentiseringsforespørsel** + - `client_id`: Din registrerte klient-ID + - `redirect_uri`: Forhåndsregistrert redirect URI + - `scope`: Minimum `openid` + - `response_type`: `code` for autorisasjonskode-flyt + - `code_challenge`: Hash'et versjon av code_verifier + - `code_challenge_method`: `S256` + - [Les mer: Vanlig innlogging](ansattporten_guide) + +- [ ] **Bruke korrekt issuer-verdi** + - Ansattporten er en egen OAuth2 autorisasjonsserver med egen issuer-verdi + - Valider at issuer stemmer med Ansattporten (ikke ID-porten) + - [Les mer: Egen "port"](ansattporten_om#egen-port) + +### Anbefalinger + +- [ ] **Bruke state-parameter** + - Inkluder `state` i autentiseringsforespørselen for å beskytte mot CSRF-angrep + +- [ ] **Bruke nonce-parameter** + - Inkluder `nonce` i autentiseringsforespørselen for ekstra beskyttelse mot replay-angrep + +- [ ] **Vurdere PAR (Pushed Authorization Request)** + - For tjenester med høye krav til sikkerhet + +## Representasjon og Organisasjonsvelger + +### Krav (hvis du bruker representasjonsfunksjonalitet) + +- [ ] **Være tjenesteeier i Altinn** + - Kun kunder som er tjenesteeier i Altinn kan bruke funksjonaliteten med organisasjonsvelger og tilgangstyring + - [Les mer: Hvem kan bruke Ansattporten?](ansattporten_om#hvem-kan-bruke-ansattporten-) + +- [ ] **Forstå autorative kilder for representasjon** + - Ansattporten har ikke egen database/register over roller/rettigheter + - Baserer seg på eksterne, autorative kilder (Altinn Autorisasjon) + - [Les mer: Autorative kilder for representasjon](ansattporten_om#autorative-kilder-for-representasjon) + +- [ ] **Håndtere organisasjonsvelger korrekt** + - Dersom tjenesten krever representasjon, vises organisasjonsvelger til brukeren + - Velgeren er forhåndspopulert fra autorativ kilde + - [Les mer: Autorative kilder for representasjon](ansattporten_om#autorative-kilder-for-representasjon) + +### Anbefalinger + +- [ ] **Implementere innlogging på vegne av virksomhet** + - Følg guide for representasjonsbasert innlogging + - [Les mer: Innlogging på vegne av virksomhet](ansattporten_representasjon) + +- [ ] **Implementere datadeling på vegne av virksomhet** + - Følg guide for OAuth2-basert datadeling + - [Les mer: Datadeling på vegne av virksomhet](ansattporten_oauth2) + +## Token-håndtering + +### Krav + +- [ ] **Implementere korrekt klientautentisering** + - Velg én av støttede metoder: + - `client_secret_basic` / `client_secret_post` - basert på client_secret + - `private_key_jwt` - basert på JWT'er signert med virksomhetssertifikat (anbefalt for høy sikkerhet) + +- [ ] **Sende code_verifier i token-forespørsel** + - Inkluder den originale `code_verifier` i token-forespørselen for å fullføre PKCE-flyten + +- [ ] **Validere ID-token korrekt** + - Følg kapittel 3.1.3.7 i OpenID Connect Core 1.0 spesifikasjonen + - Validere `iss` (issuer) - må stemme med Ansattporten, ikke ID-porten + - Validere `aud`, `exp`, `iat`, `nonce` (hvis brukt) + - Verifiser signatur mot Ansattporten sitt JWK-endepunkt + - [Les mer: OpenID Connect ID Token Validation](https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation) + +- [ ] **Respektere token-levetider** + - ID-token: Kort levetid, brukes til å opprette lokal sesjon + - Access-token: Typisk 120 sekunder + - Refresh-token: Brukes til å fornye access-token uten brukerinteraksjon + +### Anbefalinger + +- [ ] **Bruke virksomhetssertifikat for klientautentisering** + - Anbefalt metode for klienter med høye krav til sikkerhet + +- [ ] **Bruke well-known endepunkt for dynamisk konfigurasjon** + - Bruk Ansattporten sitt well-known-endepunkt for å finne metadata + - Hent signeringssertifikat fra JWK-endepunkt dynamisk + - Sikrer kontinuerlig tjenesteleveranse ved sertifikatbytte + - [Les mer: Well-known endepunkt](ansattporten_wellknown) + +## Sesjonshåndtering + +### Krav + +- [ ] **Forstå isolert SSO-sesjon** + - Ansattporten har ikke SSO mellom ulike tjenester + - Alle klienter får tvangssatt isolert SSO-sesjon + - [Les mer: Ingen SSO-funksjonalitet mellom tjenester](ansattporten_om#ingen-sso-funksjonalitet-mellom-tjenester) + - [Les mer: Isolert SSO-sesjon](../../idporten/oidc/oidc_func_nosso) + +- [ ] **Implementere utlogging** + - Siden SSO er isolert, påvirkes ikke andre tjenester ved utlogging + - Redirect til /endsession-endepunktet ved utlogging + +- [ ] **Konfigurere lokal sesjon til maksimalt 30 minutters inaktivitet** + - Lokal timeout skal være maksimalt 30 minutter ved inaktivitet + +### Anbefalinger + +- [ ] **Følge samme sesjonstider som ID-porten** + - Maksimum 120 minutter fra første autentisering + - Inaktivitet over 30 minutter vil utløpe sesjonen + +## Sikkerhet og Nøkkelhåndtering + +### Krav + +- [ ] **Etablere sikker nøkkelhåndtering** + - Beskytte private nøkler (client_secret, asymmetriske nøkler, virksomhetssertifikat) + - Definere prosedyrer for nøkkeloppbevaring, backup, og tilgangsstyring + - Dokumentere rutiner for nøkkelfornyelse og kompromitteringshåndtering + +- [ ] **Gjennomføre risikovurdering** + - Gjøre en risikovurdering av egen løsning + +- [ ] **Åpne for Ansattporten sine IP-adresser** + - Dersom utgående brannmur: Åpne for Ansattporten sine IP-adresser + - [Les mer: IP-adresser](../../general/IP) + +### Anbefalinger + +- [ ] **Bruke HSM for nøkkeloppbevaring** + - For optimal beskyttelse: Oppbevar private nøkler i kryptografisk hardware (HSM) + +- [ ] **Implementere rotasjon av asymmetriske nøkler** + - For kunder med mange integrasjoner: Bruk virksomhetssertifikat til å automatisere vedlikehold + - La hver integrasjon bruke asymmetrisk nøkkel som roteres hyppig + +## Logging og Sporing + +### Krav + +- [ ] **Implementere tilstrekkelig logging** + - Logg følgende om autentiseringsforsøk: + - Dato og tidspunkt + - Hvilken handling som ble forsøkt + - Resultatet av handlingen + - Brukerens IP-adresse + - SessionIndex / sid + - Eventuelt valgt organisasjon (ved representasjon) + +- [ ] **Vurdere personvern i logging** + - Vurder behovet for logging opp mot personvernbetraktninger + +## Testing + +### Krav + +- [ ] **Teste i riktig testmiljø** + - Test-miljø: `https://test.ansattporten.no` + - Prod-miljø: `https://ansattporten.no` + - [Les mer: Well-known endepunkt](ansattporten_wellknown) + +- [ ] **Bruke korrekt well-known endepunkt** + - Test: [https://test.ansattporten.no/.well-known/openid-configuration](https://test.ansattporten.no/.well-known/openid-configuration) + - Prod: [https://ansattporten.no/.well-known/openid-configuration](https://ansattporten.no/.well-known/openid-configuration) + - [Les mer: Well-known endepunkt](ansattporten_wellknown) + +## Kostnader + +### Forstå finansieringsmodell + +- [ ] **Kjenne til kostnadsmodell** + - Ansattporten har samme finansieringsmodell som ID-porten + - 200.000-innnloggingskvoten er felles for de to portene + - Finansieringsmodell kan endre seg i fremtiden + - [Les mer: Hva koster Ansattporten?](ansattporten_om#hva-koster-ansattporten-) + +## Problemer og Support + +### Ved problemer + +- [ ] **Kontakte servicedesk ved problemer** + - E-post: servicedesk@digdir.no + - Oppgi: client_id, miljø og beskrivelse av problemet + +## Ressurser + +- [Ansattporten er nå i produksjon (Samarbeidsportalen)](https://samarbeid.digdir.no/ansattporten/ansattporten-er-no-i-produksjon-som-ei-fullverdig-fellesloysing/2969) +- [Hva er Ansattporten?](ansattporten_om) +- [Vanlig innlogging](ansattporten_guide) +- [Innlogging på vegne av virksomhet](ansattporten_representasjon) +- [Datadeling på vegne av virksomhet](ansattporten_oauth2) +- [Ansattporten protokoll](ansattporten_protocol) +- [Well-known endepunkt](ansattporten_wellknown) +- [Isolert SSO-sesjon](../../idporten/oidc/oidc_func_nosso) +- [PKCE - Proof Key for Code Exchange](../../idporten/oidc/oidc_func_pkce) +- [OpenID Connect Core 1.0 spesifikasjon](https://openid.net/specs/openid-connect-core-1_0.html) +- [Altinn Autorisasjon](https://altinn.github.io/docs/utviklingsguider/sikkerhet-i-eoppslag/tilgangsstyrer/) diff --git a/_docs/idporten/idporten_checklist.md b/_docs/idporten/idporten_checklist.md new file mode 100644 index 000000000..30336a483 --- /dev/null +++ b/_docs/idporten/idporten_checklist.md @@ -0,0 +1,317 @@ +--- +title: Sjekkliste for ID-porten Integrasjon +description: Krav og anbefalinger for integrasjon mot ID-porten + +sidebar: oidc +product: ID-porten +--- + +# Sjekkliste for ID-porten Integrasjon + +Denne sjekklisten gir en oversikt over krav og anbefalinger for integrasjon mot ID-porten. + +## Før Oppstart + +### Krav + +- [ ] **Akseptere bruksvilkår** + - Les og aksepter bruksvilkår for ID-porten + - [Les mer: Hvordan få tilgang til ID-porten](https://samarbeid.digdir.no/id-porten/ta-i-bruk-id-porten/94) + - [Les mer: Overordnet arkitekturbeskrivelse](idporten_overordnet#hvordan-få-tilgang-til-id-porten) + +- [ ] **Registrere integrasjon i selvbetjening** + - Bruk selvbetjeningsløsningen på Samarbeidsportalen til å registrere påkrevd informasjon om integrasjonen + - [Les mer: Klientregistrering](oidc_func_clientreg) + - [Les mer: Overordnet arkitekturbeskrivelse](idporten_overordnet#bruk-selvbetjening-til-å-registere-integrasjonen-din) + +- [ ] **Sende inn logo** + - Kunde må sende logo til ID-porten som brukes i innloggingsbildet + - Filformat: .png, .jpg eller .gif + - Maksimal høyde: 90 pixel + - Bredde: ikke overskride 135 pixel + - Bakgrunnsfarge: #f3f4f4 eller transparent bakgrunn + - [Les mer: Logo](idporten_logo) + - [Les mer: Overordnet arkitekturbeskrivelse](idporten_overordnet#send-oss-logoen-din) + +## Autentiseringsforespørsel + +### Krav + +- [ ] **Bruke PKCE (Proof Key for Code Exchange)** + - Alle klienter må som hovedregel bruke PKCE i autentiseringsforespørselen + - `code_verifier` må være minst 43 karakterer lang, og ikke lengre enn 128 karakterer + - Støtter kun `code_challenge_method=S256` + - [Les mer: PKCE](oidc_func_pkce) + - [Les mer: Integrasjonsguide](oidc_guide_idporten#1-autentiseringsforespørsel-til-autorisasjons-endepunktet) + +- [ ] **Inkludere påkrevde parametere i autentiseringsforespørsel** + - `client_id`: Din registrerte klient-ID + - `redirect_uri`: Forhåndsregistrert redirect URI + - `scope`: Minimum `openid` + - `response_type`: `code` for autorisasjonskode-flyt + - `code_challenge`: Hash'et versjon av code_verifier + - `code_challenge_method`: `S256` + - [Les mer: Autorisasjonsendepunktet](oidc_protocol_authorize) + - [Les mer: Integrasjonsguide](oidc_guide_idporten#1-autentiseringsforespørsel-til-autorisasjons-endepunktet) + +- [ ] **Forespørre korrekt sikkerhetsnivå (acr_values)** + - Spesifiser korrekt sikkerhetsnivå basert på risikovurdering + - Gyldige verdier: `idporten-loa-substantial`, `idporten-loa-high` + - [Les mer: Veileder for valg av sikkerhetsnivå](https://www.digdir.no/digital-samhandling/veileder-identifikasjon-og-sporbarhet-i-elektronisk-kommunikasjon-med-og-i-offentlig-sektor/2992#veiledning_for_valg_av_sikkerhetsniv_for_identifikasjon) + - [Les mer: Autorisasjonsendepunktet](oidc_protocol_authorize) + +### Anbefalinger + +- [ ] **Bruke state-parameter** + - Inkluder `state` i autentiseringsforespørselen for å beskytte mot CSRF-angrep + - [Les mer: Integrasjonsguide](oidc_guide_idporten#1-autentiseringsforespørsel-til-autorisasjons-endepunktet) + +- [ ] **Bruke nonce-parameter** + - Inkluder `nonce` i autentiseringsforespørselen for ekstra beskyttelse mot replay-angrep + - [Les mer: Integrasjonsguide](oidc_guide_idporten#1-autentiseringsforespørsel-til-autorisasjons-endepunktet) + +- [ ] **Vurdere PAR (Pushed Authorization Request)** + - For tjenester med høye krav til sikkerhet bør du bruke PAR til å POSTe autentiseringsparametrene direkte til ID-porten + - Dette beskytter parametrene mot manipulasjon i brukers browser + - [Les mer: PAR](oidc_protocol_par) + - [Les mer: Integrasjonsguide](oidc_guide_idporten#1-autentiseringsforespørsel-til-autorisasjons-endepunktet) + +- [ ] **Sette ui_locales for språkvalg** + - Spesifiser ønsket språk for innloggingsgrensesnittet (nb, nn, en, se) + - [Les mer: Autorisasjonsendepunktet](oidc_protocol_authorize) + - [Les mer: Integrasjonsguide](oidc_guide_idporten#2-bruker-autentiserer-seg) + +## Token-håndtering + +### Krav + +- [ ] **Implementere korrekt klientautentisering** + - Velg én av støttede metoder: + - `client_secret_basic` / `client_secret_post` - basert på client_secret + - `private_key_jwt` - basert på JWT'er signert med virksomhetssertifikat (anbefalt for høy sikkerhet) + - [Les mer: Token-endepunktet](oidc_protocol_token) + - [Les mer: Integrasjonsguide](oidc_guide_idporten#4-utstedelse-av-token-fra-token-endepunktet) + +- [ ] **Sende code_verifier i token-forespørsel** + - Inkluder den originale `code_verifier` i token-forespørselen for å fullføre PKCE-flyten + - [Les mer: PKCE](oidc_func_pkce) + - [Les mer: Integrasjonsguide](oidc_guide_idporten#4-utstedelse-av-token-fra-token-endepunktet) + +- [ ] **Validere ID-token korrekt** + - Følg kapittel 3.1.3.7 i OpenID Connect Core 1.0 spesifikasjonen + - Kritisk: Validere at faktisk brukt sikkerhetsnivå `acr` matcher forespurt nivå + - Validere `iss`, `aud`, `exp`, `iat`, `nonce` (hvis brukt) + - Verifiser signatur + - [Les mer: OpenID Connect ID Token Validation](https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation) + - [Les mer: ID-token](oidc_protocol_id_token) + - [Les mer: Integrasjonsguide](oidc_guide_idporten#id_token) + +- [ ] **Respektere token-levetider** + - ID-token: Kort levetid, brukes til å opprette lokal sesjon + - Access-token: Typisk 120 sekunder + - Refresh-token: Brukes til å fornye access-token uten brukerinteraksjon + - [Les mer: Integrasjonsguide](oidc_guide_idporten#access_token) + +### Anbefalinger + +- [ ] **Bruke virksomhetssertifikat for klientautentisering** + - Anbefalt metode for klienter med høye krav til sikkerhet + - [Les mer: Bruk av virksomhetssertifikat](idporten_overordnet#bruk-av-virksomhetssertifikat) + - [Les mer: Integrasjonsguide](oidc_guide_idporten#4-utstedelse-av-token-fra-token-endepunktet) + +## Sesjonshåndtering + +### Krav + +- [ ] **Implementere støtte for Single Logout (SLO)** + - **Kritisk**: Alle tjenester som bruker SSO må implementere SLO + - Feilkonfigurert logout hos én kunde kan ødelegge for andre kunder + - Håndtere to scenarier: + 1. Bruker logger ut fra din tjeneste: Redirect til /endsession-endepunktet + 2. Bruker logger ut fra annen tjeneste: Håndtere front_channel_logout-melding + - [Les mer: Utlogging og single logout](oidc_func_sso) + - [Les mer: Integrasjonsguide - Krav til utlogging](oidc_guide_idporten#krav-til-utlogging) + +- [ ] **Konfigurere lokal sesjon til maksimalt 30 minutters inaktivitet** + - Lokal timeout skal være maksimalt 30 minutter ved inaktivitet + - [Les mer: Levetid for kundens lokale sesjon](oidc_guide_idporten#levetid-for-kundens-lokale-sesjon) + +- [ ] **Sende bruker til ID-porten ved lokal timeout** + - Etter lokal timeout skal brukerens nettleser sendes til ID-porten med ny autentiseringsforespørsel + - [Les mer: Levetid for kundens lokale sesjon](oidc_guide_idporten#levetid-for-kundens-lokale-sesjon) + +- [ ] **Håndtere front_channel_logout-meldinger** + - Identifisere og invalidere lokal brukersesjon basert på `sid` fra logout-melding + - [Les mer: Backchannel logout](oidc_func_backchannel_logout) + - [Les mer: Integrasjonsguide - Krav til utlogging](oidc_guide_idporten#krav-til-utlogging) + +### Anbefalinger + +- [ ] **Bruke samme sesjonstider som ID-porten** + - ID-porten bruker maksimum 120 minutter fra første autentisering + - Inaktivitet over 30 minutter vil utløpe SSO-sesjonen + - [Les mer: Levetid for SSO-sesjonen](oidc_guide_idporten#levetid-for-sso-sesjonen-i-id-porten) + +- [ ] **Vurdere tvungen re-autentisering** + - For sikkerhetskritiske operasjoner: Bruk `prompt=login` for å tvinge aktiv pålogging + - [Les mer: Tvungen re-autentisering](oidc_guide_idporten#tvungen-re-autentisering) + +- [ ] **Vurdere isolert SSO-sesjon** + - For tjenester som ikke skal delta i felles SSO-sesjon + - [Les mer: Isolert SSO-sesjon](oidc_func_nosso) + - [Les mer: Tvungen re-autentisering](oidc_guide_idporten#tvungen-re-autentisering) + +## Sikkerhet og Nøkkelhåndtering + +### Krav + +- [ ] **Etablere sikker nøkkelhåndtering** + - Beskytte private nøkler (client_secret, asymmetriske nøkler, virksomhetssertifikat) + - Definere prosedyrer for nøkkeloppbevaring, backup, og tilgangsstyring + - Dokumentere rutiner for nøkkelfornyelse og kompromitteringshåndtering + - [Les mer: Sørg for sikker håndtering av nøkler](idporten_overordnet#sørg-for-sikker-håndtering-av-nøkler) + +- [ ] **Gjennomføre risikovurdering** + - Gjøre en risikovurdering av egen løsning + - Bruk risikovurderingen til å velge riktig sikkerhetsnivå + - [Les mer: Veileder for valg av sikkerhetsnivå](https://www.digdir.no/digital-samhandling/veileder-identifikasjon-og-sporbarhet-i-elektronisk-kommunikasjon-med-og-i-offentlig-sektor/2992#veiledning_for_valg_av_sikkerhetsniv_for_identifikasjon) + - [Les mer: Etabler gode IT-sikkerhetsrutiner](idporten_overordnet#etabler-gode-it-sikkerhetsrutiner-i-virksomheten) + +- [ ] **Åpne for ID-portens IP-adresser** + - Dersom utgående brannmur: Åpne for ID-portens IP-adresser + - [Les mer: IP-adresser](../../general/IP) + - [Les mer: Åpne for IP-adresser](idporten_overordnet#åpne-for-ip-adresser) + +### Anbefalinger + +- [ ] **Bruke HSM for nøkkeloppbevaring** + - For optimal beskyttelse: Oppbevar private nøkler i kryptografisk hardware (HSM) + - [Les mer: Sørg for sikker håndtering av nøkler](idporten_overordnet#sørg-for-sikker-håndtering-av-nøkler) + +- [ ] **Implementere rotasjon av asymmetriske nøkler** + - For kunder med mange integrasjoner: Bruk virksomhetssertifikat til å automatisere vedlikehold + - La hver integrasjon bruke asymmetrisk nøkkel som roteres hyppig + - [Les mer: Bruk av virksomhetssertifikat](idporten_overordnet#bruk-av-virksomhetssertifikat) + +- [ ] **Følge anbefalinger for sertifikatbehandling** + - Les Veileder for virksomhetsautentisering om sertifikatbehandling, logging og sporing + - [Les mer: Anbefalinger for sertifikatbehandling](https://www.digdir.no/datadeling/sertifikatbehandling-logging-og-sporing/2438) + - [Les mer: Etabler gode IT-sikkerhetsrutiner](idporten_overordnet#etabler-gode-it-sikkerhetsrutiner-i-virksomheten) + +## Logging og Sporing + +### Krav + +- [ ] **Implementere tilstrekkelig logging** + - Logg følgende om autentiseringsforsøk: + - Dato og tidspunkt + - Hvilken handling som ble forsøkt + - Resultatet av handlingen + - Brukerens IP-adresse + - SessionIndex / sid + - Fødselsnummer (vurder personvernbetraktninger) + - [Les mer: Sørg for tilstrekkelig egen logging](idporten_overordnet#sørg-for-tilstrekkelig-egen-logging) + +- [ ] **Vurdere personvern i logging** + - Vurder behovet for logging opp mot personvernbetraktninger + - [Les mer: Sørg for tilstrekkelig egen logging](idporten_overordnet#sørg-for-tilstrekkelig-egen-logging) + +## Testing + +### Krav + +- [ ] **Gjennomføre verifikasjonstester** + - Utføre påkrevde verifikasjonstester for å bekrefte at integrasjonen oppfyller ID-portens krav + - [Les mer: Verifikasjonstester](idporten_verifikasjonstester) + - [Les mer: Test din egen løsning](idporten_overordnet#test-din-egen-løsning) + +- [ ] **Bruke testbrukere** + - Bruk ID-portens testbrukere i testmiljø + - [Les mer: Testbrukere](idporten_testbrukere) + - [Les mer: Test din egen løsning](idporten_overordnet#test-din-egen-løsning) + +- [ ] **Teste i riktig testmiljø** + - I testmiljø tillates redirect tilbake til localhost + - [Les mer: Integrasjonsguide - Respons](oidc_guide_idporten#authresponse) + +## Spesielle Bruksområder + +### For Mobilapper + +- [ ] **Følge integrasjonsguide for mobilapper** + - Mobilapper har en litt annen måte å bruke autorisasjonskode-flyten på + - [Les mer: Autentisering i app](oidc_auth_app) + - [Les mer: Integrasjonsguide](oidc_guide_idporten#overordna-beskrivelse-av-bruksområdet) + +### For JavaScript-applikasjoner/SPA + +- [ ] **Følge integrasjonsguide for SPA** + - JavaScript-applikasjoner (Single Page Applications) har spesielle sikkerhetskrav + - [Les mer: Autentisering i SPA](oidc_auth_spa) + - [Les mer: Integrasjonsguide](oidc_guide_idporten#overordna-beskrivelse-av-bruksområdet) + +### For API-sikring + +- [ ] **Implementere brukerstyrt datadeling korrekt** + - API-tilgangen kan være innloggingsbasert (implisitt samtykke) eller brukerstyrt (eksplisitt samtykke) + - Autorisasjonen gjelder kun for en enkelt innbygger + - [Les mer: API-sikring med OAuth2](oidc_auth_oauth2) + - [Les mer: Overordnet - Brukerstyrt datadeling](idporten_overordnet#brukerstyrt-datadeling) + +### For Innlogging på vegne av andre + +- [ ] **Implementere fullmaktsstøtte** + - For tjenester som skal støtte innlogging på vegne av andre + - [Les mer: Innlogging på vegne av andre](oidc_auth_fullmakt) + - [Les mer: Overordnet - Introduksjon](idporten_overordnet#introduksjon) + +## Tilleggsfunksjonalitet (valgfritt) + +### Anbefalinger + +- [ ] **Hente brukerinformasjon fra userinfo-endepunkt** + - Ved å forespørre scopet `profile` kan du hente ytterligere data fra userinfo-endepunktet + - Gir tilgang til personnummer og valgt språk under innlogging + - [Les mer: Userinfo-endepunkt](oidc_protocol_userinfo) + - [Les mer: Integrasjonsguide - Userinfo](oidc_guide_idporten#5-userinfo-endepunkt) + +- [ ] **Hente kontaktopplysninger fra KRR** + - Ved å forespørre `krr:user/kontaktinformasjon.read`-scopet får du tilgang til kontaktopplysninger fra Kontakt- og Reservasjonsregisteret + - [Les mer: Brukerspesifikt oppslag i KRR](../../Kontaktregisteret/Brukerspesifikt-oppslag_rest) + - [Les mer: Integrasjonsguide - KRR](oidc_guide_idporten#6-kontaktopplysninger-fra-kontakt--og-reservasjonsregisteret) + +- [ ] **Støtte for utenlandske brukere** + - Vurdere om tjenesten skal støtte utenlandske brukere (eIDAS) + - [Les mer: Utenlandske brukere](oidc_func_utanlandske_brukarar) + - [Les mer: eIDAS](oidc_func_eidas) + +## Problemer og Support + +### Ved problemer + +- [ ] **Kontakte servicedesk ved problemer** + - E-post: servicedesk@digdir.no + - Oppgi: client_id, miljø og beskrivelse av problemet + - [Les mer: Problemer?](idporten_overordnet#problemer-) + +## Ressurser + +- [ID-porten produktside på Samarbeidsportalen](https://samarbeid.digdir.no/id-porten/id-porten/18) +- [Ta i bruk ID-porten](https://samarbeid.digdir.no/id-porten/ta-i-bruk-id-porten/94) +- [Integrasjonsguide - Autentisering med OpenID Connect](oidc_guide_idporten) +- [Overordnet arkitekturbeskrivelse](idporten_overordnet) +- [Klientregistrering](oidc_func_clientreg) +- [PKCE - Proof Key for Code Exchange](oidc_func_pkce) +- [PAR - Pushed Authorization Request](oidc_protocol_par) +- [ID-token dokumentasjon](oidc_protocol_id_token) +- [Access-token dokumentasjon](oidc_protocol_access_token) +- [Token-endepunkt](oidc_protocol_token) +- [Autorisasjonsendepunkt](oidc_protocol_authorize) +- [Single Sign-On og utlogging](oidc_func_sso) +- [Backchannel logout](oidc_func_backchannel_logout) +- [Verifikasjonstester](idporten_verifikasjonstester) +- [Testbrukere](idporten_testbrukere) +- [OpenID Connect Core 1.0 spesifikasjon](https://openid.net/specs/openid-connect-core-1_0.html) +- [RFC 7636 - PKCE](https://tools.ietf.org/html/rfc7636) +- [Veileder for virksomhetsautentisering](https://www.digdir.no/datadeling/sertifikatbehandling-logging-og-sporing/2438) +- [Veileder for identifikasjon og sporbarhet](https://www.digdir.no/digital-samhandling/veileder-identifikasjon-og-sporbarhet-i-elektronisk-kommunikasjon-med-og-i-offentlig-sektor/2992) From c10172381ac2936f25ff33e143bae19bfb9d3eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigvald=20H=C3=B8yheim?= Date: Fri, 26 Jun 2026 10:44:41 +0200 Subject: [PATCH 2/5] forenkle liste --- _docs/Maskinporten/maskinporten_checklist.md | 261 +++---------------- 1 file changed, 34 insertions(+), 227 deletions(-) diff --git a/_docs/Maskinporten/maskinporten_checklist.md b/_docs/Maskinporten/maskinporten_checklist.md index 4807ada39..eea506f1d 100644 --- a/_docs/Maskinporten/maskinporten_checklist.md +++ b/_docs/Maskinporten/maskinporten_checklist.md @@ -8,257 +8,64 @@ product: Maskinporten # Sjekkliste for Maskinporten Integrasjon -Denne sjekklisten gir en oversikt over krav og anbefalinger for integrasjon mot Maskinporten for både API-tilbydere og API-konsumenter. - -## Om Maskinporten - -Maskinporten er en tjeneste som tilbyr en enkel modell for API-sikring basert på OAuth2 protokollen og bruk av JWT-bearer grants. Den lar API-tilbydere definere tilganger til sine API, modellert som scopes, basert på konsumenten sine organisasjonsnummer. +Kortfattet sjekkliste for integrasjon mot Maskinporten. For detaljer, se [guide for API-tilbydere](maskinporten_guide_apitilbyder) og [guide for API-konsumenter](maskinporten_guide_apikonsument). ## For API-tilbyder -### Før Oppstart - -#### Krav - -- [ ] **Få tildelt API-prefiks** - - Første gang må du bli manuelt satt opp som API-tilbyder - - Bestem `scope-prefix` du ønsker å bruke for dine APIer - - Send inn skjema for å få tildelt prefiks - - [Les mer: Manuell tildeling av prefix](maskinporten_guide_apitilbyder#1-manuell-tildeling-av-prefix) - -- [ ] **Akseptere bruksvilkår** - - Inngå Digdir sine bruksvilkår for fellesløsninger - -### Administrasjon av API/Scopes - -#### Krav - -- [ ] **Følge syntaks for scopes** - - Syntaks: `scope ::= prefix ':' subscope` - - Subscope bør beskrive ressursen best mulig (f.eks. `nav:trygdeopplysninger`) - - Bruk postfix for å skille lese/skrive-tilgang (f.eks. `.write`, `.read`) - - Fravær av postfix tolkes som kun lese-tilgang - - [Les mer: Beskrivelse av APIer](maskinporten_guide_apitilbyder#beskrivelse-av-apier) - -- [ ] **Sette synlighet på scope** - - `PUBLIC`: Synlig for alle på /scopes/all endepunkt - - `PRIVATE`: Kun synlig for API-tilbyder og konsumenter med tilgang - - `INTERNAL`: Intern bruk i Digitaliseringsdirektoratet - - [Les mer: Synlighet](maskinporten_guide_apitilbyder#synlighet) - -- [ ] **Sette scope-begrensninger** - - Sett `allowed_integration_types` for å begrense bruken - - Kan begrenses til kun maskinporten (server-til-server) eller idporten (brukerinnlogging) - - [Les mer: Scope-begrensninger](maskinporten_guide_apitilbyder#scope-begrensninger) - -- [ ] **Opprette scopes via selvbetjening** - - Bruk enten web-grensesnitt på Samarbeidsportalen eller selvbetjenings-API - - [Les mer: Opprette et API - via Samarbeidsportalen](maskinporten_guide_apitilbyder#1a-opprette-et-api---via-samarbeidsportalen) - - [Les mer: Opprette APIer - OAuth2-selvbetjeningsklient](maskinporten_guide_apitilbyder#2a-opprette-apier---oauth2-selvbetjeningsklient) - -### Tilgangsstyring - -#### Krav - -- [ ] **Gi tilgang til konsumenter** - - Gi tilgang basert på konsumentens organisasjonsnummer - - Kan gjøres via Samarbeidsportalen eller selvbetjenings-API - - [Les mer: Tilgangsstyring - via Samarbeidsportalen](maskinporten_guide_apitilbyder#1b-tilgangsstyring---via-samarbeidsportalen) - - [Les mer: Tilgangsstyring - OAuth2-selvbetjeningsklient](maskinporten_guide_apitilbyder#2b-tilgangsstyring---oauth2-selvbetjeningsklient) - -- [ ] **Revokere tilganger ved behov** - - Trekk tilbake tilganger ved å slette dem i selvbetjening - - [Les mer: Tilgangsstyring - via Samarbeidsportalen](maskinporten_guide_apitilbyder#1b-tilgangsstyring---via-samarbeidsportalen) - -### Token-validering - -#### Krav - -- [ ] **Validere token korrekt** - - Sjekk at `issuer` stemmer med Maskinporten ("https://maskinporten.no/" i prod) - - Validere signering og signeringssertifikat mot JWK-endepunkt - - Verifisere at `scope` stemmer med ditt API-endepunkt - - Validere at token ikke er utløpt (`exp`) - - [Les mer: Validere token](maskinporten_guide_apitilbyder#4-validere-token) - -- [ ] **Bruke consumer-claim for tilgangskontroll** - - Det er `consumer`-claimet som forteller hvilken konsument som har fått tokenet - - **Ikke** bruk `client_id` eller `client_org` (gamle claims som fjernes) - - [Les mer: Validere token](maskinporten_guide_apitilbyder#4-validere-token) - -- [ ] **Håndtere leverandør-informasjon korrekt (ved delegering)** - - Ved bruk av leverandør får du `supplier` og `delegation_source` claims - - Nyttig for logging og sporbarhet - - [Les mer: Validere token](maskinporten_guide_apitilbyder#4-validere-token) +- [ ] Akseptere Digdir sine [bruksvilkår](https://samarbeid.digdir.no) for fellesløsninger +- [ ] [Få tildelt API-prefiks](maskinporten_guide_apitilbyder#1-manuell-tildeling-av-prefix) +- [ ] [Opprette scopes](maskinporten_guide_apitilbyder#beskrivelse-av-apier) med riktig syntaks, synlighet og begrensninger +- [ ] [Gi tilgang til konsumenter](maskinporten_guide_apitilbyder#1b-tilgangsstyring---via-samarbeidsportalen) basert på organisasjonsnummer +- [ ] [Validere token](maskinporten_guide_apitilbyder#4-validere-token): issuer, signatur, scope, utløpstid +- [ ] Bruke `consumer`-claimet for tilgangskontroll — **ikke** `client_id` eller `client_org` +- [ ] Ved delegering: [Logg `supplier` og `delegation_source` claims](maskinporten_guide_apitilbyder#4-validere-token) ### Delegering via Altinn (valgfritt) -#### Krav (hvis du bruker Altinn-delegering) - -- [ ] **Være tjenesteeier i Altinn** - - Påkrevd for å kunne bruke Altinn-delegering - - [Les mer: Bruke delegering i Altinn](maskinporten_guide_apitilbyder#bruke-delegering-i-altinn) - -- [ ] **Opprette delegeringsoppsett** - - Opprett scope med **delegeringskilde** - - Lag "delegerbar ressurs" i Altinn med det aktuelle scopet - - Gi tilgang til konsumenter (ikke leverandøren direkte) - - [Les mer: Bruke delegering i Altinn](maskinporten_guide_apitilbyder#bruke-delegering-i-altinn) - - [Les mer: Ekstern delegering](maskinporten_func_delegering) - -#### Anbefalinger - -- [ ] **Forstå begrensninger ved delegering** - - Scopes uten delegeringskilde kan ikke bruke Altinn-delegering - - Scopes med delegeringskilde kan ikke bruke interne delegeringsmekanismer (onbehalfof) - - [Les mer: Bruke delegering i Altinn](maskinporten_guide_apitilbyder#bruke-delegering-i-altinn) +- [ ] [Opprette delegeringsoppsett](maskinporten_guide_apitilbyder#bruke-delegering-i-altinn) (krever at du er tjenesteeier i Altinn) +- [ ] Forstå at scopes med/uten delegeringskilde har [ulike begrensninger](maskinporten_func_delegering) ## For API-konsument -### Opprette Integrasjon - -#### Krav - -- [ ] **Få tilgang til scope fra API-tilbyder** - - API-tilbyder må gi din organisasjon tilgang til scopet først - - [Les mer: Overordnet prosedyre](maskinporten_guide_apikonsument#overordnet-prosedyre-for-api-sikring-med-maskinporten) +- [ ] Få tilgang til ønsket scope fra API-tilbyder +- [ ] [Opprette integrasjon](maskinporten_guide_apikonsument#4-opprett-en-integrasjon-i-maskinporten) med riktige egenskaper +- [ ] [Generere og signere JWT-grant](maskinporten_guide_apikonsument#5-be-om-token) med påkrevde claims +- [ ] Sikre at hver JWT er unik (bruk `jti`) +- [ ] [Sende API-kall](maskinporten_guide_apikonsument#6-sende-api-kall-med-token) med `Authorization: Bearer ` +- [ ] Håndtere token-utløp (hent nytt ved 401, gjenbruk innen levetiden) -- [ ] **Opprette Maskinporten-integrasjon** - - Opprett en OAuth2-klient i Maskinporten - - Kan gjøres via Samarbeidsportalen eller selvbetjenings-API - - [Les mer: Opprett en integrasjon](maskinporten_guide_apikonsument#4-opprett-en-integrasjon-i-maskinporten) +### Anbefalinger -- [ ] **Konfigurere integrasjon med riktige egenskaper** - - `integration_type`: "maskinporten" - - `token_endpoint_auth_method`: "private_key_jwt" - - `grant_types`: "urn:ietf:params:oauth:grant-type:jwt-bearer" - - `scopes`: Scope(s) du har fått tildelt tilgang til - - `description`: God beskrivelse av tjenesten - - [Les mer: Opprett en integrasjon](maskinporten_guide_apikonsument#4-opprett-en-integrasjon-i-maskinporten) - -- [ ] **Velge autentiseringsmetode** - - Enten virksomhetssertifikat eller egen asymmetrisk nøkkel - - Maskinporten aksepterer kun sertifikat og nøkler (ikke client_secret) - - [Les mer: Opprett en integrasjon](maskinporten_guide_apikonsument#4-opprett-en-integrasjon-i-maskinporten) - -#### Anbefalinger - -- [ ] **Lage separate klienter for ulike APIer** - - Sikkerhetsrisiko å la samme klient ha tilgang til for mange APIer - - [Les mer: Opprett en integrasjon](maskinporten_guide_apikonsument#4-opprett-en-integrasjon-i-maskinporten) - -- [ ] **Bruke egen nøkkel fremfor virksomhetssertifikat** - - Unngå å spre virksomhetssertifikatet til mange systemer - - Opprett asymmetriske nøkler knyttet til enkelt-integrasjoner - - [Les mer: Registrere klient som bruker egen nøkkel](maskinporten_guide_apikonsument#registrere-klient-som-bruker-egen-nøkkel) - -### Token-forespørsel (JWT-grant) - -#### Krav - -- [ ] **Generere og signere JWT korrekt** - - Bruk virksomhetssertifikat eller registrert asymmetrisk nøkkel for signering - - [Les mer: Be om token](maskinporten_guide_apikonsument#5-be-om-token) - -- [ ] **Inkludere påkrevde claims i JWT** - - `aud`: https://maskinporten.no/ (eller aktuelt miljø fra well-known) - - `iss`: Din egen client_id - - `scope`: Space-separert liste over scopes - - `iat`: Tidspunkt for når JWT ble laget (UTC-tid) - - `exp`: Utløpstidspunkt (Maks 120 sekunder: exp - iat <= 120) - - [Les mer: Be om token](maskinporten_guide_apikonsument#5-be-om-token) - -- [ ] **Ikke gjenbruke JWT** - - Hver JWT må være unik - - Bruk `jti` (JWT ID) for å sikre unikhet - - [Les mer: Be om token](maskinporten_guide_apikonsument#5-be-om-token) - -#### Anbefalinger - -- [ ] **Be om ett scope per token** - - Sikkerhetsmessig problematisk å be om mange scopes i samme token - - [Les mer: Be om token](maskinporten_guide_apikonsument#5-be-om-token) - -### API-kall - -#### Krav - -- [ ] **Bruke access_token som Authorization-header** - - Typisk format: `Authorization: Bearer ` - - Følg API-tilbyders dokumentasjon - - [Les mer: Sende API-kall med token](maskinporten_guide_apikonsument#6-sende-api-kall-med-token) - -- [ ] **Håndtere token-utløp** - - Ved 401-respons fra API: Hent nytt token - - Gjenbruk token for flere API-kall innen levetiden - - [Les mer: Sende API-kall med token](maskinporten_guide_apikonsument#6-sende-api-kall-med-token) +- [ ] Bruk separate klienter for ulike APIer +- [ ] Foretrekk [egen asymmetrisk nøkkel](maskinporten_guide_apikonsument#registrere-klient-som-bruker-egen-nøkkel) fremfor virksomhetssertifikat +- [ ] Be om ett scope per token ### Delegering via Altinn (for leverandører) -#### Krav (hvis du er leverandør) - -- [ ] **Registrere integrasjon korrekt** - - **Viktig**: Opprett integrasjon som tilhørende deg selv - - **Ikke** velg "på vegne av en kunde" eller "på vegne av flere kunder" - - Hvis du bruker selvbetjenings-API: Bruk `idporten:dcr.write` (ikke `idporten:dcr.supplier`) - - Ikke sett `client_orgno` i registreringskallet - - [Les mer: Bruke delegering som leverandør](maskinporten_guide_apikonsument#bruke-delegering-som-leverandør) - -- [ ] **Inkludere consumer_org i JWT-grant** - - Oppgi konsumentens organisasjonsnummer som `consumer_org` claim - - Maskinporten sjekker Altinn om gyldig delegeringsforhold finnes - - [Les mer: Bruke delegering som leverandør](maskinporten_guide_apikonsument#bruke-delegering-som-leverandør) - -- [ ] **Få delegering fra konsument i Altinn** - - Konsumentens bemyndiget ansatt må logge inn i Altinn og delegere tilgangen til deg - - [Les mer: Bruke delegering som konsument](maskinporten_guide_apikonsument#bruke-delegering-som-konsument) - - [Les mer: Altinns dokumentasjon](https://altinn.github.io/docs/utviklingsguider/sikkerhet-i-eoppslag/tilgangsstyrer/) - -## Generelle Krav - -### Sikkerhet og Nøkkelhåndtering - -#### Krav - -- [ ] **Etablere sikker nøkkelhåndtering** - - Beskytte private nøkler og virksomhetssertifikater - - Definere prosedyrer for oppbevaring, backup, og tilgangsstyring - - Dokumentere rutiner for fornyelse og kompromitteringshåndtering - -- [ ] **Gjennomføre risikovurdering** - - Vurder sikkerhet i egen løsning - - Vurder hvor mange APIer en klient skal ha tilgang til - -- [ ] **Åpne for Maskinporten sine IP-adresser** - - Dersom utgående brannmur: Åpne for Maskinporten sine IP-adresser - -### Logging og Sporing +- [ ] [Registrer integrasjon](maskinporten_guide_apikonsument#bruke-delegering-som-leverandør) som tilhørende deg selv — **ikke** "på vegne av kunde" +- [ ] Inkluder `consumer_org` i JWT-grant +- [ ] Sørg for at [konsumenten delegerer tilgang](maskinporten_guide_apikonsument#bruke-delegering-som-konsument) i Altinn -#### Krav +## Generelle krav -- [ ] **Implementere tilstrekkelig logging** - - Logg token-forespørsler og API-kall - - Logg feil og sikkerhetshendelser - - For API-tilbydere: Logg consumer-informasjon for sporbarhet +### Sikkerhet og nøkkelhåndtering -### Testing +- [ ] Etabler sikker nøkkelhåndtering: oppbevaring, backup, tilgangsstyring, og rutiner for fornyelse og kompromittering +- [ ] Gjennomfør risikovurdering av egen løsning +- [ ] Åpne utgående brannmur for Maskinporten sine IP-adresser (om aktuelt) -#### Krav +### Logging og testing -- [ ] **Teste i riktig testmiljø** - - Bruk test-miljø før produksjon - - Verifiser at integrasjon fungerer som forventet +- [ ] Logg token-forespørsler, API-kall, feil og sikkerhetshendelser +- [ ] API-tilbydere: Logg consumer-informasjon for sporbarhet +- [ ] Test i riktig testmiljø før produksjon ## Ressurser - [Maskinporten overordnet](maskinporten_overordnet) -- [Maskinporten på Samarbeidsportalen](https://samarbeid.digdir.no) - [Guide for API-tilbydere](maskinporten_guide_apitilbyder) - [Guide for API-konsumenter](maskinporten_guide_apikonsument) - [JWT-grant spesifikasjon](maskinporten_protocol_jwtgrant) - [Ekstern delegering](maskinporten_func_delegering) -- [Selvbetjenings-API](../../idporten/oidc/oidc_api_admin) -- [Selvbetjenings-API for Maskinporten](../../idporten/oidc/oidc_api_admin_maskinporten) -- [Samtykketoken i Maskinporten](maskinporten_func_samtykke) -- [Sjekkliste for Samtykketoken](maskinporten_samtykke_checklist) -- [Altinn: Sikkerhet i eOppslag](https://altinn.github.io/docs/utviklingsguider/sikkerhet-i-eoppslag/tilgangsstyrer/) +- [Selvbetjenings-API](../../idporten/oidc/oidc_api_admin_maskinporten) +- [Samarbeidsportalen](https://samarbeid.digdir.no) From 5b35efe669e031726dc9a4a84d0aab2fb7244340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigvald=20H=C3=B8yheim?= Date: Fri, 26 Jun 2026 11:02:14 +0200 Subject: [PATCH 3/5] forenkle sjekklister --- .../maskinporten_samtykke_checklist.md | 114 +------ _docs/ansattporten/ansattporten_checklist.md | 253 ++------------ _docs/idporten/idporten_checklist.md | 308 +++--------------- 3 files changed, 95 insertions(+), 580 deletions(-) diff --git a/_docs/Maskinporten/maskinporten_samtykke_checklist.md b/_docs/Maskinporten/maskinporten_samtykke_checklist.md index 577e8ab5a..b7e05e1e5 100644 --- a/_docs/Maskinporten/maskinporten_samtykke_checklist.md +++ b/_docs/Maskinporten/maskinporten_samtykke_checklist.md @@ -8,116 +8,34 @@ product: Maskinporten # Sjekkliste for Samtykketoken i Maskinporten -Denne sjekklisten gir en oversikt over krav og anbefalinger for bruk av samtykketoken i Maskinporten. +Kortfattet sjekkliste for bruk av samtykketoken. For detaljer, se [Samtykketoken i Maskinporten](maskinporten_func_samtykke). ## For API-tilbyder/Tjenesteeier -### Krav - -- [ ] **Opprette samtykkeressurs i Altinn 3** - - Samtykkeressursen må opprettes i Altinn 3 før løsningen kan tas i bruk - - [Les mer om samtykke for tjenesteeier](https://docs.altinn.studio/nb/authorization/guides/resource-owner/consent/) - - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) - -- [ ] **Validere ID-claim i tokenet** - - API-tilbyder må validere at `id` (samtykkets uuid) i tokenet er korrekt - - [Les mer: For API-tilbyder/Tjenesteeier](maskinporten_func_samtykke#for-api-tilbydertjenesteeier) - -- [ ] **Validere from-claim i tokenet** - - API-tilbyder må validere at `from` (hvem som har gitt samtykket) i tokenet er korrekt - - [Les mer: For API-tilbyder/Tjenesteeier](maskinporten_func_samtykke#for-api-tilbydertjenesteeier) - -- [ ] **Validere to-claim i tokenet** - - API-tilbyder må validere at `to` (organisasjonen samtykket er gitt til) i tokenet er korrekt - - [Les mer: For API-tilbyder/Tjenesteeier](maskinporten_func_samtykke#for-api-tilbydertjenesteeier) - -- [ ] **Validere scope i tokenet** - - API må validere at riktig scope er inkludert i tokenet - - [Les mer: Respons](maskinporten_func_samtykke#respons) - -- [ ] **Sikre at sluttbruker aksepterer samtykket** - - Samtykket må aksepteres av sluttbruker før det kan brukes - - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) - -- [ ] **Følge datatilsynets krav til samtykke** - - Samtykkeløsningen må oppfylle [datatilsynets krav til samtykke for å behandle personopplysninger](https://www.datatilsynet.no/rettigheter-og-plikter/virksomhetenes-plikter/behandlingsgrunnlag/veileder-om-behandlingsgrunnlag/?id=176) - - [Les mer: Bakgrunn](maskinporten_func_samtykke#bakgrunn) - -### Anbefalinger - -- [ ] **Bruke uuid fra Altinn ved oppretting** - - Oppbevar den uuid som returneres fra Altinn ved oppretting av samtykkeressurs - - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) - -- [ ] **Les Altinns dokumentasjon** - - Les grundig gjennom [Altinns guide - Kom igang med samtykke](https://docs.altinn.studio/nb/authorization/getting-started/consent/) for mer detaljer - - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) +- [ ] [Opprette samtykkeressurs](https://docs.altinn.studio/nb/authorization/guides/resource-owner/consent/) i Altinn 3 og oppbevare uuid +- [ ] Sikre at sluttbruker aksepterer samtykket før bruk +- [ ] Validere `id`, `from`, `to` og `scope` i samtykke-tokenet +- [ ] Oppfylle [datatilsynets krav til samtykke](https://www.datatilsynet.no/rettigheter-og-plikter/virksomhetenes-plikter/behandlingsgrunnlag/veileder-om-behandlingsgrunnlag/?id=176) ## For Datakonsument/Tjenesteleverandør -### Krav - -- [ ] **Opprette Maskinporten-integrasjon** - - Datakonsument må opprette en Maskinporten-integrasjon gjennom selvbetjening på [Samarbeidsportalen](https://samarbeid.digdir.no) - - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) - -- [ ] **Ha tilgang til API-tilbyders scope** - - Klienten må ha tilgang til å knytte API-tilbyders/tjenesteeiers scope til klienten - - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) - -- [ ] **Bruke RAR-forespørsel av type `urn:altinn:consent`** - - Forespørselen må bruke riktig type i henhold til OAuth2-utvidelsen for Rich Authorization Requests (RAR) - - [Les mer: Grensesnittsdefinisjon](maskinporten_func_samtykke#grensesnittsdefinisjon) - -- [ ] **Inkludere påkrevde claims i forespørselen** - - `type`: Må alltid være `urn:altinn:consent` - - `id`: Samtykkeressursens uuid - - `from`: Orgno eller pid på den som har gitt samtykket (format: `urn:altinn:person:identifier-no:12345678910` eller `urn:altinn:organization:identifier-no:123456789`) - - [Les mer: Forespørsel](maskinporten_func_samtykke#forespørsel) - -- [ ] **Forespørre ett eller flere OAuth2 scopes** - - JWT-grantet må alltid inkludere ett eller flere OAuth2 scopes - - [Les mer: Forespørsel](maskinporten_func_samtykke#forespørsel) - -- [ ] **Kun spørre på ett samtykke om gangen** - - Det er kun mulig å forespørre ett samtykke per token-request - - [Les mer: Forespørsel](maskinporten_func_samtykke#forespørsel) - -- [ ] **Sikre at consumer matcher to-claim** - - Leverandørens organisasjonsnummer i `consumer`-claimet må matche verdien i `to` for å få et samtykketoken - - [Les mer: Respons](maskinporten_func_samtykke#respons) - -- [ ] **Håndtere delegering ved bruk av delegerte scopes** - - Ved bruk av delegerte scopes må samtykket være gitt til den som har delegert scopet til den gitte Maskinporten-klienten - - [Les mer om delegering](maskinporten_func_delegering) - - [Les mer: Hva inneholder et samtykke-token?](maskinporten_func_samtykke#hva-inneholder-et-samtykke-token-) - -### Anbefalinger - -- [ ] **Les dokumentasjon om delegering** - - Hvis tilgang til scope ikke er gitt direkte til tjenesteleverandør, les nærmere om [delegering](https://docs.digdir.no/docs/Maskinporten/maskinporten_func_delegering.html) - - [Les mer: Oppsett](maskinporten_func_samtykke#oppsett) - -## Generelle anbefalinger - -- [ ] **Forstå samtykke-tokenets innhold** - - Gjør deg kjent med alle claims som inkluderes i responsen: `type`, `id`, `from`, `to`, `consented`, `validTo`, `consentRights` - - [Les mer: Respons](maskinporten_func_samtykke#respons) +- [ ] Opprette Maskinporten-integrasjon via [Samarbeidsportalen](https://samarbeid.digdir.no) +- [ ] Ha tilgang til API-tilbyders scope (direkte eller via [delegering](maskinporten_func_delegering)) +- [ ] Bruke [RAR-forespørsel](maskinporten_func_samtykke#grensesnittsdefinisjon) av type `urn:altinn:consent` med påkrevde claims (`type`, `id`, `from`) +- [ ] Kun forespørre ett samtykke per token-request +- [ ] Alltid inkludere ett eller flere OAuth2 scopes i JWT-grantet +- [ ] Sikre at `consumer` matcher `to`-claim i responsen +- [ ] Ved delegerte scopes: samtykket må være gitt til den som har delegert scopet -- [ ] **Sjekk validTo-tidsstempel** - - Vær oppmerksom på at samtykket har et utløpstidspunkt (`validTo`) - - [Les mer: Respons](maskinporten_func_samtykke#respons) +## Generelt -- [ ] **Forstå samtykkerettigheter (consentRights)** - - Sjekk at du forstår strukturen på `consentRights` som inneholder `action`, `resource` og eventuelt `metadata` - - [Les mer: Respons](maskinporten_func_samtykke#respons) +- [ ] Forstå [samtykke-tokenets innhold](maskinporten_func_samtykke#respons): `id`, `from`, `to`, `consented`, `validTo`, `consentRights` +- [ ] Sjekk `validTo` — samtykket har et utløpstidspunkt ## Ressurser -- [Samtykketjenesten på Samarbeidsportalen](https://samarbeid.digdir.no/altinn/samtykketjenesten/2337) -- [Datatilsynets krav til samtykke](https://www.datatilsynet.no/rettigheter-og-plikter/virksomhetenes-plikter/behandlingsgrunnlag/veileder-om-behandlingsgrunnlag/?id=176) +- [Samtykketoken i Maskinporten](maskinporten_func_samtykke) - [Altinn: Samtykke for tjenesteeier](https://docs.altinn.studio/nb/authorization/guides/resource-owner/consent/) - [Altinn: Kom igang med samtykke](https://docs.altinn.studio/nb/authorization/getting-started/consent/) - [RFC 9396: Rich Authorization Requests (RAR)](https://datatracker.ietf.org/doc/rfc9396/) -- [Maskinporten: JWT-grant](maskinporten_protocol_jwtgrant) - [Maskinporten: Delegering](maskinporten_func_delegering) diff --git a/_docs/ansattporten/ansattporten_checklist.md b/_docs/ansattporten/ansattporten_checklist.md index 7ecccd310..819ede4b4 100644 --- a/_docs/ansattporten/ansattporten_checklist.md +++ b/_docs/ansattporten/ansattporten_checklist.md @@ -8,246 +8,59 @@ product: Ansattporten # Sjekkliste for Ansattporten Integrasjon -Denne sjekklisten gir en oversikt over krav og anbefalinger for integrasjon mot Ansattporten. +Kortfattet sjekkliste for integrasjon mot Ansattporten. For detaljer, se [Hva er Ansattporten?](ansattporten_om) og [integrasjonsguiden](ansattporten_guide). -## Om Ansattporten +## Før oppstart -Ansattporten er en egen innloggingtjeneste med funksjonalitet tilpasset innlogging i ansatt/representasjonskontekst. Den deler samme kildekode-base som ID-porten, men er en selvstendig tjeneste med egne særtrekk. +- [ ] Akseptere Digdir sine [bruksvilkår](https://samarbeid.digdir.no) for fellesløsninger +- [ ] [Registrere integrasjon](ansattporten_om#hvordan-administrerer-jeg-ansattporten-) med `integration_type` satt til **`ansattporten`** (ikke `idporten`) +- [ ] Velge [bruksscenario](ansattporten_om#hvilken-bruk-scenario-støttes-): vanlig innlogging, på vegne av virksomhet, eller datadeling -## Før Oppstart +## Autentisering og token -### Krav +- [ ] Bruke [PKCE](../../idporten/oidc/oidc_func_pkce) med `code_challenge_method=S256` +- [ ] Inkludere påkrevde parametere: `client_id`, `redirect_uri`, `scope` (min. `openid`), `response_type=code` +- [ ] Bruke `state` og `nonce` for CSRF- og replay-beskyttelse +- [ ] Validere at `iss` i ID-token stemmer med **Ansattporten** (ikke ID-porten) +- [ ] Bruke [well-known endepunkt](ansattporten_wellknown) for dynamisk konfigurasjon og JWK-henting -- [ ] **Akseptere bruksvilkår** - - Alle kunder som har inngått Digdir sine bruksvilkår for fellesløsninger kan bruke Ansattporten - - [Les mer: Hvem kan bruke Ansattporten?](ansattporten_om#hvem-kan-bruke-ansattporten-) - - [Les mer: Hvordan administrerer jeg Ansattporten?](ansattporten_om#hvordan-administrerer-jeg-ansattporten-) +## Representasjon og organisasjonsvelger (valgfritt) -- [ ] **Registrere integrasjon i selvbetjening** - - Bruk selvbetjeningsløsningen på Samarbeidsportalen til å registrere integrasjonen - - **Kritisk**: Sett `integration_type` til `ansattporten` (ikke `idporten`) - - [Les mer: Hvordan administrerer jeg Ansattporten?](ansattporten_om#hvordan-administrerer-jeg-ansattporten-) - -- [ ] **Forstå forskjellen mellom Ansattporten og ID-porten** - - Ansattporten er en egen "port" - isolert fra ID-porten - - Ingen SSO mellom ID-porten og Ansattporten - - Ingen SSO mellom ulike tjenester i Ansattporten (isolert SSO-sesjon) - - [Les mer: Egen "port"](ansattporten_om#egen-port) - - [Les mer: Ingen SSO-funksjonalitet mellom tjenester](ansattporten_om#ingen-sso-funksjonalitet-mellom-tjenester) - -### Anbefalinger - -- [ ] **Vurdere bruksscenario** - - Ansattporten støtter tre brukerreiser: - 1. Vanlig innlogging (med isolert SSO) - 2. Innlogging på vegne av virksomhet - 3. Datadeling på vegne av virksomhet - - [Les mer: Hvilken bruk-scenario støttes?](ansattporten_om#hvilken-bruk-scenario-støttes-) - -## Autentiseringsforespørsel - -### Krav - -- [ ] **Bruke PKCE (Proof Key for Code Exchange)** - - Alle klienter må som hovedregel bruke PKCE i autentiseringsforespørselen - - `code_verifier` må være minst 43 karakterer lang, og ikke lengre enn 128 karakterer - - Støtter kun `code_challenge_method=S256` - - [Les mer: PKCE](../../idporten/oidc/oidc_func_pkce) - -- [ ] **Inkludere påkrevde parametere i autentiseringsforespørsel** - - `client_id`: Din registrerte klient-ID - - `redirect_uri`: Forhåndsregistrert redirect URI - - `scope`: Minimum `openid` - - `response_type`: `code` for autorisasjonskode-flyt - - `code_challenge`: Hash'et versjon av code_verifier - - `code_challenge_method`: `S256` - - [Les mer: Vanlig innlogging](ansattporten_guide) - -- [ ] **Bruke korrekt issuer-verdi** - - Ansattporten er en egen OAuth2 autorisasjonsserver med egen issuer-verdi - - Valider at issuer stemmer med Ansattporten (ikke ID-porten) - - [Les mer: Egen "port"](ansattporten_om#egen-port) - -### Anbefalinger - -- [ ] **Bruke state-parameter** - - Inkluder `state` i autentiseringsforespørselen for å beskytte mot CSRF-angrep - -- [ ] **Bruke nonce-parameter** - - Inkluder `nonce` i autentiseringsforespørselen for ekstra beskyttelse mot replay-angrep - -- [ ] **Vurdere PAR (Pushed Authorization Request)** - - For tjenester med høye krav til sikkerhet - -## Representasjon og Organisasjonsvelger - -### Krav (hvis du bruker representasjonsfunksjonalitet) - -- [ ] **Være tjenesteeier i Altinn** - - Kun kunder som er tjenesteeier i Altinn kan bruke funksjonaliteten med organisasjonsvelger og tilgangstyring - - [Les mer: Hvem kan bruke Ansattporten?](ansattporten_om#hvem-kan-bruke-ansattporten-) - -- [ ] **Forstå autorative kilder for representasjon** - - Ansattporten har ikke egen database/register over roller/rettigheter - - Baserer seg på eksterne, autorative kilder (Altinn Autorisasjon) - - [Les mer: Autorative kilder for representasjon](ansattporten_om#autorative-kilder-for-representasjon) - -- [ ] **Håndtere organisasjonsvelger korrekt** - - Dersom tjenesten krever representasjon, vises organisasjonsvelger til brukeren - - Velgeren er forhåndspopulert fra autorativ kilde - - [Les mer: Autorative kilder for representasjon](ansattporten_om#autorative-kilder-for-representasjon) - -### Anbefalinger - -- [ ] **Implementere innlogging på vegne av virksomhet** - - Følg guide for representasjonsbasert innlogging - - [Les mer: Innlogging på vegne av virksomhet](ansattporten_representasjon) - -- [ ] **Implementere datadeling på vegne av virksomhet** - - Følg guide for OAuth2-basert datadeling - - [Les mer: Datadeling på vegne av virksomhet](ansattporten_oauth2) - -## Token-håndtering - -### Krav - -- [ ] **Implementere korrekt klientautentisering** - - Velg én av støttede metoder: - - `client_secret_basic` / `client_secret_post` - basert på client_secret - - `private_key_jwt` - basert på JWT'er signert med virksomhetssertifikat (anbefalt for høy sikkerhet) - -- [ ] **Sende code_verifier i token-forespørsel** - - Inkluder den originale `code_verifier` i token-forespørselen for å fullføre PKCE-flyten - -- [ ] **Validere ID-token korrekt** - - Følg kapittel 3.1.3.7 i OpenID Connect Core 1.0 spesifikasjonen - - Validere `iss` (issuer) - må stemme med Ansattporten, ikke ID-porten - - Validere `aud`, `exp`, `iat`, `nonce` (hvis brukt) - - Verifiser signatur mot Ansattporten sitt JWK-endepunkt - - [Les mer: OpenID Connect ID Token Validation](https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation) - -- [ ] **Respektere token-levetider** - - ID-token: Kort levetid, brukes til å opprette lokal sesjon - - Access-token: Typisk 120 sekunder - - Refresh-token: Brukes til å fornye access-token uten brukerinteraksjon - -### Anbefalinger - -- [ ] **Bruke virksomhetssertifikat for klientautentisering** - - Anbefalt metode for klienter med høye krav til sikkerhet - -- [ ] **Bruke well-known endepunkt for dynamisk konfigurasjon** - - Bruk Ansattporten sitt well-known-endepunkt for å finne metadata - - Hent signeringssertifikat fra JWK-endepunkt dynamisk - - Sikrer kontinuerlig tjenesteleveranse ved sertifikatbytte - - [Les mer: Well-known endepunkt](ansattporten_wellknown) +- [ ] Krever at du er [tjenesteeier i Altinn](ansattporten_om#hvem-kan-bruke-ansattporten-) +- [ ] Følg [guide for representasjon](ansattporten_representasjon) — bruker RAR (`authorization_details`) +- [ ] Forstå at Ansattporten kun formidler representasjon fra [autorative kilder](ansattporten_om#autorative-kilder-for-representasjon) — den utfører ikke tilgangskontroll ## Sesjonshåndtering -### Krav - -- [ ] **Forstå isolert SSO-sesjon** - - Ansattporten har ikke SSO mellom ulike tjenester - - Alle klienter får tvangssatt isolert SSO-sesjon - - [Les mer: Ingen SSO-funksjonalitet mellom tjenester](ansattporten_om#ingen-sso-funksjonalitet-mellom-tjenester) - - [Les mer: Isolert SSO-sesjon](../../idporten/oidc/oidc_func_nosso) - -- [ ] **Implementere utlogging** - - Siden SSO er isolert, påvirkes ikke andre tjenester ved utlogging - - Redirect til /endsession-endepunktet ved utlogging - -- [ ] **Konfigurere lokal sesjon til maksimalt 30 minutters inaktivitet** - - Lokal timeout skal være maksimalt 30 minutter ved inaktivitet - -### Anbefalinger - -- [ ] **Følge samme sesjonstider som ID-porten** - - Maksimum 120 minutter fra første autentisering - - Inaktivitet over 30 minutter vil utløpe sesjonen - -## Sikkerhet og Nøkkelhåndtering - -### Krav +- [ ] Forstå at det **ikke er SSO** mellom tjenester i Ansattporten — [isolert sesjon](ansattporten_om#ingen-sso-funksjonalitet-mellom-tjenester) er tvangssatt +- [ ] Implementere utlogging via /endsession-endepunktet +- [ ] Sette lokal sesjon til maks 30 minutter inaktivitet (maks 120 min total) -- [ ] **Etablere sikker nøkkelhåndtering** - - Beskytte private nøkler (client_secret, asymmetriske nøkler, virksomhetssertifikat) - - Definere prosedyrer for nøkkeloppbevaring, backup, og tilgangsstyring - - Dokumentere rutiner for nøkkelfornyelse og kompromitteringshåndtering +## Sikkerhet og nøkkelhåndtering -- [ ] **Gjennomføre risikovurdering** - - Gjøre en risikovurdering av egen løsning +- [ ] Etabler sikker nøkkelhåndtering: oppbevaring, backup, tilgangsstyring, fornyelse, kompromitteringshåndtering +- [ ] Gjennomfør risikovurdering av egen løsning +- [ ] Åpne utgående brannmur for [Ansattporten sine IP-adresser](../../general/IP) (om aktuelt) +- [ ] Vurder HSM for nøkkeloppbevaring og automatisert nøkkelrotasjon -- [ ] **Åpne for Ansattporten sine IP-adresser** - - Dersom utgående brannmur: Åpne for Ansattporten sine IP-adresser - - [Les mer: IP-adresser](../../general/IP) +## Logging og testing -### Anbefalinger - -- [ ] **Bruke HSM for nøkkeloppbevaring** - - For optimal beskyttelse: Oppbevar private nøkler i kryptografisk hardware (HSM) - -- [ ] **Implementere rotasjon av asymmetriske nøkler** - - For kunder med mange integrasjoner: Bruk virksomhetssertifikat til å automatisere vedlikehold - - La hver integrasjon bruke asymmetrisk nøkkel som roteres hyppig - -## Logging og Sporing - -### Krav - -- [ ] **Implementere tilstrekkelig logging** - - Logg følgende om autentiseringsforsøk: - - Dato og tidspunkt - - Hvilken handling som ble forsøkt - - Resultatet av handlingen - - Brukerens IP-adresse - - SessionIndex / sid - - Eventuelt valgt organisasjon (ved representasjon) - -- [ ] **Vurdere personvern i logging** - - Vurder behovet for logging opp mot personvernbetraktninger - -## Testing - -### Krav - -- [ ] **Teste i riktig testmiljø** - - Test-miljø: `https://test.ansattporten.no` - - Prod-miljø: `https://ansattporten.no` - - [Les mer: Well-known endepunkt](ansattporten_wellknown) - -- [ ] **Bruke korrekt well-known endepunkt** - - Test: [https://test.ansattporten.no/.well-known/openid-configuration](https://test.ansattporten.no/.well-known/openid-configuration) - - Prod: [https://ansattporten.no/.well-known/openid-configuration](https://ansattporten.no/.well-known/openid-configuration) - - [Les mer: Well-known endepunkt](ansattporten_wellknown) +- [ ] Logg autentiseringsforsøk: tidspunkt, handling, resultat, IP-adresse, `sid`, valgt organisasjon +- [ ] Vurder personvern i logging +- [ ] Test i riktig miljø — well-known: [test](https://test.ansattporten.no/.well-known/openid-configuration) / [prod](https://ansattporten.no/.well-known/openid-configuration) ## Kostnader -### Forstå finansieringsmodell - -- [ ] **Kjenne til kostnadsmodell** - - Ansattporten har samme finansieringsmodell som ID-porten - - 200.000-innnloggingskvoten er felles for de to portene - - Finansieringsmodell kan endre seg i fremtiden - - [Les mer: Hva koster Ansattporten?](ansattporten_om#hva-koster-ansattporten-) - -## Problemer og Support +- [ ] Kjenn til at Ansattporten deler [200.000-innloggingskvoten](ansattporten_om#hva-koster-ansattporten-) med ID-porten -### Ved problemer +## Ved problemer -- [ ] **Kontakte servicedesk ved problemer** - - E-post: servicedesk@digdir.no - - Oppgi: client_id, miljø og beskrivelse av problemet +Kontakt servicedesk@digdir.no — oppgi client_id, miljø og beskrivelse. ## Ressurser -- [Ansattporten er nå i produksjon (Samarbeidsportalen)](https://samarbeid.digdir.no/ansattporten/ansattporten-er-no-i-produksjon-som-ei-fullverdig-fellesloysing/2969) - [Hva er Ansattporten?](ansattporten_om) -- [Vanlig innlogging](ansattporten_guide) -- [Innlogging på vegne av virksomhet](ansattporten_representasjon) -- [Datadeling på vegne av virksomhet](ansattporten_oauth2) -- [Ansattporten protokoll](ansattporten_protocol) +- [Integrasjonsguide (vanlig innlogging)](ansattporten_guide) +- [Representasjon i Ansattporten](ansattporten_representasjon) - [Well-known endepunkt](ansattporten_wellknown) -- [Isolert SSO-sesjon](../../idporten/oidc/oidc_func_nosso) -- [PKCE - Proof Key for Code Exchange](../../idporten/oidc/oidc_func_pkce) -- [OpenID Connect Core 1.0 spesifikasjon](https://openid.net/specs/openid-connect-core-1_0.html) -- [Altinn Autorisasjon](https://altinn.github.io/docs/utviklingsguider/sikkerhet-i-eoppslag/tilgangsstyrer/) +- [Samarbeidsportalen](https://samarbeid.digdir.no/ansattporten/ansattporten-er-no-i-produksjon-som-ei-fullverdig-fellesloysing/2969) diff --git a/_docs/idporten/idporten_checklist.md b/_docs/idporten/idporten_checklist.md index 30336a483..bb74668f3 100644 --- a/_docs/idporten/idporten_checklist.md +++ b/_docs/idporten/idporten_checklist.md @@ -8,296 +8,80 @@ product: ID-porten # Sjekkliste for ID-porten Integrasjon -Denne sjekklisten gir en oversikt over krav og anbefalinger for integrasjon mot ID-porten. +Kortfattet sjekkliste for integrasjon mot ID-porten. For detaljer, se [integrasjonsguiden](oidc_guide_idporten) og [overordnet arkitekturbeskrivelse](idporten_overordnet). -## Før Oppstart +## Før oppstart -### Krav - -- [ ] **Akseptere bruksvilkår** - - Les og aksepter bruksvilkår for ID-porten - - [Les mer: Hvordan få tilgang til ID-porten](https://samarbeid.digdir.no/id-porten/ta-i-bruk-id-porten/94) - - [Les mer: Overordnet arkitekturbeskrivelse](idporten_overordnet#hvordan-få-tilgang-til-id-porten) - -- [ ] **Registrere integrasjon i selvbetjening** - - Bruk selvbetjeningsløsningen på Samarbeidsportalen til å registrere påkrevd informasjon om integrasjonen - - [Les mer: Klientregistrering](oidc_func_clientreg) - - [Les mer: Overordnet arkitekturbeskrivelse](idporten_overordnet#bruk-selvbetjening-til-å-registere-integrasjonen-din) - -- [ ] **Sende inn logo** - - Kunde må sende logo til ID-porten som brukes i innloggingsbildet - - Filformat: .png, .jpg eller .gif - - Maksimal høyde: 90 pixel - - Bredde: ikke overskride 135 pixel - - Bakgrunnsfarge: #f3f4f4 eller transparent bakgrunn - - [Les mer: Logo](idporten_logo) - - [Les mer: Overordnet arkitekturbeskrivelse](idporten_overordnet#send-oss-logoen-din) +- [ ] Akseptere [bruksvilkår for ID-porten](https://samarbeid.digdir.no/id-porten/ta-i-bruk-id-porten/94) +- [ ] [Registrere integrasjon](oidc_func_clientreg) i selvbetjening på Samarbeidsportalen +- [ ] [Sende inn logo](idporten_logo) (png/jpg/gif, maks 90x135px, bakgrunn #f3f4f4 eller transparent) ## Autentiseringsforespørsel -### Krav - -- [ ] **Bruke PKCE (Proof Key for Code Exchange)** - - Alle klienter må som hovedregel bruke PKCE i autentiseringsforespørselen - - `code_verifier` må være minst 43 karakterer lang, og ikke lengre enn 128 karakterer - - Støtter kun `code_challenge_method=S256` - - [Les mer: PKCE](oidc_func_pkce) - - [Les mer: Integrasjonsguide](oidc_guide_idporten#1-autentiseringsforespørsel-til-autorisasjons-endepunktet) - -- [ ] **Inkludere påkrevde parametere i autentiseringsforespørsel** - - `client_id`: Din registrerte klient-ID - - `redirect_uri`: Forhåndsregistrert redirect URI - - `scope`: Minimum `openid` - - `response_type`: `code` for autorisasjonskode-flyt - - `code_challenge`: Hash'et versjon av code_verifier - - `code_challenge_method`: `S256` - - [Les mer: Autorisasjonsendepunktet](oidc_protocol_authorize) - - [Les mer: Integrasjonsguide](oidc_guide_idporten#1-autentiseringsforespørsel-til-autorisasjons-endepunktet) - -- [ ] **Forespørre korrekt sikkerhetsnivå (acr_values)** - - Spesifiser korrekt sikkerhetsnivå basert på risikovurdering - - Gyldige verdier: `idporten-loa-substantial`, `idporten-loa-high` - - [Les mer: Veileder for valg av sikkerhetsnivå](https://www.digdir.no/digital-samhandling/veileder-identifikasjon-og-sporbarhet-i-elektronisk-kommunikasjon-med-og-i-offentlig-sektor/2992#veiledning_for_valg_av_sikkerhetsniv_for_identifikasjon) - - [Les mer: Autorisasjonsendepunktet](oidc_protocol_authorize) - -### Anbefalinger - -- [ ] **Bruke state-parameter** - - Inkluder `state` i autentiseringsforespørselen for å beskytte mot CSRF-angrep - - [Les mer: Integrasjonsguide](oidc_guide_idporten#1-autentiseringsforespørsel-til-autorisasjons-endepunktet) - -- [ ] **Bruke nonce-parameter** - - Inkluder `nonce` i autentiseringsforespørselen for ekstra beskyttelse mot replay-angrep - - [Les mer: Integrasjonsguide](oidc_guide_idporten#1-autentiseringsforespørsel-til-autorisasjons-endepunktet) - -- [ ] **Vurdere PAR (Pushed Authorization Request)** - - For tjenester med høye krav til sikkerhet bør du bruke PAR til å POSTe autentiseringsparametrene direkte til ID-porten - - Dette beskytter parametrene mot manipulasjon i brukers browser - - [Les mer: PAR](oidc_protocol_par) - - [Les mer: Integrasjonsguide](oidc_guide_idporten#1-autentiseringsforespørsel-til-autorisasjons-endepunktet) - -- [ ] **Sette ui_locales for språkvalg** - - Spesifiser ønsket språk for innloggingsgrensesnittet (nb, nn, en, se) - - [Les mer: Autorisasjonsendepunktet](oidc_protocol_authorize) - - [Les mer: Integrasjonsguide](oidc_guide_idporten#2-bruker-autentiserer-seg) +- [ ] Bruke [PKCE](oidc_func_pkce) med `code_challenge_method=S256` +- [ ] Inkludere påkrevde parametere: `client_id`, `redirect_uri`, `scope` (min. `openid`), `response_type=code` +- [ ] Velge riktig [sikkerhetsnivå](oidc_protocol_authorize) (`idporten-loa-substantial` eller `idporten-loa-high`) basert på risikovurdering +- [ ] Bruke `state` (CSRF-beskyttelse) og `nonce` (replay-beskyttelse) +- [ ] Vurdere [PAR](oidc_protocol_par) for tjenester med høye sikkerhetskrav ## Token-håndtering -### Krav - -- [ ] **Implementere korrekt klientautentisering** - - Velg én av støttede metoder: - - `client_secret_basic` / `client_secret_post` - basert på client_secret - - `private_key_jwt` - basert på JWT'er signert med virksomhetssertifikat (anbefalt for høy sikkerhet) - - [Les mer: Token-endepunktet](oidc_protocol_token) - - [Les mer: Integrasjonsguide](oidc_guide_idporten#4-utstedelse-av-token-fra-token-endepunktet) - -- [ ] **Sende code_verifier i token-forespørsel** - - Inkluder den originale `code_verifier` i token-forespørselen for å fullføre PKCE-flyten - - [Les mer: PKCE](oidc_func_pkce) - - [Les mer: Integrasjonsguide](oidc_guide_idporten#4-utstedelse-av-token-fra-token-endepunktet) - -- [ ] **Validere ID-token korrekt** - - Følg kapittel 3.1.3.7 i OpenID Connect Core 1.0 spesifikasjonen - - Kritisk: Validere at faktisk brukt sikkerhetsnivå `acr` matcher forespurt nivå - - Validere `iss`, `aud`, `exp`, `iat`, `nonce` (hvis brukt) - - Verifiser signatur - - [Les mer: OpenID Connect ID Token Validation](https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation) - - [Les mer: ID-token](oidc_protocol_id_token) - - [Les mer: Integrasjonsguide](oidc_guide_idporten#id_token) - -- [ ] **Respektere token-levetider** - - ID-token: Kort levetid, brukes til å opprette lokal sesjon - - Access-token: Typisk 120 sekunder - - Refresh-token: Brukes til å fornye access-token uten brukerinteraksjon - - [Les mer: Integrasjonsguide](oidc_guide_idporten#access_token) - -### Anbefalinger - -- [ ] **Bruke virksomhetssertifikat for klientautentisering** - - Anbefalt metode for klienter med høye krav til sikkerhet - - [Les mer: Bruk av virksomhetssertifikat](idporten_overordnet#bruk-av-virksomhetssertifikat) - - [Les mer: Integrasjonsguide](oidc_guide_idporten#4-utstedelse-av-token-fra-token-endepunktet) +- [ ] Implementere [klientautentisering](oidc_protocol_token) (`client_secret_basic`, `client_secret_post`, eller `private_key_jwt`) +- [ ] Sende `code_verifier` i token-forespørselen +- [ ] [Validere ID-token](oidc_protocol_id_token): signatur, `iss`, `aud`, `exp`, `iat`, `nonce`, og at `acr` matcher forespurt nivå +- [ ] Respektere token-levetider og bruke refresh_token for fornyelse ## Sesjonshåndtering -### Krav - -- [ ] **Implementere støtte for Single Logout (SLO)** - - **Kritisk**: Alle tjenester som bruker SSO må implementere SLO - - Feilkonfigurert logout hos én kunde kan ødelegge for andre kunder - - Håndtere to scenarier: - 1. Bruker logger ut fra din tjeneste: Redirect til /endsession-endepunktet - 2. Bruker logger ut fra annen tjeneste: Håndtere front_channel_logout-melding - - [Les mer: Utlogging og single logout](oidc_func_sso) - - [Les mer: Integrasjonsguide - Krav til utlogging](oidc_guide_idporten#krav-til-utlogging) - -- [ ] **Konfigurere lokal sesjon til maksimalt 30 minutters inaktivitet** - - Lokal timeout skal være maksimalt 30 minutter ved inaktivitet - - [Les mer: Levetid for kundens lokale sesjon](oidc_guide_idporten#levetid-for-kundens-lokale-sesjon) - -- [ ] **Sende bruker til ID-porten ved lokal timeout** - - Etter lokal timeout skal brukerens nettleser sendes til ID-porten med ny autentiseringsforespørsel - - [Les mer: Levetid for kundens lokale sesjon](oidc_guide_idporten#levetid-for-kundens-lokale-sesjon) - -- [ ] **Håndtere front_channel_logout-meldinger** - - Identifisere og invalidere lokal brukersesjon basert på `sid` fra logout-melding - - [Les mer: Backchannel logout](oidc_func_backchannel_logout) - - [Les mer: Integrasjonsguide - Krav til utlogging](oidc_guide_idporten#krav-til-utlogging) - -### Anbefalinger - -- [ ] **Bruke samme sesjonstider som ID-porten** - - ID-porten bruker maksimum 120 minutter fra første autentisering - - Inaktivitet over 30 minutter vil utløpe SSO-sesjonen - - [Les mer: Levetid for SSO-sesjonen](oidc_guide_idporten#levetid-for-sso-sesjonen-i-id-porten) - -- [ ] **Vurdere tvungen re-autentisering** - - For sikkerhetskritiske operasjoner: Bruk `prompt=login` for å tvinge aktiv pålogging - - [Les mer: Tvungen re-autentisering](oidc_guide_idporten#tvungen-re-autentisering) - -- [ ] **Vurdere isolert SSO-sesjon** - - For tjenester som ikke skal delta i felles SSO-sesjon - - [Les mer: Isolert SSO-sesjon](oidc_func_nosso) - - [Les mer: Tvungen re-autentisering](oidc_guide_idporten#tvungen-re-autentisering) +- [ ] **Implementere [Single Logout (SLO)](oidc_func_sso)** — kritisk for alle som bruker SSO + - Scenario 1: Bruker logger ut hos deg → redirect til /endsession + - Scenario 2: Bruker logger ut annet sted → håndter `front_channel_logout` basert på `sid` +- [ ] Sette lokal sesjon til maks 30 minutter inaktivitet +- [ ] Sende bruker til ID-porten med ny autentiseringsforespørsel ved lokal timeout +- [ ] Vurdere `prompt=login` for [tvungen re-autentisering](oidc_guide_idporten#tvungen-re-autentisering) ved sikkerhetskritiske operasjoner +- [ ] Vurdere [isolert SSO-sesjon](oidc_func_nosso) for tjenester som ikke skal dele sesjon -## Sikkerhet og Nøkkelhåndtering +## Sikkerhet og nøkkelhåndtering -### Krav +- [ ] Etabler sikker nøkkelhåndtering: oppbevaring, backup, tilgangsstyring, fornyelse, kompromitteringshåndtering +- [ ] Gjennomfør risikovurdering — bruk til å velge sikkerhetsnivå og autentiseringsmetode +- [ ] Åpne utgående brannmur for [ID-portens IP-adresser](../../general/IP) (om aktuelt) +- [ ] Vurder HSM for nøkkeloppbevaring +- [ ] Vurder [virksomhetssertifikat](idporten_overordnet#bruk-av-virksomhetssertifikat) for klientautentisering og automatisert nøkkelrotasjon -- [ ] **Etablere sikker nøkkelhåndtering** - - Beskytte private nøkler (client_secret, asymmetriske nøkler, virksomhetssertifikat) - - Definere prosedyrer for nøkkeloppbevaring, backup, og tilgangsstyring - - Dokumentere rutiner for nøkkelfornyelse og kompromitteringshåndtering - - [Les mer: Sørg for sikker håndtering av nøkler](idporten_overordnet#sørg-for-sikker-håndtering-av-nøkler) +## Logging -- [ ] **Gjennomføre risikovurdering** - - Gjøre en risikovurdering av egen løsning - - Bruk risikovurderingen til å velge riktig sikkerhetsnivå - - [Les mer: Veileder for valg av sikkerhetsnivå](https://www.digdir.no/digital-samhandling/veileder-identifikasjon-og-sporbarhet-i-elektronisk-kommunikasjon-med-og-i-offentlig-sektor/2992#veiledning_for_valg_av_sikkerhetsniv_for_identifikasjon) - - [Les mer: Etabler gode IT-sikkerhetsrutiner](idporten_overordnet#etabler-gode-it-sikkerhetsrutiner-i-virksomheten) - -- [ ] **Åpne for ID-portens IP-adresser** - - Dersom utgående brannmur: Åpne for ID-portens IP-adresser - - [Les mer: IP-adresser](../../general/IP) - - [Les mer: Åpne for IP-adresser](idporten_overordnet#åpne-for-ip-adresser) - -### Anbefalinger - -- [ ] **Bruke HSM for nøkkeloppbevaring** - - For optimal beskyttelse: Oppbevar private nøkler i kryptografisk hardware (HSM) - - [Les mer: Sørg for sikker håndtering av nøkler](idporten_overordnet#sørg-for-sikker-håndtering-av-nøkler) - -- [ ] **Implementere rotasjon av asymmetriske nøkler** - - For kunder med mange integrasjoner: Bruk virksomhetssertifikat til å automatisere vedlikehold - - La hver integrasjon bruke asymmetrisk nøkkel som roteres hyppig - - [Les mer: Bruk av virksomhetssertifikat](idporten_overordnet#bruk-av-virksomhetssertifikat) - -- [ ] **Følge anbefalinger for sertifikatbehandling** - - Les Veileder for virksomhetsautentisering om sertifikatbehandling, logging og sporing - - [Les mer: Anbefalinger for sertifikatbehandling](https://www.digdir.no/datadeling/sertifikatbehandling-logging-og-sporing/2438) - - [Les mer: Etabler gode IT-sikkerhetsrutiner](idporten_overordnet#etabler-gode-it-sikkerhetsrutiner-i-virksomheten) - -## Logging og Sporing - -### Krav - -- [ ] **Implementere tilstrekkelig logging** - - Logg følgende om autentiseringsforsøk: - - Dato og tidspunkt - - Hvilken handling som ble forsøkt - - Resultatet av handlingen - - Brukerens IP-adresse - - SessionIndex / sid - - Fødselsnummer (vurder personvernbetraktninger) - - [Les mer: Sørg for tilstrekkelig egen logging](idporten_overordnet#sørg-for-tilstrekkelig-egen-logging) - -- [ ] **Vurdere personvern i logging** - - Vurder behovet for logging opp mot personvernbetraktninger - - [Les mer: Sørg for tilstrekkelig egen logging](idporten_overordnet#sørg-for-tilstrekkelig-egen-logging) +- [ ] Logg autentiseringsforsøk: tidspunkt, handling, resultat, IP-adresse, `sid` +- [ ] Vurder personvern i logging (fødselsnummer vs. behov) +- [ ] Følg [anbefalinger for sertifikatbehandling, logging og sporing](https://www.digdir.no/datadeling/sertifikatbehandling-logging-og-sporing/2438) ## Testing -### Krav - -- [ ] **Gjennomføre verifikasjonstester** - - Utføre påkrevde verifikasjonstester for å bekrefte at integrasjonen oppfyller ID-portens krav - - [Les mer: Verifikasjonstester](idporten_verifikasjonstester) - - [Les mer: Test din egen løsning](idporten_overordnet#test-din-egen-løsning) - -- [ ] **Bruke testbrukere** - - Bruk ID-portens testbrukere i testmiljø - - [Les mer: Testbrukere](idporten_testbrukere) - - [Les mer: Test din egen løsning](idporten_overordnet#test-din-egen-løsning) - -- [ ] **Teste i riktig testmiljø** - - I testmiljø tillates redirect tilbake til localhost - - [Les mer: Integrasjonsguide - Respons](oidc_guide_idporten#authresponse) +- [ ] Utfør [verifikasjonstester](idporten_verifikasjonstester) med [testbrukere](idporten_testbrukere) +- [ ] Test i testmiljø (tillater redirect til localhost) -## Spesielle Bruksområder +## Spesielle bruksområder -### For Mobilapper - -- [ ] **Følge integrasjonsguide for mobilapper** - - Mobilapper har en litt annen måte å bruke autorisasjonskode-flyten på - - [Les mer: Autentisering i app](oidc_auth_app) - - [Les mer: Integrasjonsguide](oidc_guide_idporten#overordna-beskrivelse-av-bruksområdet) - -### For JavaScript-applikasjoner/SPA - -- [ ] **Følge integrasjonsguide for SPA** - - JavaScript-applikasjoner (Single Page Applications) har spesielle sikkerhetskrav - - [Les mer: Autentisering i SPA](oidc_auth_spa) - - [Les mer: Integrasjonsguide](oidc_guide_idporten#overordna-beskrivelse-av-bruksområdet) - -### For API-sikring - -- [ ] **Implementere brukerstyrt datadeling korrekt** - - API-tilgangen kan være innloggingsbasert (implisitt samtykke) eller brukerstyrt (eksplisitt samtykke) - - Autorisasjonen gjelder kun for en enkelt innbygger - - [Les mer: API-sikring med OAuth2](oidc_auth_oauth2) - - [Les mer: Overordnet - Brukerstyrt datadeling](idporten_overordnet#brukerstyrt-datadeling) - -### For Innlogging på vegne av andre - -- [ ] **Implementere fullmaktsstøtte** - - For tjenester som skal støtte innlogging på vegne av andre - - [Les mer: Innlogging på vegne av andre](oidc_auth_fullmakt) - - [Les mer: Overordnet - Introduksjon](idporten_overordnet#introduksjon) +- [ ] **Mobilapper**: Følg [integrasjonsguide for app](oidc_auth_app) +- [ ] **SPA/JavaScript**: Følg [integrasjonsguide for SPA](oidc_auth_spa) +- [ ] **API-sikring**: Implementer [brukerstyrt datadeling](oidc_auth_oauth2) korrekt +- [ ] **Fullmakt**: Implementer [innlogging på vegne av andre](oidc_auth_fullmakt) ## Tilleggsfunksjonalitet (valgfritt) -### Anbefalinger - -- [ ] **Hente brukerinformasjon fra userinfo-endepunkt** - - Ved å forespørre scopet `profile` kan du hente ytterligere data fra userinfo-endepunktet - - Gir tilgang til personnummer og valgt språk under innlogging - - [Les mer: Userinfo-endepunkt](oidc_protocol_userinfo) - - [Les mer: Integrasjonsguide - Userinfo](oidc_guide_idporten#5-userinfo-endepunkt) - -- [ ] **Hente kontaktopplysninger fra KRR** - - Ved å forespørre `krr:user/kontaktinformasjon.read`-scopet får du tilgang til kontaktopplysninger fra Kontakt- og Reservasjonsregisteret - - [Les mer: Brukerspesifikt oppslag i KRR](../../Kontaktregisteret/Brukerspesifikt-oppslag_rest) - - [Les mer: Integrasjonsguide - KRR](oidc_guide_idporten#6-kontaktopplysninger-fra-kontakt--og-reservasjonsregisteret) +- [ ] Hente brukerinfo via `profile`-scope fra [userinfo-endepunktet](oidc_protocol_userinfo) +- [ ] Hente kontaktopplysninger fra [KRR](../../Kontaktregisteret/Brukerspesifikt-oppslag_rest) via `krr:user/kontaktinformasjon.read` +- [ ] Vurdere støtte for [utenlandske brukere (eIDAS)](oidc_func_eidas) -- [ ] **Støtte for utenlandske brukere** - - Vurdere om tjenesten skal støtte utenlandske brukere (eIDAS) - - [Les mer: Utenlandske brukere](oidc_func_utanlandske_brukarar) - - [Les mer: eIDAS](oidc_func_eidas) +## Ved problemer -## Problemer og Support - -### Ved problemer - -- [ ] **Kontakte servicedesk ved problemer** - - E-post: servicedesk@digdir.no - - Oppgi: client_id, miljø og beskrivelse av problemet - - [Les mer: Problemer?](idporten_overordnet#problemer-) +Kontakt servicedesk@digdir.no — oppgi client_id, miljø og beskrivelse. ## Ressurser -- [ID-porten produktside på Samarbeidsportalen](https://samarbeid.digdir.no/id-porten/id-porten/18) -- [Ta i bruk ID-porten](https://samarbeid.digdir.no/id-porten/ta-i-bruk-id-porten/94) +- [Integrasjonsguide for ID-porten](oidc_guide_idporten) +- [Overordnet arkitekturbeskrivelse](idporten_overordnet) +- [Samarbeidsportalen](https://samarbeid.digdir.no/id-porten/id-porten/18) - [Integrasjonsguide - Autentisering med OpenID Connect](oidc_guide_idporten) - [Overordnet arkitekturbeskrivelse](idporten_overordnet) - [Klientregistrering](oidc_func_clientreg) From cb62c1f4396c9c2ce575d30a770906ca47cd69d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigvald=20H=C3=B8yheim?= Date: Fri, 26 Jun 2026 11:08:58 +0200 Subject: [PATCH 4/5] tydleggjere sikkerhetsrelaterte punkt --- _docs/Maskinporten/maskinporten_checklist.md | 26 ++++++------ .../maskinporten_samtykke_checklist.md | 12 +++--- _docs/ansattporten/ansattporten_checklist.md | 22 +++++----- _docs/idporten/idporten_checklist.md | 42 ++++++++++--------- 4 files changed, 55 insertions(+), 47 deletions(-) diff --git a/_docs/Maskinporten/maskinporten_checklist.md b/_docs/Maskinporten/maskinporten_checklist.md index eea506f1d..c59c2566e 100644 --- a/_docs/Maskinporten/maskinporten_checklist.md +++ b/_docs/Maskinporten/maskinporten_checklist.md @@ -10,15 +10,17 @@ product: Maskinporten Kortfattet sjekkliste for integrasjon mot Maskinporten. For detaljer, se [guide for API-tilbydere](maskinporten_guide_apitilbyder) og [guide for API-konsumenter](maskinporten_guide_apikonsument). +> 🔒 = sikkerheitsrelatert punkt. **Krav** = må oppfyllast. **Anbefalt** = bør oppfyllast. + ## For API-tilbyder - [ ] Akseptere Digdir sine [bruksvilkår](https://samarbeid.digdir.no) for fellesløsninger - [ ] [Få tildelt API-prefiks](maskinporten_guide_apitilbyder#1-manuell-tildeling-av-prefix) - [ ] [Opprette scopes](maskinporten_guide_apitilbyder#beskrivelse-av-apier) med riktig syntaks, synlighet og begrensninger - [ ] [Gi tilgang til konsumenter](maskinporten_guide_apitilbyder#1b-tilgangsstyring---via-samarbeidsportalen) basert på organisasjonsnummer -- [ ] [Validere token](maskinporten_guide_apitilbyder#4-validere-token): issuer, signatur, scope, utløpstid -- [ ] Bruke `consumer`-claimet for tilgangskontroll — **ikke** `client_id` eller `client_org` -- [ ] Ved delegering: [Logg `supplier` og `delegation_source` claims](maskinporten_guide_apitilbyder#4-validere-token) +- [ ] 🔒 [Validere token](maskinporten_guide_apitilbyder#4-validere-token): issuer, signatur, scope, utløpstid +- [ ] 🔒 Bruke `consumer`-claimet for tilgangskontroll — **ikke** `client_id` eller `client_org` +- [ ] 🔒 Ved delegering: [Logg `supplier` og `delegation_source` claims](maskinporten_guide_apitilbyder#4-validere-token) ### Delegering via Altinn (valgfritt) @@ -29,16 +31,16 @@ Kortfattet sjekkliste for integrasjon mot Maskinporten. For detaljer, se [guide - [ ] Få tilgang til ønsket scope fra API-tilbyder - [ ] [Opprette integrasjon](maskinporten_guide_apikonsument#4-opprett-en-integrasjon-i-maskinporten) med riktige egenskaper -- [ ] [Generere og signere JWT-grant](maskinporten_guide_apikonsument#5-be-om-token) med påkrevde claims -- [ ] Sikre at hver JWT er unik (bruk `jti`) +- [ ] 🔒 [Generere og signere JWT-grant](maskinporten_guide_apikonsument#5-be-om-token) med påkrevde claims +- [ ] 🔒 Sikre at hver JWT er unik (bruk `jti`) - [ ] [Sende API-kall](maskinporten_guide_apikonsument#6-sende-api-kall-med-token) med `Authorization: Bearer ` - [ ] Håndtere token-utløp (hent nytt ved 401, gjenbruk innen levetiden) ### Anbefalinger -- [ ] Bruk separate klienter for ulike APIer -- [ ] Foretrekk [egen asymmetrisk nøkkel](maskinporten_guide_apikonsument#registrere-klient-som-bruker-egen-nøkkel) fremfor virksomhetssertifikat -- [ ] Be om ett scope per token +- [ ] 🔒 Bruk separate klienter for ulike APIer — reduserer skadeomfang ved kompromittering +- [ ] 🔒 Foretrekk [egen asymmetrisk nøkkel](maskinporten_guide_apikonsument#registrere-klient-som-bruker-egen-nøkkel) fremfor virksomhetssertifikat — unngå å spre sertifikatet +- [ ] 🔒 Be om ett scope per token — begrens tilgangen i kvart token ### Delegering via Altinn (for leverandører) @@ -50,13 +52,13 @@ Kortfattet sjekkliste for integrasjon mot Maskinporten. For detaljer, se [guide ### Sikkerhet og nøkkelhåndtering -- [ ] Etabler sikker nøkkelhåndtering: oppbevaring, backup, tilgangsstyring, og rutiner for fornyelse og kompromittering -- [ ] Gjennomfør risikovurdering av egen løsning -- [ ] Åpne utgående brannmur for Maskinporten sine IP-adresser (om aktuelt) +- [ ] 🔒 **Krav:** Etabler sikker nøkkelhåndtering — beskytt private nøklar, definer prosedyrar for oppbevaring, backup, tilgangsstyring, fornyelse og kompromitteringshåndtering +- [ ] 🔒 **Krav:** Gjennomfør risikovurdering av eigen løysing — avgjer kva API-ar ein klient skal ha tilgang til +- [ ] 🔒 **Krav:** Åpne utgåande brannmur for Maskinporten sine IP-adresser (om aktuelt) ### Logging og testing -- [ ] Logg token-forespørsler, API-kall, feil og sikkerhetshendelser +- [ ] 🔒 **Krav:** Logg token-forespørslar, API-kall, feil og sikkerheitshendingar - [ ] API-tilbydere: Logg consumer-informasjon for sporbarhet - [ ] Test i riktig testmiljø før produksjon diff --git a/_docs/Maskinporten/maskinporten_samtykke_checklist.md b/_docs/Maskinporten/maskinporten_samtykke_checklist.md index b7e05e1e5..2cfca150f 100644 --- a/_docs/Maskinporten/maskinporten_samtykke_checklist.md +++ b/_docs/Maskinporten/maskinporten_samtykke_checklist.md @@ -10,12 +10,14 @@ product: Maskinporten Kortfattet sjekkliste for bruk av samtykketoken. For detaljer, se [Samtykketoken i Maskinporten](maskinporten_func_samtykke). +> 🔒 = sikkerheitsrelatert punkt. **Krav** = må oppfyllast. **Anbefalt** = bør oppfyllast. + ## For API-tilbyder/Tjenesteeier - [ ] [Opprette samtykkeressurs](https://docs.altinn.studio/nb/authorization/guides/resource-owner/consent/) i Altinn 3 og oppbevare uuid - [ ] Sikre at sluttbruker aksepterer samtykket før bruk -- [ ] Validere `id`, `from`, `to` og `scope` i samtykke-tokenet -- [ ] Oppfylle [datatilsynets krav til samtykke](https://www.datatilsynet.no/rettigheter-og-plikter/virksomhetenes-plikter/behandlingsgrunnlag/veileder-om-behandlingsgrunnlag/?id=176) +- [ ] 🔒 **Krav:** Validere `id`, `from`, `to` og `scope` i samtykke-tokenet — sikrar at tokenet gjeld rett samtykke, rett person/org og rett API +- [ ] 🔒 **Krav:** Oppfylle [datatilsynets krav til samtykke](https://www.datatilsynet.no/rettigheter-og-plikter/virksomhetenes-plikter/behandlingsgrunnlag/veileder-om-behandlingsgrunnlag/?id=176) ## For Datakonsument/Tjenesteleverandør @@ -24,13 +26,13 @@ Kortfattet sjekkliste for bruk av samtykketoken. For detaljer, se [Samtykketoken - [ ] Bruke [RAR-forespørsel](maskinporten_func_samtykke#grensesnittsdefinisjon) av type `urn:altinn:consent` med påkrevde claims (`type`, `id`, `from`) - [ ] Kun forespørre ett samtykke per token-request - [ ] Alltid inkludere ett eller flere OAuth2 scopes i JWT-grantet -- [ ] Sikre at `consumer` matcher `to`-claim i responsen -- [ ] Ved delegerte scopes: samtykket må være gitt til den som har delegert scopet +- [ ] 🔒 **Krav:** Sikre at `consumer` matcher `to`-claim i responsen — forhindrar uautorisert tilgang +- [ ] 🔒 **Krav:** Ved delegerte scopes: samtykket må vere gitt til den som har delegert scopet ## Generelt - [ ] Forstå [samtykke-tokenets innhold](maskinporten_func_samtykke#respons): `id`, `from`, `to`, `consented`, `validTo`, `consentRights` -- [ ] Sjekk `validTo` — samtykket har et utløpstidspunkt +- [ ] 🔒 Sjekk `validTo` — bruk ikkje samtykke som er utløpt ## Ressurser diff --git a/_docs/ansattporten/ansattporten_checklist.md b/_docs/ansattporten/ansattporten_checklist.md index 819ede4b4..ec4f66817 100644 --- a/_docs/ansattporten/ansattporten_checklist.md +++ b/_docs/ansattporten/ansattporten_checklist.md @@ -10,6 +10,8 @@ product: Ansattporten Kortfattet sjekkliste for integrasjon mot Ansattporten. For detaljer, se [Hva er Ansattporten?](ansattporten_om) og [integrasjonsguiden](ansattporten_guide). +> 🔒 = sikkerheitsrelatert punkt. **Krav** = må oppfyllast. **Anbefalt** = bør oppfyllast. + ## Før oppstart - [ ] Akseptere Digdir sine [bruksvilkår](https://samarbeid.digdir.no) for fellesløsninger @@ -18,11 +20,11 @@ Kortfattet sjekkliste for integrasjon mot Ansattporten. For detaljer, se [Hva er ## Autentisering og token -- [ ] Bruke [PKCE](../../idporten/oidc/oidc_func_pkce) med `code_challenge_method=S256` +- [ ] 🔒 **Krav:** Bruke [PKCE](../../idporten/oidc/oidc_func_pkce) med `code_challenge_method=S256` — beskyttar mot autorisasjonskode-avlytting - [ ] Inkludere påkrevde parametere: `client_id`, `redirect_uri`, `scope` (min. `openid`), `response_type=code` -- [ ] Bruke `state` og `nonce` for CSRF- og replay-beskyttelse -- [ ] Validere at `iss` i ID-token stemmer med **Ansattporten** (ikke ID-porten) -- [ ] Bruke [well-known endepunkt](ansattporten_wellknown) for dynamisk konfigurasjon og JWK-henting +- [ ] 🔒 **Krav:** Bruke `state` og `nonce` for CSRF- og replay-beskyttelse +- [ ] 🔒 **Krav:** Validere at `iss` i ID-token stemmer med **Ansattporten** (ikke ID-porten) — feil issuer kan bety at tokenet ikkje er til deg +- [ ] 🔒 **Anbefalt:** Bruke [well-known endepunkt](ansattporten_wellknown) for dynamisk konfigurasjon og JWK-henting — sikrar kontinuerleg drift ved sertifikatbytte ## Representasjon og organisasjonsvelger (valgfritt) @@ -38,15 +40,15 @@ Kortfattet sjekkliste for integrasjon mot Ansattporten. For detaljer, se [Hva er ## Sikkerhet og nøkkelhåndtering -- [ ] Etabler sikker nøkkelhåndtering: oppbevaring, backup, tilgangsstyring, fornyelse, kompromitteringshåndtering -- [ ] Gjennomfør risikovurdering av egen løsning -- [ ] Åpne utgående brannmur for [Ansattporten sine IP-adresser](../../general/IP) (om aktuelt) -- [ ] Vurder HSM for nøkkeloppbevaring og automatisert nøkkelrotasjon +- [ ] 🔒 **Krav:** Etabler sikker nøkkelhåndtering — beskytt private nøklar (client_secret, asymmetriske nøklar, virksomheitssertifikat). Definer prosedyrar for oppbevaring, backup, tilgangsstyring, fornyelse og kompromitteringshåndtering +- [ ] 🔒 **Krav:** Gjennomfør risikovurdering av eigen løysing +- [ ] 🔒 **Krav:** Åpne utgåande brannmur for [Ansattporten sine IP-adresser](../../general/IP) (om aktuelt) +- [ ] 🔒 **Anbefalt:** Bruk HSM for nøkkeloppbevaring og automatisert nøkkelrotasjon ## Logging og testing -- [ ] Logg autentiseringsforsøk: tidspunkt, handling, resultat, IP-adresse, `sid`, valgt organisasjon -- [ ] Vurder personvern i logging +- [ ] 🔒 **Krav:** Logg autentiseringsforsøk: tidspunkt, handling, resultat, IP-adresse, `sid`, valgt organisasjon +- [ ] 🔒 **Krav:** Vurder personvern i logging - [ ] Test i riktig miljø — well-known: [test](https://test.ansattporten.no/.well-known/openid-configuration) / [prod](https://ansattporten.no/.well-known/openid-configuration) ## Kostnader diff --git a/_docs/idporten/idporten_checklist.md b/_docs/idporten/idporten_checklist.md index bb74668f3..d8cd67e6b 100644 --- a/_docs/idporten/idporten_checklist.md +++ b/_docs/idporten/idporten_checklist.md @@ -10,6 +10,8 @@ product: ID-porten Kortfattet sjekkliste for integrasjon mot ID-porten. For detaljer, se [integrasjonsguiden](oidc_guide_idporten) og [overordnet arkitekturbeskrivelse](idporten_overordnet). +> 🔒 = sikkerheitsrelatert punkt. **Krav** = må oppfyllast. **Anbefalt** = bør oppfyllast. + ## Før oppstart - [ ] Akseptere [bruksvilkår for ID-porten](https://samarbeid.digdir.no/id-porten/ta-i-bruk-id-porten/94) @@ -18,42 +20,42 @@ Kortfattet sjekkliste for integrasjon mot ID-porten. For detaljer, se [integrasj ## Autentiseringsforespørsel -- [ ] Bruke [PKCE](oidc_func_pkce) med `code_challenge_method=S256` +- [ ] 🔒 **Krav:** Bruke [PKCE](oidc_func_pkce) med `code_challenge_method=S256` — beskyttar mot autorisasjonskode-avlytting - [ ] Inkludere påkrevde parametere: `client_id`, `redirect_uri`, `scope` (min. `openid`), `response_type=code` -- [ ] Velge riktig [sikkerhetsnivå](oidc_protocol_authorize) (`idporten-loa-substantial` eller `idporten-loa-high`) basert på risikovurdering -- [ ] Bruke `state` (CSRF-beskyttelse) og `nonce` (replay-beskyttelse) -- [ ] Vurdere [PAR](oidc_protocol_par) for tjenester med høye sikkerhetskrav +- [ ] 🔒 **Krav:** Velge riktig [sikkerhetsnivå](oidc_protocol_authorize) (`idporten-loa-substantial` eller `idporten-loa-high`) basert på risikovurdering +- [ ] 🔒 **Krav:** Bruke `state` (CSRF-beskyttelse) og `nonce` (replay-beskyttelse) +- [ ] 🔒 **Anbefalt:** Vurdere [PAR](oidc_protocol_par) for tjenester med høge sikkerheitskrav — beskyttar parametere mot manipulasjon i nettlesar ## Token-håndtering -- [ ] Implementere [klientautentisering](oidc_protocol_token) (`client_secret_basic`, `client_secret_post`, eller `private_key_jwt`) -- [ ] Sende `code_verifier` i token-forespørselen -- [ ] [Validere ID-token](oidc_protocol_id_token): signatur, `iss`, `aud`, `exp`, `iat`, `nonce`, og at `acr` matcher forespurt nivå +- [ ] 🔒 **Krav:** Implementere [klientautentisering](oidc_protocol_token) (`client_secret_basic`, `client_secret_post`, eller `private_key_jwt`) +- [ ] 🔒 **Krav:** Sende `code_verifier` i token-forespørselen — fullfører PKCE-flyten +- [ ] 🔒 **Krav:** [Validere ID-token](oidc_protocol_id_token): signatur, `iss`, `aud`, `exp`, `iat`, `nonce`, og at `acr` matcher forespurt nivå — mangelfull validering er ein vanleg sikkerheitsfeil - [ ] Respektere token-levetider og bruke refresh_token for fornyelse ## Sesjonshåndtering -- [ ] **Implementere [Single Logout (SLO)](oidc_func_sso)** — kritisk for alle som bruker SSO +- [ ] 🔒 **Krav:** **Implementere [Single Logout (SLO)](oidc_func_sso)** — kritisk for alle som bruker SSO. Feilkonfigurert logout hos éin kunde kan øydelegge for andre. - Scenario 1: Bruker logger ut hos deg → redirect til /endsession - Scenario 2: Bruker logger ut annet sted → håndter `front_channel_logout` basert på `sid` -- [ ] Sette lokal sesjon til maks 30 minutter inaktivitet -- [ ] Sende bruker til ID-porten med ny autentiseringsforespørsel ved lokal timeout -- [ ] Vurdere `prompt=login` for [tvungen re-autentisering](oidc_guide_idporten#tvungen-re-autentisering) ved sikkerhetskritiske operasjoner -- [ ] Vurdere [isolert SSO-sesjon](oidc_func_nosso) for tjenester som ikke skal dele sesjon +- [ ] 🔒 **Krav:** Sette lokal sesjon til maks 30 minutter inaktivitet +- [ ] 🔒 **Krav:** Sende bruker til ID-porten med ny autentiseringsforespørsel ved lokal timeout +- [ ] 🔒 **Anbefalt:** Bruk `prompt=login` for [tvungen re-autentisering](oidc_guide_idporten#tvungen-re-autentisering) ved sikkerheitskritiske operasjonar +- [ ] 🔒 **Anbefalt:** Vurder [isolert SSO-sesjon](oidc_func_nosso) for tenester som ikkje skal dele sesjon ## Sikkerhet og nøkkelhåndtering -- [ ] Etabler sikker nøkkelhåndtering: oppbevaring, backup, tilgangsstyring, fornyelse, kompromitteringshåndtering -- [ ] Gjennomfør risikovurdering — bruk til å velge sikkerhetsnivå og autentiseringsmetode -- [ ] Åpne utgående brannmur for [ID-portens IP-adresser](../../general/IP) (om aktuelt) -- [ ] Vurder HSM for nøkkeloppbevaring -- [ ] Vurder [virksomhetssertifikat](idporten_overordnet#bruk-av-virksomhetssertifikat) for klientautentisering og automatisert nøkkelrotasjon +- [ ] 🔒 **Krav:** Etabler sikker nøkkelhåndtering — beskytt private nøklar (client_secret, asymmetriske nøklar, virksomheitssertifikat). Definer prosedyrar for oppbevaring, backup, tilgangsstyring, fornyelse og kompromitteringshåndtering +- [ ] 🔒 **Krav:** Gjennomfør risikovurdering — bruk til å velje sikkerheitsnivå og autentiseringsmetode +- [ ] 🔒 **Krav:** Åpne utgåande brannmur for [ID-portens IP-adresser](../../general/IP) (om aktuelt) +- [ ] 🔒 **Anbefalt:** Bruk HSM for nøkkeloppbevaring +- [ ] 🔒 **Anbefalt:** Bruk [virksomhetssertifikat](idporten_overordnet#bruk-av-virksomhetssertifikat) for klientautentisering og automatisert nøkkelrotasjon ## Logging -- [ ] Logg autentiseringsforsøk: tidspunkt, handling, resultat, IP-adresse, `sid` -- [ ] Vurder personvern i logging (fødselsnummer vs. behov) -- [ ] Følg [anbefalinger for sertifikatbehandling, logging og sporing](https://www.digdir.no/datadeling/sertifikatbehandling-logging-og-sporing/2438) +- [ ] 🔒 **Krav:** Logg autentiseringsforsøk: tidspunkt, handling, resultat, IP-adresse, `sid` +- [ ] 🔒 **Krav:** Vurder personvern i logging (fødselsnummer vs. behov) +- [ ] 🔒 **Anbefalt:** Følg [anbefalingar for sertifikatbehandling, logging og sporing](https://www.digdir.no/datadeling/sertifikatbehandling-logging-og-sporing/2438) ## Testing From c3af357f97f3362afe75a17139ccec3cb27d1adb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigvald=20H=C3=B8yheim?= Date: Mon, 29 Jun 2026 13:44:17 +0200 Subject: [PATCH 5/5] legg til litt ansattporten doc for virksomhetsbro/altinn forskjeller --- _docs/ansattporten/ansattporten_checklist.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/_docs/ansattporten/ansattporten_checklist.md b/_docs/ansattporten/ansattporten_checklist.md index ec4f66817..99267e3f4 100644 --- a/_docs/ansattporten/ansattporten_checklist.md +++ b/_docs/ansattporten/ansattporten_checklist.md @@ -28,9 +28,27 @@ Kortfattet sjekkliste for integrasjon mot Ansattporten. For detaljer, se [Hva er ## Representasjon og organisasjonsvelger (valgfritt) +Ansattporten støttar to [autorative kjelder](ansattporten_om#autorative-kilder-for-representasjon) for representasjon. Vel den som passar ditt bruksscenario: + +### Via Altinn Autorisasjon (RAR-type `ansattporten:altinn:resource`) + - [ ] Krever at du er [tjenesteeier i Altinn](ansattporten_om#hvem-kan-bruke-ansattporten-) +- [ ] Brukar personleg eID (BankID o.l.) — gjev sikkerheitsnivå `substantial` eller `high` +- [ ] Tilgang styrast per Altinn-ressurs med handlingar (`read`, `write` osv.) via roller, tilgangspakkar eller direkte delegering +- [ ] Oppgje `resource` (Altinn-ressurs URN) i RAR-forespørselen + +### Via Virksomhetsbroen (RAR-type `ansattporten:orgno`) + +- [ ] Brukar jobbkonto (Microsoft Entra ID) — gjev sikkerheitsnivå `entraid` (lågare tryggleik enn personleg eID) +- [ ] Arbeidsgjevar styrer tilgang via filterreglar basert på e-postadresse, domene eller Entra ID-gruppe +- [ ] Krev at nokon med Altinn-rolla "Administrere organisasjonstilknytning i Ansattporten" set opp reglane +- [ ] 🔒 **Merk:** Lågare sikkerheitsnivå enn Altinn — eignar seg når høg identitetstryggleik ikkje er påkrevd +- [ ] **Merk:** Framleis i pilot — kontakt Digdir for status + +### Felles for begge + - [ ] Følg [guide for representasjon](ansattporten_representasjon) — bruker RAR (`authorization_details`) -- [ ] Forstå at Ansattporten kun formidler representasjon fra [autorative kilder](ansattporten_om#autorative-kilder-for-representasjon) — den utfører ikke tilgangskontroll +- [ ] 🔒 Forstå at Ansattporten kun formidlar representasjon — **den utfører ikkje tilgangskontroll** for tenesta di. Tenesta må sjølv avgjere om brukaren har tilgang ## Sesjonshåndtering