ediverse Explorer la plateforme

À la une PEPPOL BIS Billing 3.0 L’obligation européenne d’e-invoicing arrive : France sept 2026, Belgique janv 2026, Allemagne 2025.

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

ChampTypeCardinalitéRôle
categoryCodeableConcept[]0..*Catégorie d'événement (REST, login, network…).
codeCodeableConcept1..1Obligatoire. Type d'événement précis.
actioncode0..1C, R, U, D, E (Create, Read, Update, Delete, Execute).
severitycode0..1emergency à debug (RFC 5424).
occurred[x]Period | dateTime0..1Quand l'événement s'est produit.
recordedinstant1..1Obligatoire. Quand l'audit a été consigné.
outcomeBackboneElement0..1Résultat (succès, échec, partial).
outcome.codeCoding1..10=Success, 4=Minor failure, 8=Serious failure, 12=Major failure.
authorizationCodeableConcept[]0..*Base légale de l'accès (RGPD article 6).
patientReference(Patient)0..1Patient concerné — fréquent en santé.
encounterReference(Encounter)0..1Encounter dans lequel l'événement s'est produit.
agentBackboneElement[]1..*Obligatoire. Acteur(s).
agent.whoReference1..1Identité de l'acteur.
agent.requestorboolean0..1Cet agent a-t-il initié l'action ?
agent.networkBackboneElement0..1IP, hostname, URI.
sourceBackboneElement1..1Obligatoire. Source de l'audit.
entityBackboneElement[]0..*Objet de l'action.
entity.whatReference0..1Ressource concernée.
entity.roleCodeableConcept0..1Rôle (Patient, Job, Master file…).

Exemple JSON

Lecture réussie d'un Patient par le Dr Jones depuis l'IP 10.0.1.42 :

json auditevent-read-patient.json
{
  "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 agent requestor=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 success pour un 403 — un access denied est un succès du contrôle de sécurité mais un échec fonctionnel. Marquer outcome.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.