From 5a0bb6eba3a0d077688661e796c84d8a52c0583b Mon Sep 17 00:00:00 2001 From: Jens-Otto Larsen <46576810+jolarsen@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:13:47 +0200 Subject: [PATCH] =?UTF-8?q?Sanere=20st=C3=B8tte=20for=20innkommende=20STS?= =?UTF-8?q?=20(#1387)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Sanere støtte for innkommende STS * Feedback og mer rydding * Fjerne all bruk av Systembruker utenom ABAC * Litt mer rydding --------- Co-authored-by: Michal J. Sladek --- felles/README.md | 2 +- .../abac/BeskyttetRessursInterceptor.java | 13 +-- .../no/nav/vedtak/sikkerhet/abac/PepImpl.java | 2 +- .../no/nav/vedtak/sikkerhet/abac/Token.java | 2 +- .../vedtak/sikkerhet/abac/TokenProvider.java | 2 +- .../vedtak/sikkerhet/abac/PepImplTest.java | 14 --- .../BeskyttetRessursInterceptorTest.java | 53 ++++++----- .../sikkerhet/pdp/PdpKlientImplTest.java | 2 +- .../jaxrs/AuthenticationFilterDelegate.java | 13 +-- .../nav/vedtak/sikkerhet/jaxrs/TillatSTS.java | 19 ---- .../AuthenticationFilterDelegateTest.java | 6 +- .../sikkerhet/kontekst/BasisKontekst.java | 15 +--- .../vedtak/sikkerhet/kontekst/IdentType.java | 26 ------ .../kontekst/KontekstHolderTest.java | 6 +- .../sikkerhet/oidc/config/OpenIDProvider.java | 1 - .../oidc/config/impl/OidcProviderConfig.java | 23 ----- .../impl/WellKnownConfigurationHelper.java | 90 ------------------- .../impl/WellKnownOpenIdConfiguration.java | 7 -- .../sikkerhet/oidc/token/TokenProvider.java | 1 - .../oidc/validator/OidcTokenValidator.java | 14 ++- .../AbstractSkjermetPersonOnPremKlient.java | 75 ---------------- 21 files changed, 61 insertions(+), 325 deletions(-) delete mode 100644 felles/auth-filter/src/main/java/no/nav/vedtak/sikkerhet/jaxrs/TillatSTS.java delete mode 100644 felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/impl/WellKnownConfigurationHelper.java delete mode 100644 felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/impl/WellKnownOpenIdConfiguration.java delete mode 100644 integrasjon/arbeidsfordeling-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjerming/AbstractSkjermetPersonOnPremKlient.java diff --git a/felles/README.md b/felles/README.md index 74f7b9d8a..e7ca23539 100644 --- a/felles/README.md +++ b/felles/README.md @@ -5,7 +5,7 @@ Felles biblioteker, som dekker # Feilhåndtering standard for exceptions, logfeilmeldinger, feilmelding koder # Sikkerhet - OIDC Autentisering, Azure + STS - Security Token Service for veksling av tokens, ABAC (PEP/PDP) + OIDC Autentisering, Azure + TokenX tokens, ABAC (PEP/PDP) # Database oppsett/tillegg * Støtter JPA ORM XML konfigurasjon i flere filer (auto-discovery). Gjør det mulig å dele opp datamodellen i ulike moduler. * Støtter for tilgang til flere skjemaer gjennom samme datasource (uten å hardkode schema navn i hibernate). Gjør det mulig å dele opp database i flere skjemaer diff --git a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/BeskyttetRessursInterceptor.java b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/BeskyttetRessursInterceptor.java index b38695779..2365a2b5f 100644 --- a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/BeskyttetRessursInterceptor.java +++ b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/BeskyttetRessursInterceptor.java @@ -5,16 +5,17 @@ import java.util.Collection; import java.util.Optional; -import org.jboss.weld.interceptor.util.proxy.TargetInstanceProxy; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import jakarta.annotation.Priority; import jakarta.enterprise.context.Dependent; import jakarta.inject.Inject; import jakarta.interceptor.AroundInvoke; import jakarta.interceptor.Interceptor; import jakarta.interceptor.InvocationContext; + +import org.jboss.weld.interceptor.util.proxy.TargetInstanceProxy; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import no.nav.foreldrepenger.konfig.Environment; import no.nav.vedtak.exception.TekniskException; import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType; @@ -84,8 +85,8 @@ private boolean erSystembrukerKall(BeskyttetRessursAttributter beskyttetRessursA return Optional.ofNullable(beskyttetRessursAttributter) .map(BeskyttetRessursAttributter::getToken) .map(Token::getIdentType) - .orElse(IdentType.InternBruker) - .erSystem(); + .filter(IdentType::erSystem) + .isPresent(); } private BeskyttetRessursAttributter hentBeskyttetRessursAttributter(InvocationContext invocationContext, AbacDataAttributter dataAttributter) { diff --git a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/PepImpl.java b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/PepImpl.java index 2b1e63601..8c07f3a35 100644 --- a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/PepImpl.java +++ b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/PepImpl.java @@ -63,7 +63,7 @@ protected Tilgangsbeslutning vurderLokalTilgang(BeskyttetRessursAttributter besk } // 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. + // Token kan utvides med roles og groups // Kan legge inn filter på claims/roles intern og/eller ekstern. private boolean kanForetaLokalTilgangsbeslutning(Token token) { var identType = token.getIdentType(); diff --git a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Token.java b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Token.java index 8635f47dd..e8ab44a70 100644 --- a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Token.java +++ b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Token.java @@ -60,7 +60,7 @@ public IdentType getIdentType() { private static TokenType utledTokenType(OpenIDToken token) { return switch (token.provider()) { - case STS, AZUREAD -> TokenType.OIDC; + case AZUREAD -> TokenType.OIDC; case TOKENX -> TokenType.TOKENX; }; } diff --git a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/TokenProvider.java b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/TokenProvider.java index cd70e6375..bd042fefa 100644 --- a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/TokenProvider.java +++ b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/TokenProvider.java @@ -21,7 +21,7 @@ public interface TokenProvider { IdentType getIdentType(); /** - * OIDC tokenet til brukeren. Helst fra følgende providere: TokenX, AzureAD, STS. + * OIDC tokenet til brukeren. Helst fra følgende providere: TokenX, AzureAD. * Sendes til PDP (Policy Decision Point) og gir informasjon til ABAC om subject og auth level. * * @return bruker OIDC token. diff --git a/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/PepImplTest.java b/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/PepImplTest.java index 128b04473..dc86ca2df 100644 --- a/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/PepImplTest.java +++ b/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/PepImplTest.java @@ -7,7 +7,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; 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; @@ -138,19 +137,6 @@ void skal_gi_tilgang_for_godkjent_ekstern_azure_cc() { verifyNoInteractions(pdpKlientMock); } - @Test - void skal_sjekke_mot_abac_hvis_sts_systembruker() { - var token = new OpenIDToken(OpenIDProvider.STS, new TokenString("token")); - when(tokenProvider.getUid()).thenReturn("srvTestbruker"); - var attributter = lagBeskyttetRessursAttributterAzure(AvailabilityType.ALL, token, "srvTestbruker", IdentType.Systemressurs); - - when(pdpRequestBuilder.abacDomene()).thenReturn("domene"); - when(pdpRequestBuilder.lagAppRessursData(any())).thenReturn(AppRessursData.builder().build()); - - pep.vurderTilgang(attributter); - verify(pdpKlientMock, times(1)).forespørTilgang(eq(attributter), eq("domene"), any()); - } - @Test void skal_kalle_pdp_for_annet_enn_pip_tjenester() { when(tokenProvider.getUid()).thenReturn("z142443"); diff --git a/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/internal/BeskyttetRessursInterceptorTest.java b/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/internal/BeskyttetRessursInterceptorTest.java index 679b1f5ca..412d6bbe4 100644 --- a/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/internal/BeskyttetRessursInterceptorTest.java +++ b/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/internal/BeskyttetRessursInterceptorTest.java @@ -1,14 +1,19 @@ package no.nav.vedtak.sikkerhet.abac.internal; -import no.nav.vedtak.exception.ManglerTilgangException; -import no.nav.vedtak.log.audit.Auditdata; -import no.nav.vedtak.log.audit.Auditlogger; -import no.nav.vedtak.sikkerhet.abac.*; -import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType; -import no.nav.vedtak.sikkerhet.abac.pdp.AppRessursData; -import no.nav.vedtak.sikkerhet.oidc.config.OpenIDProvider; -import no.nav.vedtak.sikkerhet.oidc.token.OpenIDToken; -import no.nav.vedtak.sikkerhet.oidc.token.TokenString; +import static no.nav.vedtak.sikkerhet.abac.policy.ForeldrepengerAttributter.RESOURCE_TYPE_INTERNAL_PIP; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.regex.Pattern; + +import jakarta.interceptor.InvocationContext; +import jakarta.ws.rs.Path; import org.assertj.core.api.Fail; import org.junit.jupiter.api.Test; @@ -18,17 +23,23 @@ import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import jakarta.interceptor.InvocationContext; -import jakarta.ws.rs.Path; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.util.Map; -import java.util.regex.Pattern; - -import static no.nav.vedtak.sikkerhet.abac.policy.ForeldrepengerAttributter.RESOURCE_TYPE_INTERNAL_PIP; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; +import no.nav.vedtak.exception.ManglerTilgangException; +import no.nav.vedtak.log.audit.Auditdata; +import no.nav.vedtak.log.audit.Auditlogger; +import no.nav.vedtak.sikkerhet.abac.AbacAuditlogger; +import no.nav.vedtak.sikkerhet.abac.AbacDataAttributter; +import no.nav.vedtak.sikkerhet.abac.AbacDto; +import no.nav.vedtak.sikkerhet.abac.AbacResultat; +import no.nav.vedtak.sikkerhet.abac.BeskyttetRessurs; +import no.nav.vedtak.sikkerhet.abac.BeskyttetRessursInterceptor; +import no.nav.vedtak.sikkerhet.abac.StandardAbacAttributtType; +import no.nav.vedtak.sikkerhet.abac.Tilgangsbeslutning; +import no.nav.vedtak.sikkerhet.abac.TokenProvider; +import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType; +import no.nav.vedtak.sikkerhet.abac.pdp.AppRessursData; +import no.nav.vedtak.sikkerhet.oidc.config.OpenIDProvider; +import no.nav.vedtak.sikkerhet.oidc.token.OpenIDToken; +import no.nav.vedtak.sikkerhet.oidc.token.TokenString; @ExtendWith(MockitoExtension.class) public class BeskyttetRessursInterceptorTest { @@ -41,7 +52,7 @@ public class BeskyttetRessursInterceptorTest { private final ArgumentCaptor auditdataCaptor = ArgumentCaptor.forClass(Auditdata.class); - public static final OpenIDToken DUMMY_OPENID_TOKEN = new OpenIDToken(OpenIDProvider.STS, new TokenString(DUMMY_ID_TOKEN)); + public static final OpenIDToken DUMMY_OPENID_TOKEN = new OpenIDToken(OpenIDProvider.AZUREAD, new TokenString(DUMMY_ID_TOKEN)); @Mock private static TokenProvider tokenProvider; diff --git a/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/pdp/PdpKlientImplTest.java b/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/pdp/PdpKlientImplTest.java index 5f53f6b8b..17f88ac3f 100644 --- a/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/pdp/PdpKlientImplTest.java +++ b/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/pdp/PdpKlientImplTest.java @@ -41,7 +41,7 @@ class PdpKlientImplTest { private static final String JWT_TOKENSTRING = "eyAidHlwIjogIkpXVCIsICJraWQiOiAiU0gxSWVSU2sxT1VGSDNzd1orRXVVcTE5VHZRPSIsICJhbGciOiAiUlMyNTYiIH0.eyAiYXRfaGFzaCI6ICIyb2c1RGk5ZW9LeFhOa3VPd0dvVUdBIiwgInN1YiI6ICJzMTQyNDQzIiwgImF1ZGl0VHJhY2tpbmdJZCI6ICI1NTM0ZmQ4ZS03MmE2LTRhMWQtOWU5YS1iZmEzYThhMTljMDUtNjE2NjA2NyIsICJpc3MiOiAiaHR0cHM6Ly9pc3NvLXQuYWRlby5ubzo0NDMvaXNzby9vYXV0aDIiLCAidG9rZW5OYW1lIjogImlkX3Rva2VuIiwgImF1ZCI6ICJPSURDIiwgImNfaGFzaCI6ICJiVWYzcU5CN3dTdi0wVlN0bjhXLURnIiwgIm9yZy5mb3JnZXJvY2sub3BlbmlkY29ubmVjdC5vcHMiOiAiMTdhOGZiMzYtMGI0Ny00YzRkLWE4YWYtZWM4Nzc3Y2MyZmIyIiwgImF6cCI6ICJPSURDIiwgImF1dGhfdGltZSI6IDE0OTgwMzk5MTQsICJyZWFsbSI6ICIvIiwgImV4cCI6IDE0OTgwNDM1MTUsICJ0b2tlblR5cGUiOiAiSldUVG9rZW4iLCAiaWF0IjogMTQ5ODAzOTkxNSB9.S2DKQweQWZIfjaAT2UP9_dxrK5zqpXj8IgtjDLt5PVfLYfZqpWGaX-ckXG0GlztDVBlRK4ylmIYacTmEAUV_bRa_qWKRNxF83SlQRgHDSiE82SGv5WHOGEcAxf2w_d50XsgA2KDBCyv0bFIp9bCiKzP11uWPW0v4uIkyw2xVxMVPMCuiMUtYFh80sMDf9T4FuQcFd0LxoYcSFDEDlwCdRiF3ufw73qtMYBlNIMbTGHx-DZWkZV7CgukmCee79gwQIvGwdLrgaDrHFCJUDCbB1FFEaE3p3_BZbj0T54fCvL69aHyWm1zEd9Pys15yZdSh3oSSr4yVNIxhoF-nQ7gY-g;"; - public static final OpenIDToken JWT_TOKEN = new OpenIDToken(OpenIDProvider.STS, new TokenString(JWT_TOKENSTRING)); + public static final OpenIDToken JWT_TOKEN = new OpenIDToken(OpenIDProvider.AZUREAD, new TokenString(JWT_TOKENSTRING)); public static final OpenIDToken JWT_TOKENX_TOKEN = new OpenIDToken(OpenIDProvider.TOKENX, new TokenString(JWT_TOKENSTRING)); private static final String DOMENE = "foreldrepenger"; diff --git a/felles/auth-filter/src/main/java/no/nav/vedtak/sikkerhet/jaxrs/AuthenticationFilterDelegate.java b/felles/auth-filter/src/main/java/no/nav/vedtak/sikkerhet/jaxrs/AuthenticationFilterDelegate.java index e99132d67..347bc0aad 100644 --- a/felles/auth-filter/src/main/java/no/nav/vedtak/sikkerhet/jaxrs/AuthenticationFilterDelegate.java +++ b/felles/auth-filter/src/main/java/no/nav/vedtak/sikkerhet/jaxrs/AuthenticationFilterDelegate.java @@ -22,7 +22,6 @@ import no.nav.vedtak.sikkerhet.kontekst.KontekstHolder; import no.nav.vedtak.sikkerhet.kontekst.RequestKontekst; import no.nav.vedtak.sikkerhet.oidc.config.ConfigProvider; -import no.nav.vedtak.sikkerhet.oidc.config.OpenIDProvider; import no.nav.vedtak.sikkerhet.oidc.token.OpenIDToken; import no.nav.vedtak.sikkerhet.oidc.token.TokenString; import no.nav.vedtak.sikkerhet.oidc.validator.JwtUtil; @@ -70,7 +69,7 @@ public static void validerSettKontekst(ResourceInfo resourceInfo, ContainerReque LOG.trace("{} er whitelisted", metodenavn); } else { var tokenString = tokenfinder.get().orElseThrow(() -> new ValideringsFeil("Mangler token")); - validerTokenSetKontekst(resourceInfo, tokenString); + validerTokenSetKontekst(tokenString); setUserAndConsumerId(KontekstHolder.getKontekst().getUid()); } } catch (TekniskException | TokenFeil e) { @@ -118,7 +117,7 @@ public static Optional getTokenFromHeader(ContainerRequestContext r .map(TokenString::new); } - public static void validerTokenSetKontekst(ResourceInfo resourceInfo, TokenString tokenString) { + private static void validerTokenSetKontekst(TokenString tokenString) { // Sett opp OpenIDToken var claims = JwtUtil.getClaims(tokenString.token()); var configuration = ConfigProvider.getOpenIDConfiguration(JwtUtil.getIssuer(claims)) @@ -126,14 +125,6 @@ public static void validerTokenSetKontekst(ResourceInfo resourceInfo, TokenStrin var expiresAt = Optional.ofNullable(JwtUtil.getExpirationTime(claims)).orElseGet(() -> Instant.now().plusSeconds(300)); var token = new OpenIDToken(configuration.type(), OpenIDToken.OIDC_DEFAULT_TOKEN_TYPE, tokenString, null, expiresAt.toEpochMilli()); - if (OpenIDProvider.STS.equals(configuration.type())) { - if (getAnnotation(resourceInfo, TillatSTS.class).isEmpty()) { - throw new ValideringsFeil("Kall med STS til endepunkt som ikke eksplisitt tillater STS"); - } else { - LOG.info("Innkommende STS - metode {} har annotering TillatSTS", resourceInfo.getResourceMethod().getName()); - } - } - // Valider var tokenValidator = OidcTokenValidatorConfig.instance().getValidator(token.provider()); var validateResult = tokenValidator.validate(token.primary()); diff --git a/felles/auth-filter/src/main/java/no/nav/vedtak/sikkerhet/jaxrs/TillatSTS.java b/felles/auth-filter/src/main/java/no/nav/vedtak/sikkerhet/jaxrs/TillatSTS.java deleted file mode 100644 index ce18876c1..000000000 --- a/felles/auth-filter/src/main/java/no/nav/vedtak/sikkerhet/jaxrs/TillatSTS.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.nav.vedtak.sikkerhet.jaxrs; - -import jakarta.ws.rs.NameBinding; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/* - * Brukes i en overgangsfase for å annotere noen få endepunkt som skal tillate innkommende kall med STS - */ -@Inherited -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.METHOD, ElementType.TYPE}) -@NameBinding -public @interface TillatSTS { -} diff --git a/felles/auth-filter/src/test/java/no/nav/vedtak/sikkerhet/jaxrs/AuthenticationFilterDelegateTest.java b/felles/auth-filter/src/test/java/no/nav/vedtak/sikkerhet/jaxrs/AuthenticationFilterDelegateTest.java index 7fb3fc7c2..88b36344d 100644 --- a/felles/auth-filter/src/test/java/no/nav/vedtak/sikkerhet/jaxrs/AuthenticationFilterDelegateTest.java +++ b/felles/auth-filter/src/test/java/no/nav/vedtak/sikkerhet/jaxrs/AuthenticationFilterDelegateTest.java @@ -118,7 +118,7 @@ public void teardown() { when(request.getHeaderString("Authorization")).thenReturn(OpenIDToken.OIDC_DEFAULT_TOKEN_TYPE + gyldigToken.token()); when(tokenValidator.validate(gyldigToken)).thenReturn( - OidcTokenValidatorResult.valid("demo", IdentType.utledIdentType("demo"), System.currentTimeMillis() / 1000 + 121)); + OidcTokenValidatorResult.valid("demo", IdentType.InternBruker, System.currentTimeMillis() / 1000 + 121)); AuthenticationFilterDelegate.validerSettKontekst(ri, request); assertThat(KontekstHolder.getKontekst().getContext()).isEqualTo(SikkerhetContext.REQUEST); @@ -135,7 +135,7 @@ public void teardown() { var gyldigToken = getGyldigToken(); when(request.getHeaderString("Authorization")).thenReturn(OpenIDToken.OIDC_DEFAULT_TOKEN_TYPE + gyldigToken.token()); - when(tokenValidator.validate(gyldigToken)).thenReturn(OidcTokenValidatorResult.valid("demo", IdentType.utledIdentType("demo"), + when(tokenValidator.validate(gyldigToken)).thenReturn(OidcTokenValidatorResult.valid("demo", IdentType.InternBruker, System.currentTimeMillis() / 1000 + sekunderGjenståendeGyldigTid)); AuthenticationFilterDelegate.validerSettKontekst(ri, request); @@ -152,7 +152,7 @@ public void teardown() { var gyldigToken = getGyldigToken(); when(request.getHeaderString("Authorization")).thenReturn(OpenIDToken.OIDC_DEFAULT_TOKEN_TYPE + gyldigToken.token()); - when(tokenValidator.validate(gyldigToken)).thenReturn(OidcTokenValidatorResult.valid("demo", IdentType.utledIdentType("demo"), + when(tokenValidator.validate(gyldigToken)).thenReturn(OidcTokenValidatorResult.valid("demo", IdentType.InternBruker, System.currentTimeMillis() / 1000 + sekunderGjenståendeGyldigTid)); AuthenticationFilterDelegate.validerSettKontekst(ri, request); diff --git a/felles/kontekst/src/main/java/no/nav/vedtak/sikkerhet/kontekst/BasisKontekst.java b/felles/kontekst/src/main/java/no/nav/vedtak/sikkerhet/kontekst/BasisKontekst.java index d1b6cfea3..bea9da9cd 100644 --- a/felles/kontekst/src/main/java/no/nav/vedtak/sikkerhet/kontekst/BasisKontekst.java +++ b/felles/kontekst/src/main/java/no/nav/vedtak/sikkerhet/kontekst/BasisKontekst.java @@ -50,12 +50,6 @@ public String getKonsumentId() { return konsumentId; } - // Brukes kun i abakus / dignostikk. Sjekk om kan endres til forProsesstaskUtenSystembruker - @Deprecated(forRemoval = true) // Erstatt med forProsesstaskUtenSystembruker - public static BasisKontekst forProsesstask() { - return new BasisKontekst(SikkerhetContext.SYSTEM, Systembruker.username(), IdentType.Prosess, Systembruker.username()); - } - // Denne brukes i prosesstask public static BasisKontekst forProsesstaskUtenSystembruker() { var username = "srv" + Optional.ofNullable(Environment.current().application()).orElse("local"); @@ -64,15 +58,14 @@ public static BasisKontekst forProsesstaskUtenSystembruker() { } public static BasisKontekst ikkeAutentisertRequest(String consumerId) { - return new BasisKontekst(SikkerhetContext.REQUEST, null, null, ensureCunsumerId(consumerId)); + var consumer = Optional.ofNullable(consumerId) + .or(() -> Optional.ofNullable(Environment.current().application()).map(a -> "srv" + a)) + .orElse("srvlocal"); + return new BasisKontekst(SikkerhetContext.REQUEST, null, null, consumer); } static BasisKontekst tomKontekst() { return new BasisKontekst(null, null, null, null); } - protected static String ensureCunsumerId(String consumerId) { - return consumerId != null ? consumerId : Systembruker.username(); - } - } diff --git a/felles/kontekst/src/main/java/no/nav/vedtak/sikkerhet/kontekst/IdentType.java b/felles/kontekst/src/main/java/no/nav/vedtak/sikkerhet/kontekst/IdentType.java index 4030c0193..62e598019 100644 --- a/felles/kontekst/src/main/java/no/nav/vedtak/sikkerhet/kontekst/IdentType.java +++ b/felles/kontekst/src/main/java/no/nav/vedtak/sikkerhet/kontekst/IdentType.java @@ -1,11 +1,5 @@ package no.nav.vedtak.sikkerhet.kontekst; -import java.util.Objects; -import java.util.regex.Pattern; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public enum IdentType { // Case definert av NAV "standard". Brukes i ABAC policies. Til bruk i tokenprovider/obo-logikk Systemressurs, // Innkommende kall fra andre systembrukere @@ -16,28 +10,8 @@ public enum IdentType { Prosess // Ingen kjent bruk - foreslås brukt for prosesstasks ; - private static final Logger LOG = LoggerFactory.getLogger(IdentType.class); - - private static final Pattern VALID_AKTØRID = Pattern.compile("^\\d{13}$", Pattern.CASE_INSENSITIVE); - private static final Pattern VALID_PERSONIDENT = Pattern.compile("^\\d{11}$", Pattern.CASE_INSENSITIVE); - private static final Pattern VALID_ANSATTIDENT = Pattern.compile("^\\w\\d{6}$", Pattern.CASE_INSENSITIVE); - public boolean erSystem() { return Systemressurs.equals(this) || Prosess.equals(this); } - public static IdentType utledIdentType(String uid) { - if (Objects.equals(Systembruker.username(), uid)) { - return IdentType.Systemressurs; - } else if (uid != null && (VALID_AKTØRID.matcher(uid).matches() || VALID_PERSONIDENT.matcher(uid).matches())) { - return IdentType.EksternBruker; - } else if (uid != null && uid.startsWith("srv")) { - return IdentType.Systemressurs; - } else if (uid != null && VALID_ANSATTIDENT.matcher(uid).matches()) { - return IdentType.InternBruker; - } - LOG.info("FPFELLES KONTEKST kunne ikke utlede identtype fra {}", uid); - // TODO - her skal det strengt tatt være en exception .... Skal på sikt brukes til oppførsel for tokenprovider - return IdentType.InternBruker; - } } diff --git a/felles/kontekst/src/test/java/no/nav/vedtak/sikkerhet/kontekst/KontekstHolderTest.java b/felles/kontekst/src/test/java/no/nav/vedtak/sikkerhet/kontekst/KontekstHolderTest.java index f62b6d25a..7a88ad7ce 100644 --- a/felles/kontekst/src/test/java/no/nav/vedtak/sikkerhet/kontekst/KontekstHolderTest.java +++ b/felles/kontekst/src/test/java/no/nav/vedtak/sikkerhet/kontekst/KontekstHolderTest.java @@ -15,15 +15,15 @@ void testGetDefaultKontekst() { @Test void testSetAndGetSystemKontekst() { - var eksisterende = BasisKontekst.forProsesstask(); + var eksisterende = BasisKontekst.forProsesstaskUtenSystembruker(); KontekstHolder.setKontekst(eksisterende); assertThat(KontekstHolder.harKontekst()).isTrue(); var roundtrip = KontekstHolder.getKontekst(); assertThat(roundtrip).isNotNull(); assertThat(roundtrip.getContext()).isEqualTo(SikkerhetContext.SYSTEM); - assertThat(roundtrip.getUid()).isEqualTo(Systembruker.username()); - assertThat(roundtrip.getKompaktUid()).isEqualTo(Systembruker.username()); + assertThat(roundtrip.getUid()).isEqualTo("srvvtp"); + assertThat(roundtrip.getKompaktUid()).isEqualTo("srvvtp"); assertThat(roundtrip.getIdentType()).isEqualTo(IdentType.Prosess); KontekstHolder.fjernKontekst(); diff --git a/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/OpenIDProvider.java b/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/OpenIDProvider.java index 270b2f925..8d75adea3 100644 --- a/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/OpenIDProvider.java +++ b/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/OpenIDProvider.java @@ -1,7 +1,6 @@ package no.nav.vedtak.sikkerhet.oidc.config; public enum OpenIDProvider { - STS, AZUREAD, TOKENX } diff --git a/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/impl/OidcProviderConfig.java b/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/impl/OidcProviderConfig.java index 7bbe95e7d..bf8fbd358 100644 --- a/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/impl/OidcProviderConfig.java +++ b/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/impl/OidcProviderConfig.java @@ -1,9 +1,5 @@ package no.nav.vedtak.sikkerhet.oidc.config.impl; -import static no.nav.vedtak.sikkerhet.oidc.config.impl.WellKnownConfigurationHelper.getIssuerFra; -import static no.nav.vedtak.sikkerhet.oidc.config.impl.WellKnownConfigurationHelper.getJwksFra; -import static no.nav.vedtak.sikkerhet.oidc.config.impl.WellKnownConfigurationHelper.getTokenEndpointFra; - import java.net.URI; import java.util.HashSet; import java.util.Map; @@ -19,7 +15,6 @@ import no.nav.foreldrepenger.konfig.Environment; import no.nav.vedtak.exception.TekniskException; import no.nav.vedtak.klient.http.ProxyProperty; -import no.nav.vedtak.sikkerhet.kontekst.Systembruker; import no.nav.vedtak.sikkerhet.oidc.config.AzureProperty; import no.nav.vedtak.sikkerhet.oidc.config.OpenIDConfiguration; import no.nav.vedtak.sikkerhet.oidc.config.OpenIDProvider; @@ -29,7 +24,6 @@ public final class OidcProviderConfig { private static final Environment ENV = Environment.current(); private static final Logger LOG = LoggerFactory.getLogger(OidcProviderConfig.class); - private static final String STS_WELL_KNOWN_URL = "oidc.sts.well.known.url"; private static Set providers = new HashSet<>(); private final Set instanceProviders; @@ -74,11 +68,6 @@ private static synchronized Set init() { private static Set hentConfig() { Set idProviderConfigs = new HashSet<>(); - // OIDC STS - if (ENV.getProperty(STS_WELL_KNOWN_URL) != null) { // Det er kanskje noen apper som ikke bruker STS token validering?? - idProviderConfigs.add(createStsConfiguration(ENV.getProperty(STS_WELL_KNOWN_URL))); - } - // Azure - ikke alle apps trenger denne (tokenx-apps) var azureKonfigUrl = getAzureProperty(AzureProperty.AZURE_APP_WELL_KNOWN_URL); if (azureKonfigUrl != null) { @@ -99,18 +88,6 @@ private static Set hentConfig() { return idProviderConfigs; } - private static OpenIDConfiguration createStsConfiguration(String wellKnownUrl) { - return createConfiguration(OpenIDProvider.STS, - getIssuerFra(wellKnownUrl).orElse(null), - getJwksFra(wellKnownUrl).orElse(null), - getTokenEndpointFra(wellKnownUrl).orElse(null), - false, - null, - Systembruker.username(), - Systembruker.password(), - true); - } - @SuppressWarnings("unused") private static OpenIDConfiguration createAzureAppConfiguration() { var proxyUrl = ENV.isFss() ? ProxyProperty.getProxy() : null; diff --git a/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/impl/WellKnownConfigurationHelper.java b/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/impl/WellKnownConfigurationHelper.java deleted file mode 100644 index 10f85ae04..000000000 --- a/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/impl/WellKnownConfigurationHelper.java +++ /dev/null @@ -1,90 +0,0 @@ -package no.nav.vedtak.sikkerhet.oidc.config.impl; - -import java.io.IOException; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.time.Duration; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Optional; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.databind.ObjectReader; - -import no.nav.vedtak.exception.TekniskException; -import no.nav.vedtak.klient.http.ProxyProperty; -import no.nav.vedtak.mapper.json.DefaultJsonMapper; - -public class WellKnownConfigurationHelper { - - private static final Logger LOG = LoggerFactory.getLogger(WellKnownConfigurationHelper.class); - private static final ObjectReader READER = DefaultJsonMapper.getObjectMapper().readerFor(WellKnownOpenIdConfiguration.class); - - public static final String STANDARD_WELL_KNOWN_PATH = ".well-known/openid-configuration"; - - private static final Map wellKnownConfigMap = Collections.synchronizedMap(new LinkedHashMap<>()); - - public static WellKnownOpenIdConfiguration getWellKnownConfig(URI wellKnownUrl) { - return getWellKnownConfig(wellKnownUrl.toString(), null); - } - - static synchronized WellKnownOpenIdConfiguration getWellKnownConfig(String wellKnownUrl, URI proxyUrl) { - if (wellKnownConfigMap.get(wellKnownUrl) == null) { - wellKnownConfigMap.put(wellKnownUrl, hentWellKnownConfig(wellKnownUrl, proxyUrl)); - } - return wellKnownConfigMap.get(wellKnownUrl); - } - - static Optional getIssuerFra(String wellKnownURL) { - return getIssuerFra(wellKnownURL, null); - } - - static Optional getIssuerFra(String wellKnownURL, URI proxyUrl) { - return Optional.ofNullable(wellKnownURL).map(u -> getWellKnownConfig(u, proxyUrl).issuer()); - } - - static Optional getJwksFra(String wellKnownURL) { - return getJwksFra(wellKnownURL, null); - } - - static Optional getJwksFra(String wellKnownURL, URI proxyUrl) { - return Optional.ofNullable(wellKnownURL).map(u -> getWellKnownConfig(u, proxyUrl).jwks_uri()); - } - - static Optional getTokenEndpointFra(String wellKnownURL) { - return getTokenEndpointFra(wellKnownURL, null); - } - - static Optional getTokenEndpointFra(String wellKnownURL, URI proxyUrl) { - return Optional.ofNullable(wellKnownURL).map(u -> getWellKnownConfig(u, proxyUrl).token_endpoint()); - } - - private static WellKnownOpenIdConfiguration hentWellKnownConfig(String wellKnownURL, URI proxy) { - if (wellKnownURL == null) { - return null; - } - if (!wellKnownURL.toLowerCase().contains(STANDARD_WELL_KNOWN_PATH)) { - // TODO: øk til warn eller prøv å legge på / standard path med - LOG.info("WELLKNOWN OPENID-CONFIGURATION url uten standard suffix {}", wellKnownURL); - } - try (var client = HttpClient.newBuilder() - .connectTimeout(Duration.ofSeconds(10)) - .proxy(ProxyProperty.getProxySelector(proxy)) - .build()) { - var request = HttpRequest.newBuilder().uri(URI.create(wellKnownURL)).header("accept", "application/json").GET().build(); - var response = client.send(request, HttpResponse.BodyHandlers.ofString()).body(); - return response != null ? READER.readValue(response) : null; - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - throw new TekniskException("F-999999", String.format("Exception when retrieving metadata from issuer %s", wellKnownURL), e); - } catch (IOException e) { - throw new TekniskException("F-999999", String.format("Exception when retrieving metadata from issuer %s", wellKnownURL), e); - } - } - -} diff --git a/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/impl/WellKnownOpenIdConfiguration.java b/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/impl/WellKnownOpenIdConfiguration.java deleted file mode 100644 index 44c3f9e21..000000000 --- a/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/config/impl/WellKnownOpenIdConfiguration.java +++ /dev/null @@ -1,7 +0,0 @@ -package no.nav.vedtak.sikkerhet.oidc.config.impl; - -/* - * Interessante elementer fra en standard respons fra .well-known/openid-configuration - */ -public record WellKnownOpenIdConfiguration(String issuer, String jwks_uri, String token_endpoint) { -} diff --git a/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/token/TokenProvider.java b/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/token/TokenProvider.java index dba4fc449..46deb412d 100644 --- a/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/token/TokenProvider.java +++ b/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/token/TokenProvider.java @@ -51,7 +51,6 @@ private static OpenIDToken getOutgoingTokenFor(RequestKontekst requestKontekst, return switch (providerIncoming) { case AZUREAD -> identType.erSystem() ? getAzureSystemToken(scopes) : veksleAzureAccessToken(requestKontekst.getUid(), incoming, scopes); case TOKENX -> tokenXchange(incoming, scopes); - case STS -> getAzureSystemToken(scopes); }; } diff --git a/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/validator/OidcTokenValidator.java b/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/validator/OidcTokenValidator.java index 22e4c2443..9970d263c 100644 --- a/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/validator/OidcTokenValidator.java +++ b/felles/oidc/src/main/java/no/nav/vedtak/sikkerhet/oidc/validator/OidcTokenValidator.java @@ -127,15 +127,11 @@ public OidcTokenValidatorResult validate(TokenString tokenHolder) { return OidcTokenValidatorResult.invalid(error); } String subject = JwtUtil.getSubject(claims); - if (OpenIDProvider.AZUREAD.equals(provider)) { - return validateAzure(claims, subject); - } else if (OpenIDProvider.TOKENX.equals(provider)) { - return validateTokenX(claims, subject); - } else { - var identType = IdentType.utledIdentType(subject); - registrer(clientName, subject, provider, identType); - return OidcTokenValidatorResult.valid(subject, identType, JwtUtil.getExpirationTimeRaw(claims)); - } + return switch (provider) { + case AZUREAD -> validateAzure(claims, subject); + case TOKENX -> validateTokenX(claims, subject); + case null -> OidcTokenValidatorResult.invalid("mangler issuer"); + }; } catch (InvalidJwtException e) { return OidcTokenValidatorResult.invalid(e.toString()); } catch (Exception e) { diff --git a/integrasjon/arbeidsfordeling-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjerming/AbstractSkjermetPersonOnPremKlient.java b/integrasjon/arbeidsfordeling-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjerming/AbstractSkjermetPersonOnPremKlient.java deleted file mode 100644 index a25fa1e1d..000000000 --- a/integrasjon/arbeidsfordeling-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjerming/AbstractSkjermetPersonOnPremKlient.java +++ /dev/null @@ -1,75 +0,0 @@ -package no.nav.vedtak.felles.integrasjon.skjerming; - -import java.net.URI; -import java.util.List; -import java.util.Map; - -import jakarta.ws.rs.core.UriBuilder; - -import no.nav.foreldrepenger.konfig.Environment; -import no.nav.vedtak.felles.integrasjon.rest.RestClient; -import no.nav.vedtak.felles.integrasjon.rest.RestConfig; -import no.nav.vedtak.felles.integrasjon.rest.RestRequest; - -// OBS på propertynavn vs GCP-versjon skjermet.person.onprem.rs.url=http://skjermede-personer-pip.nom/skjermet -// Extend og annoter med endpoint+default + tokenConfig = STS_CC -//@RestClientConfig(tokenConfig = TokenFlow.NO_AUTH_NEEDED, endpointProperty = "skjermet.person.onprem.rs.url", endpointDefault = "http://skjermede-personer-pip.nom/skjermet" -public abstract class AbstractSkjermetPersonOnPremKlient implements Skjerming { - - private static final boolean TESTENV = Environment.current().isLocal(); - - private static final String SKJERMET_PATH = "skjermet"; - private static final String BULK_PATH = "skjermetBulk"; - - private final RestClient client; - private final RestConfig restConfig; - private final URI bulkEndpoint; - private final URI skjermetEndpoint; - - protected AbstractSkjermetPersonOnPremKlient() { - this(RestClient.client()); - } - - protected AbstractSkjermetPersonOnPremKlient(RestClient restClient) { - this.client = restClient; - this.restConfig = RestConfig.forClient(this.getClass()); - this.skjermetEndpoint = UriBuilder.fromUri(restConfig.endpoint()).path(SKJERMET_PATH).build(); - this.bulkEndpoint = UriBuilder.fromUri(restConfig.endpoint()).path(BULK_PATH).build(); - } - - - @Override - public boolean erSkjermet(String fnr) { - if (TESTENV || fnr == null) { - return false; - } - - var request = RestRequest.newPOSTJson(new SkjermetRequestDto(fnr), skjermetEndpoint, restConfig); - - var skjermet = client.send(request, String.class); - return "true".equalsIgnoreCase(skjermet); - } - - @Override - public boolean erNoenSkjermet(List fnr) { - if (TESTENV || fnr == null || fnr.isEmpty()) { - return false; - } - - var request = RestRequest.newPOSTJson(new SkjermetBulkRequestDto(fnr), bulkEndpoint, restConfig); - - return kallBulkMedSjekk(request); - } - - @SuppressWarnings("unchecked") - private boolean kallBulkMedSjekk(RestRequest request) { - // Se github / skjerming / PipController - Map skjermet = client.send(request, Map.class); - return skjermet.values().stream().anyMatch(v -> v); - } - - private record SkjermetRequestDto(String personident) { } - - private record SkjermetBulkRequestDto(List personidenter) { } - -}