Skip to content

Commit 0932ad0

Browse files
authored
TFP-5952 flytt auditlogging til PEP (#1414)
* TFP-5952 flytt auditlogging til PEP * Flytte attributtnavn til logger
1 parent c346fe3 commit 0932ad0

File tree

10 files changed

+356
-216
lines changed

10 files changed

+356
-216
lines changed

felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/AbacAuditlogger.java

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,19 @@
2727
import jakarta.enterprise.context.Dependent;
2828
import jakarta.inject.Inject;
2929

30+
import org.slf4j.Logger;
31+
import org.slf4j.LoggerFactory;
32+
3033
import no.nav.vedtak.log.audit.Auditdata;
3134
import no.nav.vedtak.log.audit.AuditdataHeader;
3235
import no.nav.vedtak.log.audit.Auditlogger;
3336
import no.nav.vedtak.log.audit.CefField;
3437
import no.nav.vedtak.log.audit.EventClassId;
38+
import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType;
39+
import no.nav.vedtak.sikkerhet.abac.beskyttet.ResourceType;
3540
import no.nav.vedtak.sikkerhet.abac.internal.BeskyttetRessursAttributter;
3641
import no.nav.vedtak.sikkerhet.abac.pdp.AppRessursData;
42+
import no.nav.vedtak.sikkerhet.kontekst.IdentType;
3743

3844
/**
3945
* Dette loggformatet er avklart med Arcsight. Eventuelle nye felter skal
@@ -43,34 +49,39 @@
4349
@Dependent
4450
public class AbacAuditlogger {
4551

52+
private static final Logger LOG = LoggerFactory.getLogger(AbacAuditlogger.class);
53+
4654
private final Auditlogger auditlogger;
4755

4856
@Inject
4957
public AbacAuditlogger(Auditlogger auditlogger) {
5058
this.auditlogger = auditlogger;
5159
}
5260

53-
public void loggTilgang(String userId, Tilgangsbeslutning tilgangsbeslutning) {
54-
logg(userId, tilgangsbeslutning, Access.GRANTED);
55-
}
56-
57-
public void loggDeny(String userId, Tilgangsbeslutning tilgangsbeslutning) {
58-
logg(userId, tilgangsbeslutning, Access.DENIED);
59-
}
61+
public void loggUtfall(AbacResultat utfall, BeskyttetRessursAttributter beskyttetRessursAttributter, AppRessursData appRessursData) {
62+
if (IdentType.Systemressurs.equals(beskyttetRessursAttributter.getIdentType())) {
63+
// Skal ikke auditlogge systemkall
64+
if (!utfall.fikkTilgang()) {
65+
LOG.info("ABAC AVSLAG SYSTEMBRUKER {} tjeneste {}", beskyttetRessursAttributter.getBrukerId(), beskyttetRessursAttributter.getServicePath());
66+
}
67+
} else if (beskyttetRessursAttributter.isSporingslogg()) {
68+
try {
69+
logg(beskyttetRessursAttributter, appRessursData, utfall.fikkTilgang() ? Access.GRANTED : Access.DENIED);
70+
} catch (Exception e) {
71+
LOG.warn("ABAC AUDITLOG FAILURE ident {} tjeneste {}", beskyttetRessursAttributter.getIdentType(), beskyttetRessursAttributter.getServicePath(), e);
72+
}
6073

61-
private void logg(String userId, Tilgangsbeslutning tilgangsbeslutning, Access access) {
62-
logg(userId, tilgangsbeslutning.beskyttetRessursAttributter(), tilgangsbeslutning.appRessursData(), access);
74+
}
6375
}
6476

65-
private void logg(String userId, BeskyttetRessursAttributter beskyttetRessursAttributter, AppRessursData appRessursData, Access access) {
77+
private void logg(BeskyttetRessursAttributter beskyttetRessursAttributter, AppRessursData appRessursData, Access access) {
6678
requireNonNull(beskyttetRessursAttributter);
6779
requireNonNull(beskyttetRessursAttributter.getDataAttributter());
6880

69-
String abacAction = requireNonNull(beskyttetRessursAttributter.getActionType().getEksternKode());
70-
var header = createHeader(abacAction, access);
71-
var fields = createDefaultAbacFields(userId, beskyttetRessursAttributter);
81+
var header = createHeader(beskyttetRessursAttributter.getActionType(), access);
82+
var fields = createDefaultAbacFields(beskyttetRessursAttributter);
7283

73-
List<String> ids = getBerortBrukerId(appRessursData);
84+
List<String> ids = getBerortBrukerId(appRessursData); // TODO: Vurder å kun logge for hovedperson
7485
for (String aktorId : ids) {
7586
loggTilgangPerBerortAktoer(header, fields, aktorId);
7687
}
@@ -83,7 +94,7 @@ private void loggTilgangPerBerortAktoer(AuditdataHeader header, Set<CefField> fi
8394
auditlogger.logg(auditdata);
8495
}
8596

86-
private AuditdataHeader createHeader(String abacAction, Access access) {
97+
private AuditdataHeader createHeader(ActionType abacAction, Access access) {
8798
return new AuditdataHeader.Builder().medVendor(auditlogger.getDefaultVendor())
8899
.medProduct(auditlogger.getDefaultProduct())
89100
.medEventClassId(finnEventClassIdFra(abacAction))
@@ -92,18 +103,18 @@ private AuditdataHeader createHeader(String abacAction, Access access) {
92103
.build();
93104
}
94105

95-
private Set<CefField> createDefaultAbacFields(String userId, BeskyttetRessursAttributter beskyttetRessursAttributter) {
96-
var abacAction = requireNonNull(beskyttetRessursAttributter.getActionType().getEksternKode());
97-
var abacResourceType = requireNonNull(beskyttetRessursAttributter.getResourceType());
106+
protected Set<CefField> createDefaultAbacFields(BeskyttetRessursAttributter beskyttetRessursAttributter) {
107+
var abacAction = requireNonNull(mapActionType(beskyttetRessursAttributter.getActionType()));
108+
var abacResourceType = requireNonNull(mapResourceType(beskyttetRessursAttributter.getResourceType()));
98109

99110
Set<CefField> fields = new HashSet<>();
100111
fields.add(new CefField(EVENT_TIME, System.currentTimeMillis()));
101112
fields.add(new CefField(REQUEST, beskyttetRessursAttributter.getServicePath()));
102-
fields.add(new CefField(ABAC_RESOURCE_TYPE, abacResourceType.getResourceTypeAttribute()));
113+
fields.add(new CefField(ABAC_RESOURCE_TYPE, abacResourceType));
103114
fields.add(new CefField(ABAC_ACTION, abacAction));
104115

105-
if (userId != null) {
106-
fields.add(new CefField(USER_ID, userId));
116+
if (beskyttetRessursAttributter.getBrukerId() != null) {
117+
fields.add(new CefField(USER_ID, beskyttetRessursAttributter.getBrukerId()));
107118
}
108119

109120
getOneOfNew(beskyttetRessursAttributter.getDataAttributter(), SAKSNUMMER, FAGSAK_ID).ifPresent(fagsak -> fields.addAll(forSaksnummer(fagsak)));
@@ -136,15 +147,33 @@ private static Optional<String> getOneOfNew(AbacDataAttributter attributter, Aba
136147
return Optional.empty();
137148
}
138149

139-
private static EventClassId finnEventClassIdFra(String abacAction) {
150+
private static EventClassId finnEventClassIdFra(ActionType abacAction) {
140151
return switch (abacAction) {
141-
case "read" -> AUDIT_ACCESS; /* Fall-through */
142-
case "delete", "update" -> AUDIT_UPDATE;
143-
case "create" -> AUDIT_CREATE;
152+
case READ -> AUDIT_ACCESS; /* Fall-through */
153+
case DELETE, UPDATE -> AUDIT_UPDATE;
154+
case CREATE -> AUDIT_CREATE;
144155
default -> throw new IllegalArgumentException("Ukjent abacAction: " + abacAction);
145156
};
146157
}
147158

