Skip to content

Commit

Permalink
TFP-5845: Dropper støtten for STS ved tilgangstryring på informasjons…
Browse files Browse the repository at this point in the history
…punkter (#1382)

* TFP-5845: Dropper støtten for STS ved tilgangstryring på informasjonspunkter.

* Forenkler lokal tilgang vurdering enda mer.

* Bedre håndtering av PIP tilgang

---------

Co-authored-by: Jens-Otto Larsen <[email protected]>
  • Loading branch information
mrsladek and jolarsen authored Oct 18, 2024
1 parent 2fbe6f7 commit 535eadb
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,4 @@ default String abacDomene() {
}

AppRessursData lagAppRessursData(AbacDataAttributter dataAttributter);

default boolean internAzureConsumer(String azpName) {
return false;
}

}
72 changes: 27 additions & 45 deletions felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/PepImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,12 @@
import static no.nav.vedtak.sikkerhet.abac.AbacResultat.AVSLÅTT_ANNEN_ÅRSAK;
import static no.nav.vedtak.sikkerhet.abac.AbacResultat.GODKJENT;

import java.util.Set;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Default;
import jakarta.inject.Inject;

import no.nav.foreldrepenger.konfig.Cluster;
import no.nav.foreldrepenger.konfig.Environment;
import no.nav.foreldrepenger.konfig.KonfigVerdi;
import no.nav.vedtak.sikkerhet.abac.beskyttet.AvailabilityType;
import no.nav.vedtak.sikkerhet.abac.internal.BeskyttetRessursAttributter;
import no.nav.vedtak.sikkerhet.abac.pdp.AppRessursData;
Expand All @@ -29,69 +26,65 @@ public class PepImpl implements Pep {
private PdpKlient pdpKlient;
private PdpRequestBuilder builder;

private Set<String> pipUsers;
private TokenProvider tokenProvider;
private String preAuthorized;
private Cluster residentCluster;
private String residentNamespace;

public PepImpl() {
PepImpl() {
// CDI proxy
}

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

protected Set<String> konfigurePipUsers(String pipUsers) {
if (pipUsers != null) {
return Set.of(pipUsers.toLowerCase().split(","));
}
return Set.of();
}

@Override
public Tilgangsbeslutning vurderTilgang(BeskyttetRessursAttributter beskyttetRessursAttributter) {
var appRessurser = builder.lagAppRessursData(beskyttetRessursAttributter.getDataAttributter());

if (PIP.equals(beskyttetRessursAttributter.getResourceType())) {
return vurderTilgangTilPipTjeneste(beskyttetRessursAttributter, appRessurser);
}
if (kanForetaLokalTilgangsbeslutning(beskyttetRessursAttributter)) {
return new Tilgangsbeslutning(harTilgang(beskyttetRessursAttributter) ? GODKJENT : AVSLÅTT_ANNEN_ÅRSAK, beskyttetRessursAttributter, appRessurser);
if (kanForetaLokalTilgangsbeslutning(beskyttetRessursAttributter.getToken())) {
return vurderLokalTilgang(beskyttetRessursAttributter, appRessurser);
} else if (PIP.equals(beskyttetRessursAttributter.getResourceType())) { // pip tilgang bør vurderes kun lokalt
return new Tilgangsbeslutning(AVSLÅTT_ANNEN_ÅRSAK, beskyttetRessursAttributter, appRessurser);
}

return pdpKlient.forespørTilgang(beskyttetRessursAttributter, builder.abacDomene(), appRessurser);
}

protected Tilgangsbeslutning vurderLokalTilgang(BeskyttetRessursAttributter beskyttetRessursAttributter, AppRessursData appRessursData) {
var token = beskyttetRessursAttributter.getToken();
var harTilgang = harTilgang(token.getBrukerId(), beskyttetRessursAttributter.getAvailabilityType());
return new Tilgangsbeslutning(harTilgang ? GODKJENT : AVSLÅTT_ANNEN_ÅRSAK, beskyttetRessursAttributter, appRessursData);
}

// AzureAD CC kommer med sub som ikke ikke en bruker med vanlige AD-grupper og roller
// 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 kanForetaLokalTilgangsbeslutning(BeskyttetRessursAttributter attributter) {
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 kanForetaLokalTilgangsbeslutning(Token token) {
var identType = token.getIdentType();
var consumer = token.getBrukerId();

return OpenIDProvider.AZUREAD.equals(token.getOpenIDProvider()) &&
IdentType.Systemressurs.equals(identType) &&
consumer != null &&
preAuthorized != null;
}

private boolean harTilgang(BeskyttetRessursAttributter attributter) {
var consumer = attributter.getToken().getBrukerId();
if (consumer == null || !preAuthorized.contains(consumer)) {
private boolean harTilgang(String consumerId, AvailabilityType availabilityType) {
if (consumerId == null || !preAuthorized.contains(consumerId)) {
return false;
}

if (erISammeKlusterKlasseOgNamespace(consumer) || builder.internAzureConsumer(consumer)) {
if (erISammeKlusterKlasseOgNamespace(consumerId)) {
return true;
}
return AvailabilityType.ALL.equals(attributter.getAvailabilityType());

return AvailabilityType.ALL.equals(availabilityType);
}

private boolean erISammeKlusterKlasseOgNamespace(String consumer) {
Expand All @@ -105,15 +98,4 @@ private boolean erISammeKlusterKlasseOgNamespace(String consumer) {
return residentCluster.isSameClass(Cluster.of(consumerCluster)) && residentNamespace.equals(consumerNamespace);
}

protected Tilgangsbeslutning vurderTilgangTilPipTjeneste(BeskyttetRessursAttributter beskyttetRessursAttributter, AppRessursData appRessursData) {
String uid = tokenProvider.getUid();
if (pipUsers.contains(uid.toLowerCase())) {
return new Tilgangsbeslutning(GODKJENT, beskyttetRessursAttributter, appRessursData);
} else if (kanForetaLokalTilgangsbeslutning(beskyttetRessursAttributter) && harTilgang(beskyttetRessursAttributter)) {
return new Tilgangsbeslutning(GODKJENT, beskyttetRessursAttributter, appRessursData);
} else {
return new Tilgangsbeslutning(AVSLÅTT_ANNEN_ÅRSAK, beskyttetRessursAttributter, appRessursData);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import no.nav.vedtak.sikkerhet.abac.internal.BeskyttetRessursAttributter;
import no.nav.vedtak.sikkerhet.abac.pdp.AppRessursData;

public record Tilgangsbeslutning(AbacResultat beslutningKode, BeskyttetRessursAttributter beskyttetRessursAttributter,
public record Tilgangsbeslutning(AbacResultat beslutningKode,
BeskyttetRessursAttributter beskyttetRessursAttributter,
AppRessursData appRessursData) {

public boolean fikkTilgang() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,18 +55,18 @@ static void avsluttEnv() {

@BeforeEach
void setUp() {
pep = new PepImpl(pdpKlientMock, tokenProvider, pdpRequestBuilder, "SRVFPLOS,SRVPDP");
pep = new PepImpl(pdpKlientMock, pdpRequestBuilder);
}

@Test
void skal_gi_tilgang_til_srvpdp_for_piptjeneste() {
void skal_ikke_gi_tilgang_til_srvpdp_for_piptjeneste_siden_sts_brukere_ikke_stottes_lenger() {
when(tokenProvider.getUid()).thenReturn("srvpdp");
var attributter = lagBeskyttetRessursAttributterPip();

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

Tilgangsbeslutning permit = pep.vurderTilgang(attributter);
assertThat(permit.fikkTilgang()).isTrue();
assertThat(permit.fikkTilgang()).isFalse();
verifyNoInteractions(pdpKlientMock);
}

Expand Down

0 comments on commit 535eadb

Please sign in to comment.