Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Til sidst inkluderes en "dokumentationsskabelon", der kan anvendes som input til de konkrete driftsmanualer for de NSP komponenter, der anvender NSP Audit API.

Arkitekturoverblik og motivation for NSP Audit API

Auditlogning er en capability, som er nødvendig for mange af NSP'ens komponenter: Af juridiske hensyn er det nødvendigt at kunne følge op på hvem, der har gjort hvad og hvornår henover NSP'ens service portefølje.

...

Gliffy Diagram
size600
displayNameNSP Audit API overview
nameNSP Audit API overview
pagePin3

Anvendelse af NSP Audit API i NSP komponenter

For at anvende NSP Audit API i en konkret NSP komponent i udviklingsmæssig sammenhæng, så er der et par tekniske øvelser, der skal være på plads. Da hovedparten af NSP'ens komponenter er bygget op på samme måde, så vil denne vejledning umiddelbart kunne anvendes i langt de fleste tilfælde. Antagelsen i denne vejledning er derfor at:

...

Dernæst vises det med et praktisk eksempel hentet fra Dokumentdelingsservicen, hvordan NSP Audit API kan anvendes i applikationskode til at implementere relevant auditlogning.

Maven dependency

Langt de fleste NSP komponenter anvender Maven til at holde styr på afhængigheder til tredjeparts biblioteker.

...

