Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TFP-5845: Dropper støtten for STS ved tilgangstryring på informasjonspunkter #1382

Merged
merged 8 commits into from
Oct 18, 2024
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;
}

}
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);
jolarsen marked this conversation as resolved.
Show resolved Hide resolved
} 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