Skip to content

Latest commit

 

History

History
284 lines (232 loc) · 9.43 KB

README.md

File metadata and controls

284 lines (232 loc) · 9.43 KB

Felles tilgangskontroll for Produktområde Arbeidsoppfølging

Bugs Code Smells Vulnerabilities

Maintainability Rating Security Rating

API for tilgangskontroll med regler som er felles for Produktområde Arbeidsoppfølging. Har også en HTTP-klient som kan trekkes inn som en avhengighet i applikasjoner for å kalle API'et.

Bruk av HTTP-klient

1.Legg til GitHub Package Registry som repository

Det er anbefalt å legge til GitHub Package Registry til slutt for å først søke igjennom andre repositories for avhengigheter.

Maven:

    <repositories>
        <!-- Legger til central eksplisitt for prioritet over github -->
        <repository>
            <id>central</id>
            <url>https://repo.maven.apache.org/maven2</url>
        </repository>
        <repository>
            <id>github</id>
            <url>https://github-package-registry-mirror.gc.nav.no/cached/maven-release</url>
        </repository>
    </repositories>

Gradle:

repositories {
    // Legger til central eksplisitt for prioritet over github
    mavenCentral()
    maven { url "https://github-package-registry-mirror.gc.nav.no/cached/maven-release" }
}

2. Legg til dependency for klienten

Hent siste versjon av klienten på https://github.com/navikt/poao-tilgang/releases og legg til avhengigheten.

Maven:

<dependency>
    <groupId>no.nav.poao-tilgang</groupId>
    <artifactId>client</artifactId>
    <version>YYYY.MM.DD_HH.mm-SHA</version>
</dependency>

Gradle:

dependencies {
    implementation 'no.nav.poao-tilgang:client:YYYY.MM.DD_HH.mm-SHA'
}

3. Legg til applikasjonen din i poao-tilgang sin ACL

# nais-(dev|prod).yaml
 accessPolicy:
   inbound:
     rules:
       - application: <application>
         namespace: <namespace>
         cluster: <cluster>

4. Opprett en instans av klienten

 val client: PoaoTilgangClient = PoaoTilgangCachedClient(
    PoaoTilgangHttpClient(
        baseUrl = "http://poao-tilgang.poao.svc.cluster.local", // or use "http://poao-tilgang.poao.svc.nais.local" if your sending the request from dev-fss/prod-fss
        tokenProvider = { "machine-to-machine token" }
    )
)

5. Ta klienten i bruk

val decision = client.evaluatePolicy(NavAnsattTilgangTilEksternBrukerPolicyInput(
    navAnsattAzureId = UUID.fromString("some id"), // Dette kan hentes fra "oid"-claimet til en NAV ansatt sitt Azure AD JWT token 
    tilgangType = TilgangType.LESE,
    norskIdent = "01234567890" // fnr, dnr etc
)).getOrThrow()

println("Nav ansatt har lesetilgang til bruker: ${decision.isPermit}")

Klient API

interface PoaoTilgangClient {

	/**
	 * Evaluer en policy med gitt input, sjekk {@link no.nav.poao_tilgang.client.PolicyInput.kt} for hvilke policies som er tilgjengelig
	 */
	fun evaluatePolicy(input: PolicyInput): ApiResult<Decision>

	/**
	 * Evaluer flere policies, sjekk {@link no.nav.poao_tilgang.client.PolicyInput.kt} for hvilke policies som er tilgjengelig
	 */
	fun evaluatePolicies(requests: List<PolicyRequest>): ApiResult<List<PolicyResult>>

	/**
	 * Henter alle Azure AD-grupper til en NAV Ansatt ved bruk av objekt IDen til den ansatte
	 */
	fun hentAdGrupper(navAnsattAzureId: UUID): ApiResult<List<AdGruppe>>

	/**
	 * Henter om en enkelt person er skjermet. Skjermet person var tidligere kjent som "egen ansatt"
	 */
	fun erSkjermetPerson(norskIdent: NorskIdent): ApiResult<Boolean>

	/**
	 * Henter om flere personer er skjermet. Skjermet person var tidligere kjent som "egen ansatt"
	 */
	fun erSkjermetPerson(norskeIdenter: List<NorskIdent>): ApiResult<Map<NorskIdent, Boolean>>

}

Tilgjengelig policies

/*
 Sjekker om en NAV ansatt har lese- eller skrivetilgang til en ekstern bruker.
 For funksjoner som gjør endringer på data så ønsker man oftest å benytte sjekk på skrivetilgang,
 mens for funksjoner som kun henter data så benyttes oftest lesetilgang.
 
 Veiledere har både lese- og skrivetilgang, mens f.eks NKS har kun lesetilgang.
*/
data class NavAnsattTilgangTilEksternBrukerPolicyInput(
	val navAnsattAzureId: UUID,
	val tilgangType: TilgangType,
	val norskIdent: String
) : PolicyInput()

/*
 Sjekker om en NAV ansatt har skrivetilgang til en ekstern bruker.
 */
data class NavAnsattNavIdentSkrivetilgangTilEksternBrukerPolicyInput(
    val navIdent: String,
    val norskIdent: String
) : PolicyInput()

