Skip to content

Commit

Permalink
Separere sikkerhet, ta i bruk Kontekst (#1245)
Browse files Browse the repository at this point in the history
* Separere sikkerhet, ta i bruk Kontekst

* Flere forbedringer

* Et par ting relatert til zero trust
  • Loading branch information
jolarsen authored Feb 20, 2023
1 parent fde1102 commit 8a632d4
Show file tree
Hide file tree
Showing 76 changed files with 883 additions and 512 deletions.
30 changes: 30 additions & 0 deletions felles/abac-kontekst/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>felles</artifactId>
<groupId>no.nav.foreldrepenger.felles</groupId>
<version>0.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>felles-abac-kontekst</artifactId>
<name>Felles :: ABAC</name>

<dependencies>
<dependency>
<groupId>no.nav.foreldrepenger.felles</groupId>
<artifactId>felles-kontekst</artifactId>
</dependency>
<dependency>
<groupId>no.nav.foreldrepenger.felles</groupId>
<artifactId>felles-oidc</artifactId>
</dependency>
<dependency>
<groupId>no.nav.foreldrepenger.felles</groupId>
<artifactId>felles-abac</artifactId>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package no.nav.foreldrepenger.sikkerhet.abac;

import javax.enterprise.context.Dependent;

import no.nav.vedtak.sikkerhet.abac.TokenProvider;
import no.nav.vedtak.sikkerhet.kontekst.DefaultRequestKontekstProvider;
import no.nav.vedtak.sikkerhet.kontekst.IdentType;
import no.nav.vedtak.sikkerhet.kontekst.RequestKontekst;
import no.nav.vedtak.sikkerhet.kontekst.RequestKontekstProvider;
import no.nav.vedtak.sikkerhet.kontekst.WsRequestKontekst;
import no.nav.vedtak.sikkerhet.oidc.token.OpenIDToken;

@Dependent
public class KontekstTokenProvider implements TokenProvider {

private static final RequestKontekstProvider PROVIDER = new DefaultRequestKontekstProvider();

@Override
public String getUid() {
return PROVIDER.getKontekst().getUid();
}

@Override
public IdentType getIdentType() {
return PROVIDER.getKontekst().getIdentType();
}

@Override
public OpenIDToken openIdToken() {
var kontekst = PROVIDER.getKontekst();
return kontekst instanceof RequestKontekst rk ? rk.getToken() : null;
}

@Override
public String samlToken() {
var kontekst = PROVIDER.getKontekst();
return kontekst instanceof WsRequestKontekst wrk ? wrk.getSamlTokenAsString() : null;
}
}
6 changes: 6 additions & 0 deletions felles/abac-kontekst/src/main/resources/META-INF/beans.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
version="2.0"
bean-discovery-mode="annotated">
</beans>
4 changes: 2 additions & 2 deletions felles/abac-legacy/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@

<dependencies>
<dependency>
<groupId>no.nav.foreldrepenger.felles</groupId>
<artifactId>felles-oidc</artifactId>
<groupId>no.nav.foreldrepenger.felles.sikkerhet</groupId>
<artifactId>felles-sikkerhet</artifactId>
</dependency>
<dependency>
<groupId>no.nav.foreldrepenger.felles</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import no.nav.vedtak.sikkerhet.abac.TokenProvider;
import no.nav.vedtak.sikkerhet.context.SubjectHandler;
import no.nav.vedtak.sikkerhet.context.containers.SluttBruker;
import no.nav.vedtak.sikkerhet.kontekst.IdentType;
import no.nav.vedtak.sikkerhet.oidc.token.OpenIDToken;

@Dependent
Expand All @@ -16,8 +16,8 @@ public String getUid() {
}

@Override
public SluttBruker getSluttBruker() {
return SubjectHandler.getSubjectHandler().getSluttBruker();
public IdentType getIdentType() {
return SubjectHandler.getSubjectHandler().getIdentType();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ private BeskyttetRessursAttributter hentBeskyttetRessursAttributter(InvocationCo

var token = ServiceType.WEBSERVICE.equals(serviceType)
? Token.withSamlToken(tokenProvider.samlToken())
: Token.withOidcToken(tokenProvider.openIdToken(), tokenProvider.getSluttBruker());
: Token.withOidcToken(tokenProvider.openIdToken(), tokenProvider.getUid(), tokenProvider.getIdentType());

return BeskyttetRessursAttributter.builder()
.medUserId(tokenProvider.getUid())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import static no.nav.vedtak.sikkerhet.abac.AbacResultat.AVSLÅTT_ANNEN_ÅRSAK;
import static no.nav.vedtak.sikkerhet.abac.AbacResultat.GODKJENT;

import java.util.Optional;
import java.util.Set;

import javax.enterprise.context.ApplicationScoped;
Expand All @@ -16,8 +15,8 @@
import no.nav.vedtak.sikkerhet.abac.internal.BeskyttetRessursAttributter;
import no.nav.vedtak.sikkerhet.abac.pdp.AppRessursData;
import no.nav.vedtak.sikkerhet.abac.policy.ForeldrepengerAttributter;
import no.nav.vedtak.sikkerhet.context.containers.SluttBruker;
import no.nav.vedtak.sikkerhet.kontekst.IdentType;
import no.nav.vedtak.sikkerhet.oidc.config.AzureProperty;
import no.nav.vedtak.sikkerhet.oidc.config.OpenIDProvider;

@Default
Expand All @@ -39,14 +38,12 @@ public PepImpl() {

@Inject
public PepImpl(PdpKlient pdpKlient, TokenProvider tokenProvider, PdpRequestBuilder pdpRequestBuilder,
@KonfigVerdi(value = "pip.users", required = false) String pipUsers,
@KonfigVerdi(value = "AZURE_APP_PRE_AUTHORIZED_APPS", required = false) String preAuthorized
) {
@KonfigVerdi(value = "pip.users", required = false) String pipUsers) {
this.pdpKlient = pdpKlient;
this.builder = pdpRequestBuilder;
this.tokenProvider = tokenProvider;
this.pipUsers = konfigurePipUsers(pipUsers);
this.preAuthorized = preAuthorized; // eg json array av objekt("name", "clientId")
this.preAuthorized = ENV.getProperty(AzureProperty.AZURE_APP_PRE_AUTHORIZED_APPS.name()); // eg json array av objekt("name", "clientId")
this.residentClusterNamespace = ENV.clusterName() + ":" + ENV.namespace();
}

Expand Down Expand Up @@ -74,14 +71,14 @@ public Tilgangsbeslutning vurderTilgang(BeskyttetRessursAttributter beskyttetRes
// Token kan utvides med roles og groups - men oppsettet er langt fra det som er kjent fra STS mv.
// Kan legge inn filter på claims/roles intern og/eller ekstern.
private boolean skalForetaLokalTilgangsbeslutning(BeskyttetRessursAttributter attributter) {
var identType = Optional.ofNullable(attributter.getToken().getSluttBruker()).map(SluttBruker::getIdentType).orElse(null);
var consumer = Optional.ofNullable(attributter.getToken().getSluttBruker()).map(SluttBruker::getName).orElse(null);
var identType = attributter.getToken().getIdentType();
var consumer = attributter.getToken().getBrukerId();
return OpenIDProvider.AZUREAD.equals(attributter.getToken().getOpenIDProvider())
&& IdentType.Systemressurs.equals(identType) && consumer != null && preAuthorized != null;
}

private boolean harTilgang(BeskyttetRessursAttributter attributter) {
var consumer = Optional.ofNullable(attributter.getToken().getSluttBruker()).map(SluttBruker::getName).orElse(null);
var consumer = attributter.getToken().getBrukerId();
if (consumer == null || !preAuthorized.contains(consumer)) {
return false;
}
Expand Down
26 changes: 16 additions & 10 deletions felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Token.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import org.jose4j.jwt.consumer.JwtConsumerBuilder;

import no.nav.vedtak.exception.TekniskException;
import no.nav.vedtak.sikkerhet.context.containers.SluttBruker;
import no.nav.vedtak.sikkerhet.kontekst.IdentType;
import no.nav.vedtak.sikkerhet.oidc.config.OpenIDProvider;
import no.nav.vedtak.sikkerhet.oidc.token.OpenIDToken;

Expand All @@ -31,25 +31,27 @@ public enum TokenType {
private final String token;
private final TokenType tokenType;
private final OpenIDToken openIDToken;
private final SluttBruker sluttBruker;
private final String brukerId;
private final IdentType identType;

private Token(String token, TokenType tokenType, OpenIDToken openIDToken, SluttBruker sluttBruker) {
private Token(String token, TokenType tokenType, OpenIDToken openIDToken, String brukerId, IdentType identType) {
this.token = token;
this.tokenType = tokenType;
this.openIDToken = openIDToken;
this.sluttBruker = sluttBruker;
this.brukerId = brukerId;
this.identType = identType;
}

public static Token withOidcToken(OpenIDToken token) {
return new Token(null, utledTokenType(token), token, null);
return new Token(null, utledTokenType(token), token, null, null);
}

public static Token withOidcToken(OpenIDToken token, SluttBruker sluttBruker) {
return new Token(null, utledTokenType(token), token, sluttBruker);
public static Token withOidcToken(OpenIDToken token, String brukerId, IdentType identType) {
return new Token(null, utledTokenType(token), token, brukerId, identType);
}

public static Token withSamlToken(String token) {
return new Token(token, TokenType.SAML, null, null);
return new Token(token, TokenType.SAML, null, null, null);
}

public TokenType getTokenType() {
Expand All @@ -60,8 +62,12 @@ public OpenIDProvider getOpenIDProvider() {
return Optional.ofNullable(openIDToken).map(OpenIDToken::provider).orElse(null);
}

public SluttBruker getSluttBruker() {
return sluttBruker;
public String getBrukerId() {
return brukerId;
}

public IdentType getIdentType() {
return identType;
}

private static TokenType utledTokenType(OpenIDToken token) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package no.nav.vedtak.sikkerhet.abac;

import no.nav.vedtak.sikkerhet.context.containers.SluttBruker;
import no.nav.vedtak.sikkerhet.kontekst.IdentType;
import no.nav.vedtak.sikkerhet.oidc.token.OpenIDToken;

/**
Expand All @@ -17,7 +17,7 @@ public interface TokenProvider {
/**
* Kategori bruker utledet i tokenvalidering
*/
SluttBruker getSluttBruker();
IdentType getIdentType();

/**
* OIDC tokenet til brukeren. Helst fra følgende providere: TokenX, AzureAD, STS.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@
@ApplicationScoped
public class PdpConsumerImpl implements PdpConsumer {

private static final String DEFAULT_ABAC_URL = "http://abac-foreldrepenger.teamabac/application/authorize";
private static final String PDP_ENDPOINT_URL_KEY = "abac.pdp.endpoint.url";
private static final String MEDIA_TYPE = "application/xacml+json";
private static final Logger LOG = LoggerFactory.getLogger(PdpConsumerImpl.class);

Expand All @@ -46,7 +44,7 @@ public class PdpConsumerImpl implements PdpConsumer {
} // CDI

@Inject
public PdpConsumerImpl(@KonfigVerdi(value = PDP_ENDPOINT_URL_KEY, defaultVerdi = DEFAULT_ABAC_URL) String pdpUrl) {
public PdpConsumerImpl(@KonfigVerdi(value = "abac.pdp.endpoint.url", defaultVerdi = "http://abac-foreldrepenger.teamabac/application/authorize") String pdpUrl) {
this.pdpUrl = URI.create(pdpUrl);
this.basicCredentials = basicCredentials(Systembruker.username(), Systembruker.password());
// TODO - vurder om bør settes static final?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import static org.mockito.Mockito.when;
import static org.mockito.internal.verification.VerificationModeFactory.times;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
Expand All @@ -23,8 +25,8 @@
import no.nav.vedtak.sikkerhet.abac.internal.BeskyttetRessursInterceptorTest;
import no.nav.vedtak.sikkerhet.abac.pdp.AppRessursData;
import no.nav.vedtak.sikkerhet.abac.policy.ForeldrepengerAttributter;
import no.nav.vedtak.sikkerhet.context.containers.SluttBruker;
import no.nav.vedtak.sikkerhet.kontekst.IdentType;
import no.nav.vedtak.sikkerhet.oidc.config.AzureProperty;
import no.nav.vedtak.sikkerhet.oidc.config.OpenIDProvider;
import no.nav.vedtak.sikkerhet.oidc.token.OpenIDToken;
import no.nav.vedtak.sikkerhet.oidc.token.TokenString;
Expand All @@ -42,13 +44,22 @@ class PepImplTest {
@Mock
private PdpRequestBuilder pdpRequestBuilder;

@BeforeAll
static void initEnv() {
System.setProperty(AzureProperty.AZURE_APP_PRE_AUTHORIZED_APPS.name(), LOCAL_APP + ", local:annetnamespace:eksternapplication");
}

@AfterAll
static void avsluttEnv() {
System.clearProperty(AzureProperty.AZURE_APP_PRE_AUTHORIZED_APPS.name());
}

@BeforeEach
void setUp() {
pep = new PepImpl(pdpKlientMock,
tokenProvider,
pdpRequestBuilder,
"SRVFPLOS,SRVPDP",
LOCAL_APP + ", local:annetnamespace:eksternapplication");
"SRVFPLOS,SRVPDP");
}

@Test
Expand Down Expand Up @@ -78,9 +89,8 @@ void skal_nekte_tilgang_til_saksbehandler_for_piptjeneste() {
@Test
void skal_gi_tilgang_for_intern_azure_cc() {
var token = new OpenIDToken(OpenIDProvider.AZUREAD, new TokenString("token"));
var sluttbruker = new SluttBruker(LOCAL_APP, IdentType.Systemressurs);
when(tokenProvider.getUid()).thenReturn(LOCAL_APP);
var attributter = lagBeskyttetRessursAttributterAzure(AvailabilityType.INTERNAL, token, sluttbruker);
var attributter = lagBeskyttetRessursAttributterAzure(AvailabilityType.INTERNAL, token, LOCAL_APP, IdentType.Systemressurs);

when(pdpRequestBuilder.lagAppRessursData(any())).thenReturn(AppRessursData.builder().build());

Expand All @@ -92,9 +102,8 @@ void skal_gi_tilgang_for_intern_azure_cc() {
@Test
void skal_gi_avslag_for_ekstern_azure_cc() {
var token = new OpenIDToken(OpenIDProvider.AZUREAD, new TokenString("token"));
var sluttbruker = new SluttBruker("local:annetnamespace:ukjentapplication", IdentType.Systemressurs);
when(tokenProvider.getUid()).thenReturn("local:annetnamespace:ukjentapplication");
var attributter = lagBeskyttetRessursAttributterAzure(AvailabilityType.INTERNAL, token, sluttbruker);
var attributter = lagBeskyttetRessursAttributterAzure(AvailabilityType.INTERNAL, token, "local:annetnamespace:ukjentapplication", IdentType.Systemressurs);

when(pdpRequestBuilder.lagAppRessursData(any())).thenReturn(AppRessursData.builder().build());

Expand All @@ -106,9 +115,8 @@ void skal_gi_avslag_for_ekstern_azure_cc() {
@Test
void skal_gi_tilgang_for_godkjent_ekstern_azure_cc() {
var token = new OpenIDToken(OpenIDProvider.AZUREAD, new TokenString("token"));
var sluttbruker = new SluttBruker("local:annetnamespace:eksternapplication", IdentType.Systemressurs);
when(tokenProvider.getUid()).thenReturn("local:annetnamespace:eksternapplication");
var attributter = lagBeskyttetRessursAttributterAzure(AvailabilityType.ALL, token, sluttbruker);
var attributter = lagBeskyttetRessursAttributterAzure(AvailabilityType.ALL, token, "local:annetnamespace:eksternapplication", IdentType.Systemressurs);

when(pdpRequestBuilder.lagAppRessursData(any())).thenReturn(AppRessursData.builder().build());

Expand All @@ -120,9 +128,8 @@ void skal_gi_tilgang_for_godkjent_ekstern_azure_cc() {
@Test
void skal_sjekke_mot_abac_hvis_sts_systembruker() {
var token = new OpenIDToken(OpenIDProvider.STS, new TokenString("token"));
var sluttbruker = new SluttBruker("srvTestbruker", IdentType.Systemressurs);
when(tokenProvider.getUid()).thenReturn("srvTestbruker");
var attributter = lagBeskyttetRessursAttributterAzure(AvailabilityType.ALL, token, sluttbruker);
var attributter = lagBeskyttetRessursAttributterAzure(AvailabilityType.ALL, token, "srvTestbruker", IdentType.Systemressurs);

when(pdpRequestBuilder.abacDomene()).thenReturn("domene");
when(pdpRequestBuilder.lagAppRessursData(any())).thenReturn(AppRessursData.builder().build());
Expand Down Expand Up @@ -170,10 +177,10 @@ private BeskyttetRessursAttributter lagBeskyttetRessursAttributterPip() {
.build();
}

private BeskyttetRessursAttributter lagBeskyttetRessursAttributterAzure(AvailabilityType availabilityType, OpenIDToken token, SluttBruker sluttBruker) {
private BeskyttetRessursAttributter lagBeskyttetRessursAttributterAzure(AvailabilityType availabilityType, OpenIDToken token, String brukerId, IdentType identType) {
return BeskyttetRessursAttributter.builder()
.medUserId(tokenProvider.getUid())
.medToken(Token.withOidcToken(token, sluttBruker))
.medToken(Token.withOidcToken(token, brukerId,identType))
.medResourceType(ForeldrepengerAttributter.RESOURCE_TYPE_FP_FAGSAK)
.medActionType(ActionType.READ)
.medAvailabilityType(availabilityType)
Expand Down
Loading

0 comments on commit 8a632d4

Please sign in to comment.