đĄïž SENTRY â Ătat global aprĂšs intĂ©gration M1âM6¶
Date : 03/10/2026 · Référence auditée : main = 266b46e (« Merge branch
'feature/phases-4-6' into 'main' ») · Auteur de l'audit : Claude (Cowork), pour Godwill FOKA
MĂ©thode : reconstitution du dĂ©pĂŽt depuis la copie locale (le bac Ă sable n'a pas accĂšs Ă
gitlab.com), CI rejouée sur trois environnements, base PostgreSQL neuve alimentée par de vraies
sources, scénario SOC exécuté contre l'API réelle (uvicorn), analyses de sécurité outillées.
1. SynthĂšse¶
Les six modules sont intégrés dans main et fonctionnent ensemble sur données réelles :
3 867 IOC collectés depuis 3 sources publiques, 1 733 CVE du catalogue KEV officiel, un incident
mené de l'ouverture à la clÎture avec post-mortem, des exports, deux sessions de chasse. Le
scénario d'acceptation passe 40/40, la CI 388 tests verts sur trois environnements.
Ce qui sépare main d'une plateforme exploitable n'est plus du code fonctionnel :
- un défaut bloquant sur le poste Kali :
mypyéchoue avec SQLAlchemy 2.0 (corrigé, § 13) ; - une faille d'intégrité :
TRUNCATEcontourne l'immuabilité de la chronologie (§ 7) ; - la validation des sources sous clé (OTX, RedEye, NVD, EPSS), impossible depuis ce bac à sable et à faire sur Kali.
Verdict : baseline v0.1.1 acceptable aprĂšs fusion de release/v0.1.1 (correctif + rapport).
M7 « Production Hardening » est bien la priorité suivante ; la faille TRUNCATE et le
verrouillage des dépendances en sont les deux premiers items.
2. Architecture actuelle¶
CLI (Click/Rich, 34 commandes) API REST (FastAPI, 29 routes)
ââââââââââââââââŹâââââââââââââââ
Services métier (sentry/modules)
threat_feeds · cve_tracker · incidents · dashboard · threat_hunting · foundation
â
SQLAlchemy 2 async · Alembic (6 migrations, 1 seule head)
â
PostgreSQL 16 (14 tables) Redis 7 (verrous, limitation de débit)
Un processus API, un worker unique (sentry feeds worker) qui planifie flux, CVE et chasse sous
verrou Redis. Couches respectées : aucun service n'importe FastAPI ; les contrÎleurs n'accÚdent pas
Ă SQL directement.
3. Ătat M1 â M6, sur quatre niveaux¶
| Niveau | Définition |
|---|---|
| CODE | fonctionnalité développée et fusionnée dans main |
| TESTà | tests automatisés verts (CI) |
| INTĂGRĂ | exercĂ© contre des composants rĂ©els (PostgreSQL, Redis, API HTTP, sources Internet) |
| OPĂRATIONNEL | critĂšre de jalon constatĂ© par sentry status sur donnĂ©es rĂ©elles, en continu |
| Module | CODE | TESTĂ | INTĂGRĂ | OPĂRATIONNEL | Constat de l'audit |
|---|---|---|---|---|---|
| M1 Foundation | â | â | â | â | API, auth, rĂŽles, migrations, CLI vĂ©rifiĂ©s en conditions rĂ©elles |
| M2 Threat Feeds | â | â | â | â 2/4 | 3 sources saines, 3 867 IOC ; OTX (clĂ©) et STIX/TAXII (jeton RedEye) non constatĂ©s |
| M3 CVE | â | â | â | â 0/4 | KEV rĂ©el importĂ© (1 733) ; NVD et EPSS bloquĂ©s par le bac Ă sable |
| M4 Incidents | â | â | â | â | cycle complet sur donnĂ©es rĂ©elles ; faille TRUNCATE ; persistance du critĂšre Ă constater sur Kali |
| M5 Dashboard | â | â | â | â | synthĂšse, activitĂ©, 8 exports ; sĂ©ries 7 jours absentes |
| M6 Hunting | â | â | â | â | chasse sur observables et sur 3 867 IOC ; RULE-01 (Tor) non testable ici |
Avancement défendable
| Mesure | Valeur | Calcul |
|---|---|---|
| Code du pĂ©rimĂštre v1.0 | â 88 % | tĂąches du plan directeur livrĂ©es et testĂ©es (inchangĂ© depuis le 03/10 matin) |
| IntĂ©gration rĂ©elle | â 80 % | 5 modules sur 6 intĂ©grĂ©s, M3 Ă moitiĂ© |
| Jalons opérationnels | 1 / 6 constaté, 4 partiels | sentry status sur la base d'audit |
Confiance : élevée pour les trois mesures sur le périmÚtre testé ici ; moyenne pour M3, dont la moitié NVD/EPSS n'a jamais reçu de vraie réponse.
4. FonctionnalitĂ©s implĂ©mentĂ©es¶
- Renseignement : CSV, JSON, texte, STIX 2.1, TAXII 2.1 (
taxii2-clientdurci), OTX ; normalisation, déduplication, provenance multi-sources, expiration par type ; sondessentry feeds probeetsentry taxii discover. - Vulnérabilités : NVD 2.0 incrémental (filtre
hasKevĂ la premiĂšre synchro), KEV, EPSS, score composite 0â100, prioritĂ©s P0âP3, historique, alertes + webhook. - RĂ©ponse : machine d'Ă©tat NIST SP 800-61, assignation, notes, liens IOC/CVE, ouverture depuis une alerte (idempotente), post-mortem obligatoire, chronologie immuable.
- Pilotage : synthÚse temps réel, activité 24 h, MTTR, exports CSV/JSON en flux.
- Chasse : 6 rÚgles, deux modes, sessions enregistrées, chasse planifiée.
- Sécurité transverse : JWT + Argon2id, RBAC 3 rÎles, anti-SSRF, secrets hors base, limitation des connexions, anti-injection CSV.
5. Tests et couverture¶
| Environnement | Python | SQLAlchemy | Résultat |
|---|---|---|---|
| Identique au job GitLab (dĂ©pendances les plus rĂ©centes) | 3.12.3 | 2.1.3 | 388 â , 4 ignorĂ©s, 94 % |
| Matrice GitLab 3.14 | 3.14.7 | 2.1.1 | 388 â , 4 ignorĂ©s, 93 % |
| Simulation du poste Kali | 3.12.3 | 2.0.54 | mypy â sur main â â
aprĂšs correctif ; 388 â
|
Les 4 tests ignorés sont les tests réseau réels (SENTRY_LIVE_TESTS=1), à lancer sur Kali.
Nouveau test d'acceptation : scripts/scenario_soc.py rejoue le parcours SOC complet contre
une instance réelle et mesure les latences. Résultat : 40/40.
6. CI/CD¶
Le pipeline GitLab (qualitĂ© â tests matrice 3.12/3.14 â migrations aller-retour â image Docker â
SAST, secrets, dépendances) est vert sur main d'aprÚs les MR fusionnées. Rejoué ici :
qualitĂ©, tests et migrations â
. Non rejouĂ© : construction de l'image (dĂ©mon Docker absent du bac Ă
sable) et analyses natives GitLab.
Risque identifié : les dépendances ne sont bornées que par le bas (>=). La CI installe la
derniÚre version publiée, le poste Kali une version antérieure : c'est exactement ce qui a produit
l'écart mypy du § 13. Correctif prévu en M7 (fichier de contraintes partagé CI/Docker/Kali).
7. SĂ©curitĂ©¶
| ContrÎle | Résultat |
|---|---|
pip-audit (dépendances installées) |
0 vulnérabilité connue |
bandit (code applicatif) |
0 haut, 0 moyen, 2 faibles (faux positifs documentés : sentinelle de clé refusée en production, libellé "access") |
Sans jeton / jeton altéré / alg=none |
401 / 401 / 401 â |
| RBAC : VIEWER crĂ©e un incident, lance une chasse ; ANALYST crĂ©e une source | 403 â |
SSRF : source vers 169.254.169.254 |
422 â
â rectifiĂ© le 04/10 : la premiĂšre version du scĂ©nario obtenait ce 422 pour une autre raison (type de flux en minuscules, schĂ©ma http). RejouĂ© avec une requĂȘte valide : refus par l'anti-SSRF confirmĂ© (« Adresse IP interne ou rĂ©servĂ©e interdite »). |
| Injection dans un identifiant de CVE | 422 â |
| Force brute : 6á” tentative | 429 â |
| CORS depuis une origine inconnue | refusĂ© (400) â |
| Secrets dans les journaux | aucun â |
UPDATE / DELETE sur la chronologie |
refusĂ©s par le dĂ©clencheur â |
TRUNCATE incident_events |
acceptĂ© â : un dĂ©clencheur de ligne ne voit pas TRUNCATE |
| PropriĂ©taire des tables = compte applicatif | â : ce compte peut aussi supprimer le dĂ©clencheur |
| Ports Compose | â : PostgreSQL (5433) et Redis (6379, sans mot de passe) Ă©coutent sur toutes les interfaces du poste |
| En-tĂȘtes de sĂ©curitĂ© HTTP | absents (HSTS, nosniff, frame-ancestors, no-store) |
| Verrouillage de compte | contournable en dĂ©ni de service : 5 Ă©checs depuis n'importe oĂč bloquent le vrai titulaire 15 min |
Les cinq lignes â deviennent le premier lot de M7.
8. Validation rĂ©elle â Threat Feeds (M2)¶
| Source | Résultat | Lus | Nouveaux | Cause si échec |
|---|---|---|---|---|
| IPsum niveau 5 | HEALTHY | 3 528 | 3 528 | â |
| C2IntelFeeds IP 30 j | HEALTHY | 252 | 252 | â |
| C2IntelFeeds domaines 30 j | HEALTHY | 89 | 87 | 2 doublons internes |
| abuse.ch Feodo | DEGRADED | â | â | proxy du bac Ă sable (403), pas la source |
| abuse.ch URLhaus | DEGRADED | â | â | ABUSECH_AUTH_KEY absente (attendu) |
| AlienVault OTX | DEGRADED | â | â | OTX_API_KEY absente (attendu) |
| RedEye TAXII | DEGRADED | â | â | proxy du bac Ă sable ; jeton absent |
| DigitalSide Ă2 | inactives | â | â | injoignables (constat du 29/09) |
- DĂ©duplication : seconde collecte d'IPsum â 0 nouveau, 3 528 mis Ă jour â .
- Provenance : chaque IOC expose sa source dans l'API â . Recouvrement entre sources : 0 (C2IntelFeeds et IPsum ne partagent aucune IP ce jour-lĂ ).
- Expiration : 3 867 / 3 867 actifs, attendu le jour mĂȘme de la collecte.
- Performance : collecte complÚte en 20 s, pic mémoire 111 Mo (cible 256 Mo).
- CritĂšres M2 : volume â , 3 sources â , OTX â, STIX â â non atteint ici, atteignable sur Kali avec la clĂ© OTX et le jeton RedEye.
9. Validation rĂ©elle â CVE (M3)¶
- KEV : catalogue officiel
2026.10.02, 1 733 entrĂ©es, importĂ© en 3 s via le dĂ©pĂŽt GitHubcisagov/kev-data(mĂȘmes donnĂ©es que cisa.gov, inaccessible depuis le bac Ă sable) ; le nouveau champforensicTriageest tolĂ©rĂ© â . - NVD, EPSS : non joignables depuis le bac Ă sable. Ă constater sur Kali (
sentry cves sync). - Observation de scoring : sans CVSS ni EPSS, une CVE KEV liĂ©e au ransomware vaut 35 â P3.
Situation transitoire (la premiÚre synchro NVD récupÚre toutes les CVE KEV via
hasKev), mais elle devient durable si ce filtre Ă©choue. Proposition pour M8, Ă trancher par ADR : plancher « KEV â au moins P1 », cohĂ©rent avec les dĂ©lais de la directive CISA BOD 22-01.
10. Incident Management (M4)¶
Parcours rĂ©el : ouverture (ANALYST) â assignation â liaison d'un IOC IPsum et d'une CVE KEV â NOUVEAUâCLOTURE refusĂ© (409) â ANALYSE â CONFINEMENT â ERADICATION â RECUPERATION â note d'un second analyste â clĂŽture sans post-mortem refusĂ©e (422) â clĂŽture avec post-mortem. Chronologie : 10 Ă©vĂšnements. Latence mĂ©diane des appels incidents : 11,5 ms.
11. SOC Dashboard (M5)¶
SynthÚse 28 ms, activité récente 200 évÚnements, 8 exports valides (IOC CSV 654 Ko en 190 ms, CVE CSV 660 Ko en 105 ms). Fonctionnel techniquement ; pas encore une console SOC : ni série temporelle, ni file de triage, ni vue par analyste. Ces manques relÚvent de M9.
12. Threat Hunting (M6)¶
- Sur observables (IOC réel, domaine
duckdns.org, domaine aléatoire, IP propre, valeur invalide) : 3 correspondances (RULE-02, RULE-03, RULE-06), 1 rejet, 12 ms. - Sur la base complÚte (3 867 IOC) : 27 ms, 1 correspondance.
- RULE-01 (Tor) non testée ici : liste torproject.org bloquée par le bac à sable.
13. Dette technique¶
| # | Dette | Gravité | Traitement |
|---|---|---|---|
| D1 | mypy Ă©choue avec SQLAlchemy 2.0 (Select[Any, Any]) â cause du stash local du 03/10 |
Moyenne | corrigé dans release/v0.1.1 (annotation Executable, valide en 2.0 et 2.1) |
| D2 | Dépendances non verrouillées | Moyenne | M7 |
| D3 | Pas de test d'acceptation en CI (le scénario exige des données réelles) | Moyenne | M7/M11 : jeu de données figé + job dédié |
| D4 | Image Docker jamais construite hors GitLab | Faible | job GitLab existant |
| D5 | Heuristique DGA non calibrée sur corpus | Faible | M8 |
| D6 | RULE-05 par mots-clés, sans CPE | Faible | M8 |
| D7 | Six branches locales obsolĂštes, trois stash |
Faible | nettoyage (§ 16) |
14. Risques restants¶
| Risque | Niveau | Parade |
|---|---|---|
Altération de la chronologie par TRUNCATE ou par le propriétaire des tables |
ĂlevĂ© pour un usage probatoire | M7 lot 1 |
| Redis/PostgreSQL exposés sur le réseau local du poste Kali | Moyen | M7 lot 1 |
| Dérive des dépendances entre poste et CI | Moyen | M7 lot 1 |
| NVD/EPSS jamais éprouvés en réel | Moyen | sentry cves sync sur Kali cette semaine |
| Une seule source STIX, sous jeton | Moyen | jeton RedEye ; budget CrowdSec à évaluer |
| Verrouillage de compte exploitable en déni de service | Faible | M7 lot 1 |
15. Feuille de route¶
| Ătape | Objectif | Ătat |
|---|---|---|
| M1âM6 | Socle fonctionnel | â
intégré dans main |
| Audit global | Validation M1âM6 | â ce rapport |
v0.1.1 |
Baseline stable | âł fusion de release/v0.1.1, puis tag |
| M7 | Production Hardening | đ lot 1 sur feature/m7-production-hardening |
| M8 | Detection & Correlation | âł |
| M9 | SOC Operations (triage L1/L2/L3) | âł |
| M10 | CTI Intelligence (acteurs, campagnes, ATT&CK) | âł |
| M11 | Observability & Deployment | âł |
v0.2.0 |
Production Candidate | âł |
Détail et critÚres de sortie : docs/ROADMAP.md.
16. Prochaine phase â actions dans l'ordre¶
- Fusionner
release/v0.1.1âmain(MR, pipeline vert). VĂ©rification :mypy sentrypasse sur Kali sans lestash. - Taguer :
git tag -a v0.1.1 -m "SENTRY M1-M6 integrated baseline" && git push origin v0.1.1. - Constater M2/M3 sur Kali : clés OTX, NVD, jeton RedEye dans
.env, puissentry feeds fetch-all && sentry cves sync && sentry status. VĂ©rification : M2 et M3 â . - Rejouer le scĂ©nario sur Kali :
python scripts/scenario_soc.pyâ 40/40. - Nettoyer :
git stash dropĂ3 (contenu intĂ©grĂ© ou corrigĂ©), supprimer les branches locales fusionnĂ©es (git branch --merged main). - Fusionner
feature/m7-production-hardening(lot 1) aprĂšs revue.
17. Mise Ă jour du 04/10/2026¶
M7 lots 1 et 2 sont codés et vérifiés sur feature/m7-production-hardening (bilans
BILAN_M7_LOT1.md, BILAN_M7_LOT2.md). Les Ă©carts â du § 7 sont fermĂ©s, y compris la limite
« le propriétaire des tables peut supprimer un déclencheur » : l'application se connecte
désormais avec un rÎle sans droit de structure.
| Ligne du § 3 | Avant | AprÚs le 04/10 |
|---|---|---|
| M3 INTĂGRĂ | â (KEV seul) | â+ : KEV rĂ©el + CVSS NVD rĂ©el des 1 733 CVE KEV (import hors ligne) ; EPSS toujours Ă constater |
| M6 INTĂGRĂ | RULE-01 non testĂ©e | RULE-01 validĂ©e sur 1 746 relais Tor rĂ©els |
| Image Docker | jamais construite hors GitLab | construite et exécutée en production (base de substitution) |
Nouveau constat (§ 4 du bilan du lot 2) : sans EPSS, aucune CVE ne peut ĂȘtre P0. Ă traiter par ADR en M8.
18. Mise Ă jour du 04/10/2026 (rĂ©exĂ©cution complĂšte, M7 lot 3)¶
Tout le processus a été rejoué depuis des bases vierges (Rapport/BILAN_M7_LOT3.md). Sept
erreurs ont été trouvées et corrigées, dont deux sérieuses : un journal d'audit rendu muet par
une migration exĂ©cutĂ©e dans le mĂȘme processus, et une remise Ă zĂ©ro des tests qui faisait tomber
toute la suite au changement de branche. Le contrÎle SSRF du scénario initial n'était pas
probant ; le § 7 est rectifié et le refus par l'anti-SSRF confirmé.
M7 (lots 1 à 3) est codé : TLS par Caddy, migrations isolées, analyse d'image, entretien quotidien. CritÚre de sortie restant : préproduction sur VPS UE.
| Mesure | 03/10 | 04/10 |
|---|---|---|
| Tests (baseline / M7) | 388 / 410 | 388 / 437 |
| Scénario (baseline / M7) | 40 / 44 | 40 / 48, rejouables |
| Jalons opérationnels | 1 / 6 | 1 / 6 (M2, M3 attendent les clés sur Kali) |