AuditEvent — Traçabilité réglementaire
Qui a lu quoi, quand, depuis où, avec quel résultat ? AuditEvent répond, aligné sur DICOM ATNA et IHE BPPC. La pièce maîtresse de la traçabilité HIPAA et RGPD côté serveur FHIR.
Objet de la ressource
AuditEvent enregistre les événements sécurité-pertinents du système FHIR : accès en lecture, écriture, suppression, échec d'authentification, export de masse. La structure est dérivée de l'audit DICOM ATNA, alignée avec NIST 800-92 et IHE BPPC.
Trois acteurs typiques :
- L'agent : l'utilisateur ou le système qui agit.
- La source : le système qui consigne l'événement.
- L'entity : l'objet (ressource) sur lequel l'action a porté.
Champs clés
| Champ | Type | Cardinalité | Rôle |
|---|---|---|---|
category | CodeableConcept[] | 0..* | Catégorie d'événement (REST, login, network…). |
code | CodeableConcept | 1..1 | Obligatoire. Type d'événement précis. |
action | code | 0..1 | C, R, U, D, E (Create, Read, Update, Delete, Execute). |
severity | code | 0..1 | emergency à debug (RFC 5424). |
occurred[x] | Period | dateTime | 0..1 | Quand l'événement s'est produit. |
recorded | instant | 1..1 | Obligatoire. Quand l'audit a été consigné. |
outcome | BackboneElement | 0..1 | Résultat (succès, échec, partial). |
outcome.code | Coding | 1..1 | 0=Success, 4=Minor failure, 8=Serious failure, 12=Major failure. |
authorization | CodeableConcept[] | 0..* | Base légale de l'accès (RGPD article 6). |
patient | Reference(Patient) | 0..1 | Patient concerné — fréquent en santé. |
encounter | Reference(Encounter) | 0..1 | Encounter dans lequel l'événement s'est produit. |
agent | BackboneElement[] | 1..* | Obligatoire. Acteur(s). |
agent.who | Reference | 1..1 | Identité de l'acteur. |
agent.requestor | boolean | 0..1 | Cet agent a-t-il initié l'action ? |
agent.network | BackboneElement | 0..1 | IP, hostname, URI. |
source | BackboneElement | 1..1 | Obligatoire. Source de l'audit. |
entity | BackboneElement[] | 0..* | Objet de l'action. |
entity.what | Reference | 0..1 | Ressource concernée. |
entity.role | CodeableConcept | 0..1 | Rôle (Patient, Job, Master file…). |
Exemple JSON
Lecture réussie d'un Patient par le Dr Jones depuis l'IP 10.0.1.42 :
{
"resourceType": "AuditEvent",
"id": "example",
"category": [{
"coding": [{
"system": "http://terminology.hl7.org/CodeSystem/audit-event-type",
"code": "rest",
"display": "RESTful Operation"
}]
}],
"code": {
"coding": [{
"system": "http://hl7.org/fhir/restful-interaction",
"code": "read",
"display": "read"
}]
},
"action": "R",
"severity": "informational",
"occurredDateTime": "2026-05-14T10:25:30+02:00",
"recorded": "2026-05-14T10:25:30.123Z",
"outcome": {
"code": {
"system": "http://terminology.hl7.org/CodeSystem/audit-event-outcome",
"code": "0",
"display": "Success"
}
},
"agent": [{
"type": {
"coding": [{
"system": "http://dicom.nema.org/resources/ontology/DCM",
"code": "humanuser",
"display": "human user"
}]
},
"who": { "reference": "Practitioner/dr-jones" },
"requestor": true,
"network": { "address": "10.0.1.42", "type": "2" }
}, {
"type": {
"coding": [{
"system": "http://dicom.nema.org/resources/ontology/DCM",
"code": "110150",
"display": "Application"
}]
},
"who": { "display": "Acme FHIR Server 4.5" },
"requestor": false
}],
"source": {
"site": { "display": "Hospital 1" },
"observer": { "reference": "Device/fhir-server" }
},
"entity": [{
"what": { "reference": "Patient/example" },
"role": {
"coding": [{
"system": "http://terminology.hl7.org/CodeSystem/object-role",
"code": "1",
"display": "Patient"
}]
}
}]
} Pièges courants
- Pas d'
agent.requestor— un événement DOIT avoir au moins un agentrequestor=true(sinon ambigu sur l'origine). - Audit de l'audit — éviter de logguer les AuditEvent sur lecture des AuditEvent eux-mêmes : boucle exponentielle.
- PHI dans
entity.detail— ne pas inliner de données patient en clair dans l'audit : l'audit deviendrait une copie informelle du dossier. - Pas de network — sans IP, l'investigation forensique est handicapée.
- Outcome
successpour un 403 — un access denied est un succès du contrôle de sécurité mais un échec fonctionnel. Marqueroutcome.code=4.
Ressources liées
- Provenance — qui a créé/modifié une ressource (vs AuditEvent = qui a accédé).
- Consent — base légale de l'accès, peut être référencée par
authorization. - CapabilityStatement — déclare les capacités d'audit du serveur.