159+
private static String mapActionType(ActionType actionType) {
160+
return actionType == ActionType.DUMMY ? null : actionType.name().toLowerCase();
161+
}
162+
163+
// TODO: vurder å forkorte vekk abac.attributter.
164+
private static String mapResourceType(ResourceType resourceType) {
165+
return switch (resourceType) {
166+
case APPLIKASJON -> "no.nav.abac.attributter.foreldrepenger";
167+
case DRIFT -> "no.nav.abac.attributter.foreldrepenger.drift";
168+
case FAGSAK -> "no.nav.abac.attributter.foreldrepenger.fagsak";
169+
case VENTEFRIST -> "no.nav.abac.attributter.foreldrepenger.fagsak.ventefrist";
170+
case OPPGAVESTYRING_AVDELINGENHET -> "no.nav.abac.attributter.foreldrepenger.oppgavestyring.avdelingsenhet";
171+
case OPPGAVESTYRING -> "no.nav.abac.attributter.foreldrepenger.oppgavestyring";
172+
case UTTAKSPLAN -> "no.nav.abac.attributter.foreldrepenger.uttaksplan";
173+
case PIP, DUMMY -> throw new IllegalArgumentException("Ulovlig resourceType: " + resourceType);
174+
};
175+
}
176+
148177
/**
149178
* Standard hos NAV er at tilgang logges som "INFO" og avslag som "WARN". Merk
150179
* at dette avviker fra CEF-standarden.

felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/AbacResultat.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,8 @@ public enum AbacResultat {
66
AVSLÅTT_KODE_6,
77
AVSLÅTT_EGEN_ANSATT,
88
AVSLÅTT_ANNEN_ÅRSAK;
9+
10+
public boolean fikkTilgang() {
11+
return this == GODKJENT;
12+
}
913
}

felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/BeskyttetRessursInterceptor.java

Lines changed: 17 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.lang.reflect.InvocationTargetException;
44
import java.lang.reflect.Method;
55
import java.util.Collection;
6-
import java.util.Optional;
76

87
import jakarta.annotation.Priority;
98
import jakarta.enterprise.context.Dependent;
@@ -13,84 +12,52 @@
1312
import jakarta.interceptor.InvocationContext;
1413

1514
import org.jboss.weld.interceptor.util.proxy.TargetInstanceProxy;
16-
import org.slf4j.Logger;
17-
import org.slf4j.LoggerFactory;
1815

19-
import no.nav.foreldrepenger.konfig.Environment;
2016
import no.nav.vedtak.exception.TekniskException;
2117
import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType;
2218
import no.nav.vedtak.sikkerhet.abac.beskyttet.ResourceType;
2319
import no.nav.vedtak.sikkerhet.abac.internal.ActionUthenter;
2420
import no.nav.vedtak.sikkerhet.abac.internal.BeskyttetRessursAttributter;
25-
import no.nav.vedtak.sikkerhet.kontekst.IdentType;
2621

2722
@BeskyttetRessurs(actionType = ActionType.DUMMY, resourceType = ResourceType.DUMMY)
2823
@Interceptor
2924
@Priority(Interceptor.Priority.APPLICATION + 11)
3025
@Dependent
3126
public class BeskyttetRessursInterceptor {
3227

33-
private static final Environment ENV = Environment.current();
34-
private static final Logger LOG = LoggerFactory.getLogger(BeskyttetRessursInterceptor.class);
35-
3628
private final Pep pep;
37-
private final AbacAuditlogger abacAuditlogger;
3829
private final TokenProvider tokenProvider;
3930

4031
@Inject
41-
public BeskyttetRessursInterceptor(Pep pep, AbacAuditlogger abacAuditlogger, TokenProvider provider) {
32+
public BeskyttetRessursInterceptor(Pep pep, TokenProvider provider) {
4233
this.pep = pep;
43-
this.abacAuditlogger = abacAuditlogger;
4434
this.tokenProvider = provider;
4535
}
4636

4737
@AroundInvoke
4838
public Object wrapTransaction(final InvocationContext invocationContext) throws Exception {
49-
var dataAttributter = finnAbacDataAttributter(invocationContext);
50-
var beskyttetRessursAttributter = hentBeskyttetRessursAttributter(invocationContext, dataAttributter);
39+
var method = invocationContext.getMethod();
40+
var dataAttributter = finnAbacDataAttributter(method, invocationContext.getParameters());
41+
var beskyttetRessursAttributter = hentBeskyttetRessursAttributter(method, getOpprinneligKlasse(invocationContext), dataAttributter);
42+
5143
var beslutning = pep.vurderTilgang(beskyttetRessursAttributter);
5244
if (beslutning.fikkTilgang()) {
53-
return proceed(invocationContext, beslutning);
54-
}
55-
return ikkeTilgang(beslutning);
56-
}
57-
58-
private Object proceed(InvocationContext invocationContext, Tilgangsbeslutning beslutning) throws Exception {
59-
Method method = invocationContext.getMethod();
60-
boolean sporingslogges = method.getAnnotation(BeskyttetRessurs.class).sporingslogg();
61-
if (!erSystembrukerKall(beslutning.beskyttetRessursAttributter()) && sporingslogges) {
62-
Object resultat = invocationContext.proceed();
63-
abacAuditlogger.loggTilgang(tokenProvider.getUid(), beslutning);
64-
return resultat;
65-
}
66-
return invocationContext.proceed();
67-
}
68-
69-
private Object ikkeTilgang(Tilgangsbeslutning beslutning) {
70-
if (!erSystembrukerKall(beslutning.beskyttetRessursAttributter())) {
71-
abacAuditlogger.loggDeny(tokenProvider.getUid(), beslutning);
45+
return invocationContext.proceed();
7246
} else {
73-
LOG.info("ABAC AVSLAG SYSTEMBRUKER {}", beslutning.beskyttetRessursAttributter().getBrukerId());
47+
return ikkeTilgang(beslutning);
7448
}
49+
}
7550

76-
switch (beslutning.beslutningKode()) {
51+
private Object ikkeTilgang(AbacResultat abacResultat) {
52+
switch (abacResultat) {
7753
case AVSLÅTT_KODE_6 -> throw new PepNektetTilgangException("F-709170", "Tilgangskontroll.Avslag.Kode6");
7854
case AVSLÅTT_KODE_7 -> throw new PepNektetTilgangException("F-027901", "Tilgangskontroll.Avslag.Kode7");
7955
case AVSLÅTT_EGEN_ANSATT -> throw new PepNektetTilgangException("F-788257", "Tilgangskontroll.Avslag.EgenAnsatt");
8056
default -> throw new PepNektetTilgangException("F-608625", "Ikke tilgang");
8157
}
8258
}
8359

84-
private boolean erSystembrukerKall(BeskyttetRessursAttributter beskyttetRessursAttributter) {
85-
return Optional.ofNullable(beskyttetRessursAttributter)
86-
.map(BeskyttetRessursAttributter::getIdentType)
87-
.filter(IdentType::erSystem)
88-
.isPresent();
89-
}
90-
91-
private BeskyttetRessursAttributter hentBeskyttetRessursAttributter(InvocationContext invocationContext, AbacDataAttributter dataAttributter) {
92-
Class<?> clazz = getOpprinneligKlasse(invocationContext);
93-
var method = invocationContext.getMethod();
60+
private BeskyttetRessursAttributter hentBeskyttetRessursAttributter(Method method, Class<?> mClass, AbacDataAttributter dataAttributter) {
9461
var beskyttetRessurs = method.getAnnotation(BeskyttetRessurs.class);
9562

9663
var token = Token.withOidcToken(tokenProvider.openIdToken());
@@ -104,19 +71,20 @@ private BeskyttetRessursAttributter hentBeskyttetRessursAttributter(InvocationCo
10471
.medActionType(beskyttetRessurs.actionType())
10572
.medAvailabilityType(beskyttetRessurs.availabilityType())
10673
.medResourceType(finnResource(beskyttetRessurs))
74+
.medSporingslogg(beskyttetRessurs.sporingslogg())
10775
.medPepId(pep.pepId())
108-
.medServicePath(utledAction(clazz, method))
76+
.medServicePath(utledAction(mClass, method))
10977
.medDataAttributter(dataAttributter)
11078
.build();
11179

11280
}
11381

114-
static AbacDataAttributter finnAbacDataAttributter(InvocationContext invocationContext) {
115-
var method = invocationContext.getMethod();
82+
static AbacDataAttributter finnAbacDataAttributter(Method method, Object[] parameters) {
11683
var dataAttributter = AbacDataAttributter.opprett();
11784
var parameterDecl = method.getParameters();
118-
for (int i = 0; i < method.getParameterCount(); i++) {
119-
Object parameterValue = invocationContext.getParameters()[i];
85+
var parameterCount = method.getParameterCount();
86+
for (int i = 0; i < parameterCount; i++) {
87+
Object parameterValue = parameters[i];
12088
var tilpassetAnnotering = parameterDecl[i].getAnnotation(TilpassetAbacAttributt.class);
12189
leggTilAttributterFraParameter(dataAttributter, parameterValue, tilpassetAnnotering);
12290
}

felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Pep.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
public interface Pep {
77

8-
Tilgangsbeslutning vurderTilgang(BeskyttetRessursAttributter beskyttetRessursAttributter);
8+
AbacResultat vurderTilgang(BeskyttetRessursAttributter beskyttetRessursAttributter);
99

1010
default String pepId() {
1111
return Environment.current().getNaisAppName();

felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/PepImpl.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88
import jakarta.enterprise.inject.Default;
99
import jakarta.inject.Inject;
1010

11-
import org.slf4j.Logger;
12-
import org.slf4j.LoggerFactory;
13-
1411
import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType;
1512
import no.nav.vedtak.sikkerhet.abac.internal.BeskyttetRessursAttributter;
1613
import no.nav.vedtak.sikkerhet.abac.pdp.AppRessursData;
@@ -30,8 +27,7 @@
3027
@ApplicationScoped
3128
public class PepImpl implements Pep {
3229

33-
private static final Logger LOG = LoggerFactory.getLogger(PepImpl.class);
34-
30+
private AbacAuditlogger abacAuditlogger;
3531
private PopulasjonKlient populasjonKlient;
3632
private AnsattGruppeKlient ansattGruppeKlient;
3733
private PdpRequestBuilder pdpRequestBuilder;
@@ -42,21 +38,25 @@ public class PepImpl implements Pep {
4238
}
4339

4440
@Inject
45-
public PepImpl(PopulasjonKlient populasjonKlient, AnsattGruppeKlient ansattGruppeKlient, PdpRequestBuilder pdpRequestBuilder) {
41+
public PepImpl(AbacAuditlogger abacAuditlogger,
42+
PopulasjonKlient populasjonKlient,
43+
AnsattGruppeKlient ansattGruppeKlient,
44+
PdpRequestBuilder pdpRequestBuilder) {
45+
this.abacAuditlogger = abacAuditlogger;
4646
this.populasjonKlient = populasjonKlient;
4747
this.ansattGruppeKlient = ansattGruppeKlient;
4848
this.pdpRequestBuilder = pdpRequestBuilder;
4949
}
5050

5151
@Override
52-
public Tilgangsbeslutning vurderTilgang(BeskyttetRessursAttributter beskyttetRessursAttributter) {
52+
public AbacResultat vurderTilgang(BeskyttetRessursAttributter beskyttetRessursAttributter) {
5353
var appRessurser = pdpRequestBuilder.lagAppRessursData(beskyttetRessursAttributter.getDataAttributter());
5454

5555
var vurdering = forespørTilgang(beskyttetRessursAttributter, appRessurser);
56-
return new Tilgangsbeslutning(vurdering.tilgangResultat(), beskyttetRessursAttributter, appRessurser);
56+
abacAuditlogger.loggUtfall(vurdering.tilgangResultat(), beskyttetRessursAttributter, appRessurser);
57+
return vurdering.tilgangResultat();
5758
}
5859

59-
6060
// Skal kunne kalles fra evt subklasser av PepImpl
6161
protected Tilgangsvurdering forespørTilgang(BeskyttetRessursAttributter beskyttetRessursAttributter, AppRessursData appRessursData) {
6262
if (ActionType.DUMMY.equals(beskyttetRessursAttributter.getActionType())) {

felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Tilgangsbeslutning.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,4 @@
66
public record Tilgangsbeslutning(AbacResultat beslutningKode,
77
BeskyttetRessursAttributter beskyttetRessursAttributter,
88
AppRessursData appRessursData) {
9-
10-
public boolean fikkTilgang() {
11-
return beslutningKode == AbacResultat.GODKJENT;
12-
}
139
}

felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/internal/BeskyttetRessursAttributter.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@ public class BeskyttetRessursAttributter {
1919
private String brukerId;
2020
private UUID brukerOid;
2121
private IdentType identType;
22-
private Set<AnsattGruppe> ansattGrupper = new LinkedHashSet<>();
22+
private final Set<AnsattGruppe> ansattGrupper = new LinkedHashSet<>();
2323
private ActionType actionType;
2424
private ResourceType resourceType;
2525
private AvailabilityType availabilityType;
2626
private Token token;
2727
private String pepId;
2828
private String servicePath;
29+
private boolean sporingslogg = true;
2930
private AbacDataAttributter dataAttributter;
3031

3132
public static Builder builder() {
@@ -60,6 +61,10 @@ public ResourceType getResourceType() {
6061
return resourceType;
6162
}
6263

64+
public boolean isSporingslogg() {
65+
return sporingslogg;
66+
}
67+
6368
public Token getToken() {
6469
return token;
6570
}
@@ -129,6 +134,11 @@ public Builder medResourceType(ResourceType resourceType) {
129134
return this;
130135
}
131136

137+
public Builder medSporingslogg(boolean sporingslogg) {
138+
pdpRequest.sporingslogg = sporingslogg;
139+
return this;
140+
}
141+
132142
public Builder medPepId(String pepId) {
133143
pdpRequest.pepId = pepId;
134144
return this;

0 commit comments

Comments
 (0)