Afviklingsomgivelserne for en NSP komponent er Wildfly (evt via et af NSP'ens Docker images). I det følgende afsnit vises, hvordan man sørger for, at Wildfly rent faktisk stiller NSP Audit API til rådighed for den anvendende komponent og derved opfylder kontrakten, som blev udtrykt i Maven konfigurationsfilen.

Wildfly dependency

I forgående afsnit blev det fremhævet, at det ikke er en NSP komponents ansvar selv at inkludere NSP Audit API i dens færdigbyggede modul.

...

I ovenstående eksempel er det NSP Audit API version 1.0.1, der stilles til rådighed af den konkrete version af Wildfly, hvilket hænger fint sammen med det versionsnummer, der blev udtrykt i Maven afhængigheden (i pom.xml).

Udvikling af auditlogning vha NSP Audit API

Når en komponent har fået sat afhængighed op til NSP Audit API, er udvikleren klar til at begynde at anvende dette til auditlogningsformål.

...

Der skal derfor ikke gøres mere end de to nævnte punkter. Disse gennemgåes i det følgende.

Oprettelse af AuditBuilder

Anvendelse af NSP Audit API er meget simpel. For hver request som komponenten modtager skal følgende linie kaldes:

...

Warning

En leverance af en komponent til NSP må ikke indeholde en provider-configuration fil idet dette kunne påvirke andre komponenter på platformen.

Tilføjelse af konkrete auditloginformationer

En AuditBuilder har 4 forskellige metoder til at tilføje audit information.

...

Værdierne, der sendes med, er af typen Object. Metoden toString() bliver anvendt på de medsendte values objekter for at få dem serialiseret til er format, der kan logges. Som en undtagelse hertil skal nævnes values objekter af typen javax.json.JsonObject. Værdier af denne type håndteres specielt af NSP Audit API, der laver en pæn rendering i JSON format.

Dokumentdelingsservice: Eksempel på implementation af auditlogning via NSP Audit API

I de forgående afsnit blev det gennemgået, hvordan en AuditBuilder skal oprettes og håndteres i en NSP komponent, der ønsker at auditlogge, og hvorledes auditloginformationer kan tilføjes i løbet af servicens behandling af et kald.

...

I Dokumentdelingsservicen auditlogges hele svaret dvs. alle de elementer, der fremsøges. I eksemplet ovenfor konstrueres en nøgle udfra bla en tæller (count) for at auditloggen kan indeholde en liste.

Effekt af NSP Audit API i NSP komponenter

I de forgående afsnit blev det gennemgået, hvordan NSP Audit API kan anvendes i NSP komponenters kode for let at kunne auditlogge information.

...

Herigennem bliver det muligt for udviklere af NSP komponenter at forstå, hvilke informationer, der stammer fra afviklingsplatformen (således givet ved brugen af NSP Audit API), og hvilke der stammer fra komponenten selv.

Eksempel på auditlogninger fra Dokumentdelingsservice

I det forgående kapitel blev Dokumentdelingsservicens fremsøgningsservice brugs som eksempel på at vise, hvordan en konkret NSP service havde implementeret auditlogning. Igennem afvikling af Dokumentdelingsservicens integrationstest kan vi vise eksempler på, hvordan auditloggen kommer til at se ud, når fremsøgningsservicen anvendes. For komplethedens skyld har vi inkluderet to kald af fremsøgningsservicen: Et, hvor en borger fremsøger sine egne dokumenter og et, hvor en sundhedsprofessionel gør det samme.

...

Det er værd at bemærke, at NSP Audit API selv sørger for at logge soap headers, indhold fra det medsendte idkort eller token samt diverse kvantitative metrikker vedr kaldet. Det behøver man således ikke selv at logge som anvender af API'et.

En borger fremsøger egne dokumenter gennem dokumentdelingsservice (IDWS)

Ved at autentificere sig med en IDWS billet har en borger mulighed for at fremsøge sine egne dokumenter via Dokumentdelingsservicen. Kaldet rammer fremsøgningslogikken som blev vist i forgående kapitel, og følgende information ender i auditloggen:

Code Block
titleAuditlogning fra fremsøgning på Dokumentdelingsservice af borger
collapsetrue
{
   "time":"2021-10-13T14:21:38.115Z",
   "category":"dk.sds.nsp.audit.log.dds",
   "audit":{
      "timestamp":"2021-10-13T16:21:37.531+02:00",
      "components":[
         {
            "component":"DDS",
            "contexts":[
               {
                  "context":"documentRegistryAdhocQuery",
                  "information":[
                     {
                        "key":"patient-cpr",
                        "type":"RPI",
                        "value":"0207761919"
                     },
                     {
                        "key":"bruger-cpr",
                        "type":"RPI",
                        "value":"0207761919"
                     },
                     {
                        "key":"queryTypecode",
                        "type":"NPI",
                        "values":[
                           "('39289-4^^2.16.840.1.113883.6.1')"
                        ]
                     },
                     {
                        "key":"document_entry.0.homecommunityid",
                        "type":"SPI",
                        "value":""
                     },
                     {
                        "key":"document_entry.0.repositoryid",
                        "type":"SPI",
                        "value":"1.3.6.1.4.1.21367.2010.1.2.1125"
                     },
                     {
                        "key":"document_entry.0.documentid",
                        "type":"SPI",
                        "value":"0207761919.6052203964123326052.1537974544003"
                     },
                     {
                        "key":"document_entry.0.typecode",
                        "type":"SPI",
                        "value":"39289-4"
                     },
                     {
                        "key":"document_entry.1.homecommunityid",
                        "type":"SPI",
                        "value":""
                     },
                     {
                        "key":"document_entry.1.repositoryid",
                        "type":"SPI",
                        "value":"1.3.6.1.4.1.21367.2010.1.2.1125"
                     },
                     {
                        "key":"document_entry.1.documentid",
                        "type":"SPI",
                        "value":"5619531150207761919.6052203964123326052.1537974544003"
                     },
                     {
                        "key":"document_entry.1.typecode",
                        "type":"SPI",
                        "value":"39289-4"
                     },
                     {
                        "key":"document_entry.2.homecommunityid",
                        "type":"SPI",
                        "value":""
                     },
                     {
                        "key":"document_entry.2.repositoryid",
                        "type":"SPI",
                        "value":"1.3.6.1.4.1.21367.2010.1.2.1125"
                     },
                     {
                        "key":"document_entry.2.documentid",
                        "type":"SPI",
                        "value":"0207761919.678401000016005.10001"
                     },
                     {
                        "key":"document_entry.2.typecode",
                        "type":"SPI",
                        "value":"39289-4"
                     }
                  ]
               }
            ]
         }
      ]
   },
   "access":{
      "code":200,
      "duration":462,
      "httpHeaders":{
         "Content-Type":"application/soap+xml; charset=UTF-8"
      },
      "httpHost":"localhost",
      "idCardAttributes":{
         "dk:gov:saml:attribute:AssuranceLevel":"3",
         "dk:gov:saml:attribute:CprNumberIdentifier":"0207761919",
         "dk:gov:saml:attribute:SpecVer":"DK-SAML-2.0"
      },
      "method":"POST",
      "path":"/ddsregistry/idws",
      "query":"",
      "port":9090,
      "protocol":"http",
      "reqSize":13124,
      "resSize":22971,
      "soapHeaders":{
         "Audience":"https://audience.nspop.dk/dds",
         "Issuer":"TEST2-NSP-STS",
         "NameID":"C=DK,O=Ingen organisatorisk tilknytning,CN=Lars Larsen,Serial=PID:9208-2002-2-663031557285",
         "w3Action":"action",
         "w3MessageID":"urn:uuid:b1622648-c82e-4adc-b9fb-4c9a51b1df1d",
         "w3To":"http://localhost:9090/ddsregistry/idws"
      },
      "threadId":"default task-3",
      "time":"2021-10-13T16:21:37.531+02:00",
      "stats":{
         "handlerDuration":118,
         "RequestContentDuration":1,
         "ResponseContentDuration":0,
         "SecurityProtocolRequestDuration":10,
         "SecurityProtocolResponseDuration":101,
         "bufferAllocated":false,
         "usedBuffers":2,
         "activeBuffersInPool":2,
         "idleBuffersInPool":4
      }
   }
}


En sundhedsprofessionel fremsøger en borgers dokumenter gennem dokumentdelingsservice (DGWS)

Ved at autentificere sig med et SOSI idkort (DGWS) har en sundhedsprofessionel mulighed for at fremsøge en borgers dokumenter via Dokumentdelingsservicen. Kaldet rammer fremsøgningslogikken som blev vist i forgående kapitel, og følgende information ender i auditloggen:

Code Block
languagejs
titleAuditlogging fra fremsøgning på Dokumentdelingsservice (sundhedsprofessionel)
collapsetrue
{
   "time":"2021-10-13T14:04:07.387Z",
   "category":"dk.sds.nsp.audit.log.dds",
   "audit":{
      "timestamp":"2021-10-13T16:04:06.861+02:00",
      "components":[
         {
            "component":"DDS",
            "contexts":[
               {
                  "context":"documentRegistryAdhocQuery",
                  "information":[
                     {
                        "key":"patient-cpr",
                        "type":"RPI",
                        "value":"0106501010"
                     },
                     {
                        "key":"bruger-cpr",
                        "type":"RPI",
                        "value":"0804769723"
                     },
                     {
                        "key":"on-behalf-of-cpr",
                        "type":"RPI",
                        "value":"0804769723"
                     },
                     {
                        "key":"document_entry.0.homecommunityid",
                        "type":"SPI",
                        "value":""
                     },
                     {
                        "key":"document_entry.0.repositoryid",
                        "type":"SPI",
                        "value":"1.3.6.1.4.1.21367.2010.1.2.1125"
                     },
                     {
                        "key":"document_entry.0.documentid",
                        "type":"SPI",
                        "value":"0106501010.842938295.10000002"
                     },
                     {
                        "key":"document_entry.0.typecode",
                        "type":"SPI",
                        "value":"39289-4"
                     },
                     {
                        "key":"document_entry.1.homecommunityid",
                        "type":"SPI",
                        "value":""
                     },
                     {
                        "key":"document_entry.1.repositoryid",
                        "type":"SPI",
                        "value":"1.3.6.1.4.1.21367.2010.1.2.1125"
                     },
                     {
                        "key":"document_entry.1.documentid",
                        "type":"SPI",
                        "value":"0106501010.842938295.10000003"
                     },
                     {
                        "key":"document_entry.1.typecode",
                        "type":"SPI",
                        "value":"39289-4"
                     },
                     {
                        "key":"document_entry.2.homecommunityid",
                        "type":"SPI",
                        "value":""
                     },
                     {
                        "key":"document_entry.2.repositoryid",
                        "type":"SPI",
                        "value":"1.3.6.1.4.1.21367.2010.1.2.1125"
                     },
                     {
                        "key":"document_entry.2.documentid",
                        "type":"SPI",
                        "value":"0106501010.678401000016005.10000001"
                     },
                     {
                        "key":"document_entry.2.typecode",
                        "type":"SPI",
                        "value":"39289-4"
                     },
                     {
                        "key":"document_entry.3.homecommunityid",
                        "type":"SPI",
                        "value":"1.2.208.176.8.1.12"
                     },
                     {
                        "key":"document_entry.3.repositoryid",
                        "type":"SPI",
                        "value":"1.2.208.176.43210.8.10.12"
                     },
                     {
                        "key":"document_entry.3.documentid",
                        "type":"SPI",
                        "value":"1.2.208.176.43210.8.10.12^27434a41-cf20-4fb4-bdd7-c4bd7fc98cf2"
                     },
                     {
                        "key":"document_entry.3.typecode",
                        "type":"SPI",
                        "value":"52460-3"
                     },
                     {
                        "key":"document_entry.4.homecommunityid",
                        "type":"SPI",
                        "value":"1.2.208.176.8.1.12"
                     },
                     {
                        "key":"document_entry.4.repositoryid",
                        "type":"SPI",
                        "value":"1.2.208.176.43210.8.10.12"
                     },
                     {
                        "key":"document_entry.4.documentid",
                        "type":"SPI",
                        "value":"1.2.208.176.43210.8.10.12^fe950ffa-30e6-4f1d-b364-bd30e3b7a66b"
                     },
                     {
                        "key":"document_entry.4.typecode",
                        "type":"SPI",
                        "value":"PDC"
                     }
                  ]
               }
            ]
         }
      ]
   },
   "access":{
      "code":200,
      "duration":489,
      "httpHeaders":{
         "Content-Type":"application/soap+xml; charset=UTF-8"
      },
      "httpHost":"localhost",
      "idCardAttributes":{
         "medcom:CareProviderID":"33257872",
         "medcom:CareProviderName":"Sundhedsdatastyrelsen",
         "medcom:ITSystemName":"Test",
         "medcom:UserAuthorizationCode":"CBTH1",
         "medcom:UserOccupation":"Læge",
         "medcom:UserRole":"7170",
         "sosi:AuthenticationLevel":"4",
         "sosi:IDCardID":"ndbdsjE8LrtpFqHmzKL0Xw==",
         "sosi:IDCardType":"user",
         "sosi:IDCardVersion":"1.0.1"
      },
      "method":"POST",
      "path":"/ddsregistry",
      "query":"",
      "port":9090,
      "protocol":"http",
      "reqSize":9626,
      "resSize":33100,
      "soapHeaders":{
         "Issuer":"TEST2-NSP-STS",
         "MessageID":"AAABfHn3qv7YTBlq290B5FNPU0k=",
         "NameID":"SubjectDN={CN=Casper Rasmussen + SERIALNUMBER=CVR:33257872-RID:40718906, O=Sundhedsdatastyrelsen // CVR:33257872, C=DK},IssuerDN={CN=TRUST2408 Systemtest XXXIV CA, O=TRUST2408, C=DK},CertSerial={1604229135}",
         "w3Action":"urn:ihe:iti:2007:RegistryStoredQuery",
         "w3MessageID":"urn:uuid:07b2fb66-19c4-4bc7-8630-e427cebff032",
         "w3To":"http://localhost:9090/ddsregistry"
      },
      "threadId":"default task-58",
      "time":"2021-10-13T16:04:06.861+02:00",
      "stats":{
         "handlerDuration":33,
         "RequestContentDuration":3,
         "ResponseContentDuration":0,
         "SecurityProtocolRequestDuration":18,
         "SecurityProtocolResponseDuration":0,
         "bufferAllocated":false,
         "usedBuffers":2,
         "activeBuffersInPool":2,
         "idleBuffersInPool":4
      }
   }
}


Driftsdokumentation for NSP komponenter, der anvender NSP Audit API

Alle NSP komponenter skal i følge kravene dokumentere deres auditlogninger i driftsdokumentationen.

...