Aller au contenu principal

Audit Gateway et Evidence Service : modèle de sécurité

Cette page décrit les garanties vérifiées par les tests de la section 11 du kit (services/control-plane/tests/test_evidence_gateway.py, services/control-plane/tests/test_evidence_config_redaction.py). Le mode opératoire est dans ../operations/siem-audit.md.

Garanties​

GarantieMécanismePreuve de test
Aucun événement perduévénement et ligne eai.audit_outbox écrits dans la transaction du changement ; annulation = ni changement ni événementtest_rolled_back_change_leaves_no_event_and_committed_one_always_has_it
Livraison sans échantillonnage, reprise après pannejob audit_gateway, recul exponentiel, ordre par séquence, clé d'idempotence, déduplication côté récepteurtest_gateway_redelivers_after_target_outage_without_loss_or_duplicate, test_gateway_publishes_to_real_jetstream_with_dedup (nats-server 2.15.2 réel)
Trous de séquence détectéscontrôle de contiguïté de la boîte d'envoi, alerte sequence_gaptest_gateway_detects_outbox_sequence_gap
Scellement vérifiableJSON canonique RFC 8785, racine de Merkle sha256, hachage du sceau précédent, signature Ed25519, identifiant de clétest_seal_signature_verifies_online_and_offline, test_forged_seal_signature_is_rejected
Altération détectéemoniteur audit_integrity sur chaîne, sceaux et horodatagestest_monitor_detects_sql_tampering_of_a_sealed_event
Horodatages distinctsevent_time < ingested_at < sealed_at, tolérance de dérive bornéetest_event_time_ingested_at_sealed_at_are_distinct_and_ordered
Séparation d'accès aux charges utilesenveloppe Tink, clé hors base, déchiffrement réservé à auditor et security_officer, refusé à platform_admintest_payload_encrypted_and_only_auditor_decrypts_with_audited_reason
Accès auditéschaque lecture, recherche, vérification, export écrit son événementtest_reads_searches_and_exports_are_audited
Conservation légaleblocage de la purge et de l'effacement, levée par deux approbateurs distincts, preuve de purge sans contenutest_legal_hold_blocks_purge_and_release_needs_two_distinct_approvers
Pas de secret ni de donnée personnelle dans les journauxmasquage dans eai.logs (message, champs, exceptions) ; masquage des identifiants dans les métadonnées d'audittest_secrets_and_pii_never_reach_logs, test_audit_metadata_has_no_credentials_and_pii_goes_to_the_encrypted_payload
Sauvegarde et restaurationchaîne, sceaux, conservation légale et preuves de purge vérifiés après pg_backup.sh et pg_restore.shtest_restored_backup_keeps_verifiable_chain_seals_and_hold_state

Rôles et accès​

OpérationRouteRôles
Lister les sceaux, vérifier un sceau ou toute la chaîneGET /v1/evidence/seals, GET /v1/evidence/seals/{seal_id}/verify, GET /v1/evidence/verifyauditor, security_officer, tenant_admin
Sceller maintenantPOST /v1/evidence/sealssecurity_officer, auditor
Exporter le lot vérifiable hors ligneGET /v1/evidence/bundleauditor, security_officer
Déchiffrer la charge d'un événement, avec une raisonPOST /v1/evidence/events/{event_id}/payloadauditor, security_officer seulement (contrôle explicite, platform_admin refusé)
Journal des accèsGET /v1/evidence/access-logauditor, security_officer
Alertes d'intégrité, état de la passerelleGET /v1/evidence/alerts, GET /v1/evidence/gatewayauditor, security_officer, tenant_admin
Poser, lister, lever une conservation légalePOST /v1/evidence/holds, GET /v1/evidence/holds, POST /v1/evidence/holds/{hold_id}/releaseauditor, security_officer, tenant_admin
Lancer la purge des chargesPOST /v1/evidence/retention/runsecurity_officer, tenant_admin
Lire les preuves de purgeGET /v1/evidence/retention/evidenceauditor, security_officer, tenant_admin

La levée d'une conservation légale demande deux appels de deux approbateurs distincts : la conservation est levée à la seconde approbation ; le même approbateur deux fois reçoit 409 audit_hold_same_approver.

Réglages exigés en production​

La garde de démarrage (eai.security.startup) refuse en production :

  • EAI_AUDIT_SEAL_SIGNING_KEY_REF absent (la clé Ed25519 des sceaux doit venir d'OpenBao, EAI_AUDIT_SEAL_SIGNING_KEY en PEM ne sert qu'en développement et en test) ;
  • EAI_AUDIT_PAYLOAD_KEK différent de openbao-transit ;
  • EAI_AUDIT_SIGNING à hmac, ou EAI_OPENBAO_URL et EAI_OPENBAO_TOKEN absents (signature des exports WORM) ;
  • EAI_AUDIT_CLOCK_SKEW_SECONDS hors de 0 à 3600.

La liste complète des réglages de l'Audit Gateway (intervalles, lots, tentatives, sujet NATS, collecteur HTTP) est dans ../operations/siem-audit.md.

Vérifier une preuve hors ligne​

Le lot de GET /v1/evidence/bundle porte un manifeste signé par la clé des sceaux. Il se vérifie sans accès à la plateforme avec le module eai.domains.evidence.verify :

cd services/control-plane
.venv/bin/python -m eai.domains.evidence.verify <bundle.json>

<bundle.json> : le fichier renvoyé par GET /v1/evidence/bundle. Résultat : un rapport JSON (valid, chain, seals, clock), code de sortie 0 si le lot est valide, 1 sinon.

Une signature fausse ou un événement modifié après scellement est signalé (test_seal_signature_verifies_online_and_offline, test_forged_seal_signature_is_rejected).

Voir aussi : risk-compliance.md (preuves et catalogue de contrôles), retention-privacy.md (conservations légales et effacement).

Limites​

  • Le rôle propriétaire de la base peut modifier les lignes : l'altération est détectée (chaîne, sceaux signés), pas empêchée. L'immuabilité du stockage relève de l'export WORM, qualifié seulement avec un profil de stockage à verrouillage d'objet vérifié.
  • La révision du bundle OPA n'est enregistrée que lorsque la décision la fournit.