27
27
import jakarta .enterprise .context .Dependent ;
28
28
import jakarta .inject .Inject ;
29
29
30
+ import org .slf4j .Logger ;
31
+ import org .slf4j .LoggerFactory ;
32
+
30
33
import no .nav .vedtak .log .audit .Auditdata ;
31
34
import no .nav .vedtak .log .audit .AuditdataHeader ;
32
35
import no .nav .vedtak .log .audit .Auditlogger ;
33
36
import no .nav .vedtak .log .audit .CefField ;
34
37
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 ;
35
40
import no .nav .vedtak .sikkerhet .abac .internal .BeskyttetRessursAttributter ;
36
41
import no .nav .vedtak .sikkerhet .abac .pdp .AppRessursData ;
42
+ import no .nav .vedtak .sikkerhet .kontekst .IdentType ;
37
43
38
44
/**
39
45
* Dette loggformatet er avklart med Arcsight. Eventuelle nye felter skal
43
49
@ Dependent
44
50
public class AbacAuditlogger {
45
51
52
+ private static final Logger LOG = LoggerFactory .getLogger (AbacAuditlogger .class );
53
+
46
54
private final Auditlogger auditlogger ;
47
55
48
56
@ Inject
49
57
public AbacAuditlogger (Auditlogger auditlogger ) {
50
58
this .auditlogger = auditlogger ;
51
59
}
52
60
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
+ }
60
73
61
- private void logg (String userId , Tilgangsbeslutning tilgangsbeslutning , Access access ) {
62
- logg (userId , tilgangsbeslutning .beskyttetRessursAttributter (), tilgangsbeslutning .appRessursData (), access );
74
+ }
63
75
}
64
76
65
- private void logg (String userId , BeskyttetRessursAttributter beskyttetRessursAttributter , AppRessursData appRessursData , Access access ) {
77
+ private void logg (BeskyttetRessursAttributter beskyttetRessursAttributter , AppRessursData appRessursData , Access access ) {
66
78
requireNonNull (beskyttetRessursAttributter );
67
79
requireNonNull (beskyttetRessursAttributter .getDataAttributter ());
68
80
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 );
72
83
73
- List <String > ids = getBerortBrukerId (appRessursData );
84
+ List <String > ids = getBerortBrukerId (appRessursData ); // TODO: Vurder å kun logge for hovedperson
74
85
for (String aktorId : ids ) {
75
86
loggTilgangPerBerortAktoer (header , fields , aktorId );
76
87
}
@@ -83,7 +94,7 @@ private void loggTilgangPerBerortAktoer(AuditdataHeader header, Set<CefField> fi
83
94
auditlogger .logg (auditdata );
84
95
}
85
96
86
- private AuditdataHeader createHeader (String abacAction , Access access ) {
97
+ private AuditdataHeader createHeader (ActionType abacAction , Access access ) {
87
98
return new AuditdataHeader .Builder ().medVendor (auditlogger .getDefaultVendor ())
88
99
.medProduct (auditlogger .getDefaultProduct ())
89
100
.medEventClassId (finnEventClassIdFra (abacAction ))
@@ -92,18 +103,18 @@ private AuditdataHeader createHeader(String abacAction, Access access) {
92
103
.build ();
93
104
}
94
105
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 () ));
98
109
99
110
Set <CefField > fields = new HashSet <>();
100
111
fields .add (new CefField (EVENT_TIME , System .currentTimeMillis ()));
101
112
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 ));
103
114
fields .add (new CefField (ABAC_ACTION , abacAction ));
104
115
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 () ));
107
118
}
108
119
109
120
getOneOfNew (beskyttetRessursAttributter .getDataAttributter (), SAKSNUMMER , FAGSAK_ID ).ifPresent (fagsak -> fields .addAll (forSaksnummer (fagsak )));
@@ -136,15 +147,33 @@ private static Optional<String> getOneOfNew(AbacDataAttributter attributter, Aba
136
147
return Optional .empty ();
137
148
}
138
149
139
- private static EventClassId finnEventClassIdFra (String abacAction ) {
150
+ private static EventClassId finnEventClassIdFra (ActionType abacAction ) {
140
151
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 ;
144
155
default -> throw new IllegalArgumentException ("Ukjent abacAction: " + abacAction );
145
156
};
146
157
}
147
158
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
+
148
177
/**
149
178
* Standard hos NAV er at tilgang logges som "INFO" og avslag som "WARN". Merk
150
179
* at dette avviker fra CEF-standarden.
0 commit comments