/*
 Sjekker om en NAV ansatt har lese til en ekstern bruker.
 */
data class NavAnsattNavIdentLesetilgangTilEksternBrukerPolicyInput(
    val navIdent: String,
    val norskIdent: String
) : PolicyInput()

/* 
 Sjekker om en NAV ansatt har tilgang til å bruke Modia-flaten
*/
data class NavAnsattTilgangTilModiaPolicyInput(
	val navAnsattAzureId: UUID
) : PolicyInput()

/* 
 Sjekker om en NAV ansatt har tilgang til spesifik NAVenhet
*/
data class NavAnsattTilgangTilNavEnhetPolicyInput(
    val navAnsattAzureId: UUID,
    val navEnhetId: String
) : PolicyInput()

/* 
 Sjekker om en NAV ansatt kan behandle **strengt** fortrolig brukere (kode 6)
*/
data class NavAnsattBehandleStrengtFortroligBrukerePolicyInput(
    val navAnsattAzureId: UUID
) : PolicyInput()

/* 
 Sjekker om en NAV ansatt kan behandle **strengt** fortrolig brukere (kode 6).
 Tar nav ident som input
*/
data class NavAnsattNavIdentBehandleStrengtFortroligBrukerePolicyInput(
    val navIdent: String,
) : PolicyInput()

/* 
 Sjekker om en NAV ansatt kan behandle fortrolig brukere (kode 7)
*/
data class NavAnsattBehandleFortroligBrukerePolicyInput(
    val navAnsattAzureId: UUID
) : PolicyInput()

/* 
 Sjekker om en NAV ansatt kan behandle fortrolig brukere (kode 7)
 Tar navident som input
*/
data class NavAnsattNavIdentBehandleFortroligBrukerePolicyInput(
    val navIdent: String,
) : PolicyInput()

/* 
 Sjekker om en NAV ansatt kan behandle skjermede personer (egne ansatte)
*/
data class NavAnsattBehandleSkjermedePersonerPolicyInput(
    val navAnsattAzureId: UUID
) : PolicyInput()

/* 
 Sjekker om en NAV ansatt kan behandle skjermede personer (egne ansatte).
 Tar navident som input
*/
data class NavAnsattNavIdentBehandleSkjermedePersonerPolicyInput(
    val navIdent: String,
) : PolicyInput()

/* 
 Sjekker om en NAV ansatt har tilgang til NAV enhet med sperre. Brukes i forbindelse med KVP.
*/
data class NavAnsattTilgangTilNavEnhetMedSperrePolicyInput(
    val navAnsattAzureId: UUID,
    val navEnhetId: String
) : PolicyInput()

/*
Sjekker om Nav ansatt har Modia Admin rolle
 */
data class NavAnsattTilgangTilModiaAdminPolicyInput(
    val navAnsattAzureId: UUID
) : PolicyInput()

/*
Sjekker om en ekstern bruker har tilgang til en annen ekstern bruker.
Foreløpig sjekker denne kun om identene er like. Implementasjonen har ikke støtte for å sjekke historiske fnr mot gjeldende fnr.
Den har heller ikke støtte for representasjon av en bruker.
 */
data class EksternBrukerTilgangTilEksternBrukerPolicyInput(
    val rekvirentNorskIdent: String, // Den som ber om tilgang
    val ressursNorskIdent: String // Den som bes tilgang om
) : PolicyInput()

/*
Sjekker om en Nav-ansatt har tilgang til en enhet
 */
data class NavAnsattNavIdentTilgangTilNavEnhetPolicyInput(
    val navIdent: String,
    val navEnhetId: String
) : PolicyInput()

Testing

For å legge tilrette for enkel testing av poao-tilgang så er det laget en mockClient og wiremock oppsett.
Disse ligger i modulene poao-tilgang-test-wiremock og poao-tilgang-test-mockClient.
Eksempel på bruk finnes i testene.

Prosjektstruktur

Poao-tilgang er delt opp i flere moduler for å gjøre det enklere å vedlikeholde en tydelig arkitektur.

Modulene er som følger:

  • api - felles DTOer som brukes av client-modulen og application-modulen
  • application - kjører opp applikasjonen, definerer endepunkter, etc. Tar i bruk core-modulen for å eksponere tilgangskontrollregler med et REST API
  • client - brukes ikke direkte av poao-tilgang, men av andre konsumerende applikasjoner som ønsker en ferdig testet klient for å gjøre requests mot poao-tilgang
  • core - inneholder implementasjon og definisjon av alle de ulike tilgangskontrollreglene til poao-tilgang

Poao-tilgang spesielle privilegier

Poao-tilgang sin azure app-registrering har spesielle privilegier i form av API permissions mot Microsoft Graph. Dersom det er behov for å endre disse så må det gjøres i Azure portalen.

API/Permission name Beskrivelse
GroupMember.Read.All Les medlemskap i alle grupper
Group.Read.All Les grupper
openid Sign in and read user profile
User.Read Les brukerprofiler
User.Read.All Les brukerprofiler i organisasjonen