📊 SENTRY — Rapport d'avancement [Semaine 03/9 — complément du 06/10, soirée]¶
Date : 06/10/2026 · Auteur : Godwill FOKA (assisté par Claude) · Jalon cible : M2 constaté en CI, clôture de M7
Ce rapport complète 03_06-10-2026.md, rédigé le matin même.
1. Résumé exécutif¶
Un clone neuf sur le poste Kali a révélé quatre défauts invisibles en CI, dont un risque
majeur : avec le .env de développement en place, scripts/ci-local.sh aurait vidé la base de
travail (alembic downgrade base envoyé sur la mauvaise base). Les correctifs sont fusionnés dans
main (595d425), avec 444 tests verts en CI. Les quatre clés externes (OTX, NVD, abuse.ch,
RedEye) sont configurées : le jalon M2 est atteint pour la première fois, en local et en CI
(validation réelle : scénario SOC 48/48, 7 sources saines, 67 495 IOC). Trois défauts de la
collecte OTX sont identifiés ; leur correctif est la première tâche de la prochaine session.
2. Détail technique des tâches traitées¶
- [x] Installation sur Kali depuis un clone neuf — démarrage rapide du README suivi pas à pas :
.env.examplecopié tel quel, PostgreSQL et Redis (Docker Compose), migrations, rôle applicatif, comptes, API, scénario SOC. Volume PostgreSQL antérieur à M7 réutilisé : rôlesentry_appcréé avecsentry db app-role sentry_app --create. - [x] Branche
fix/clone-neuf(commit595d425, 14 fichiers, +271 / −17) : - tests et
ci-local.shisolés du.env(nouvelle variableSENTRY_ENV_FILE) ; la suite refuse uneMIGRATION_DATABASE_URLqui ne vise pas une base_test; - variable vide = valeur par défaut (
env_ignore_empty) :.env.exampledémarre tel quel ; - nouvelle commande
sentry users set-password(politique ≥ 12 caractères, sessions révoquées,user.password_resetau journal d'audit) ; sentry db initdistingue « migration ratée » et « rôle applicatif manquant » ;- scénario SOC : arrêt explicite (code 2) sur API injoignable, comptes absents ou base vide ;
- critère M3 renommé « Alerting : ligne de base établie » ;
- CI : étape « clone neuf » (
.env.exampleen place pendant les tests) ; guide d'exploitation (§ 1 bis, 3 bis, 7 bis) et CHANGELOG. - [x] Fusion et synchronisation — avance rapide de
mainsur GitHub et GitLab ; GitLab rattraperelease/v0.1.1et le tagv0.1.1; six branches déjà fusionnées supprimées de GitLab (dette D7 côté GitLab). - [x] Clés externes —
OTX_API_KEY,NVD_API_KEY,ABUSECH_AUTH_KEY,TAXII_AUTH(RedEye et DigitalSide) dans le.envdu poste et dans les secrets GitHub Actions. - [x] Validation réelle lancée à la demande avec les secrets (run du 06/10, 22:40) : verte.
- [x] Rattrapage OTX — tentative de collecte complète (200 pages) échouée après 17 min ; source remise en état (HEALTHY, curseur reposé).
- [ ] Correctifs de collecte (curseur OTX, enregistrement page par page, message NVD) — prochaine session.
- [ ] ADR-014 et préproduction VPS UE — inchangés depuis le matin.
3. Validation sur données réelles¶
| Mesure | Poste Kali (local) | GitHub Actions (CI) |
|---|---|---|
| Scénario SOC d'acceptation | 48 / 48 | 48 / 48 |
| Sources saines | 7 / 9 | 7 / 9 |
| IOC collectés | 67 489 (759 confirmés par ≥ 2 sources) | 67 495 |
| OTX (20 pages) | 29 245 IOC | 29 245 IOC |
| URLhaus | 31 168 URL | 31 174 URL |
| RedEye (TAXII 2.1) | 2 606 IOC (1 640 plages CIDR rejetées) | 2 606 IOC |
| CVE | 25 700 (KEV 1 734) | 9 433 (KEV 1 734) |
| Couverture EPSS | 98 % | 94 % |
| Priorités P0 / P1 / P2 / P3 | 495 / 627 / 636 / 23 942 | 495 / 627 / 617 / 7 694 |
| Chasse sur la base complète | — | 56 062 IOC, 336 correspondances, 1,2 s |
Jalons constatés par sentry status :
| Jalon | Local | CI | Détail |
|---|---|---|---|
| M1 Foundation | ✅ | ✅ | schéma, API, rôles, audit |
| M2 Threat Feeds | ✅ | ✅ | ≥ 500 IOC ✔, ≥ 3 sources ✔, OTX ✔, STIX ✔ — première fois |
| M3 Moteur CVE | ✅ | ✅ | NVD < 24 h, KEV ≥ 1 000, EPSS ≥ 90 %, ligne de base d'alerte |
| M4 Incidents | ✅ | ✅ | incident clos, 5 transitions tracées |
| M5 Dashboard | ✅ | ✅ | synthèse, activité, 8 exports (scénario) |
| M6 Hunting | ✅ | ✅ | 2 sessions ; 339 correspondances en CI |
4. Analyse SWOT de la journée¶
- Forces : M2 à M6 constatés en CI sur données réelles ; installation reproductible depuis un clone neuf ; la chasse produit enfin des résultats significatifs (339 correspondances contre 4) ; 759 IOC confirmés par plusieurs sources, base de la corrélation M8.
- Faiblesses : collecte « tout ou rien » (une page en échec annule la collecte entière) ; curseur OTX qui avance malgré une troncature ; pas de type « plage réseau » (CIDR rejetés).
- Opportunités : la validation hebdomadaire couvre désormais M2 ; les exports tiennent en CI
(IOC : 3,5 s pour 67 000 lignes ; CVE : 0,7 s) ;
set-passwordcomble un manque d'exploitation. - Menaces : sources publiques volatiles (DigitalSide toujours hors ligne, OTX lent sur les pages anciennes) ; volume d'IOC multiplié par 15 en une soirée, à surveiller avant la préproduction.
5. Problèmes rencontrés et solutions¶
| Blocage | Impact | Solution adoptée | Statut |
|---|---|---|---|
DOCS_ENABLED= et HSTS_ENABLED= vides dans .env.example |
Application, tests et CLI ne démarrent pas | Variable vide = valeur par défaut | Résolu (595d425) |
Les tests lisent le .env du poste |
12 tests en échec en local | SENTRY_ENV_FILE= dans les tests et ci-local.sh |
Résolu |
MIGRATION_DATABASE_URL du .env vise la base de travail |
ci-local.sh aurait vidé la base de travail |
Isolation + garde-fou _test sur cette variable |
Résolu |
Rôle sentry_app absent (volume d'avant M7) |
password authentication failed partout |
sentry db app-role sentry_app --create ; message clarifié |
Résolu |
Compte admin hérité, mot de passe inconnu |
Scénario en 401 | Hash remplacé en SQL ; commande set-password ajoutée |
Résolu |
| Scénario sur base vide | Trace IndexError |
Arrêt explicite avec l'action à mener | Résolu |
| DNS de la VM momentanément indisponible | NVD et EPSS non synchronisés | Nouvelle tentative | Contourné |
| EPSS synchronisé avant NVD | Couverture 83 % | Synchronisation complète dans l'ordre KEV → NVD → EPSS | Résolu |
| Collecte OTX tronquée à 20 pages | Curseur avancé, pulses anciens perdus | Correctif à venir (curseur gelé si tronqué) | Ouvert |
Collecte OTX de 200 pages : ReadTimeout après 17 min |
Toute la collecte annulée | Correctif à venir (enregistrement page par page) | Ouvert |
| « NVD sans clé » affiché même avec une clé | Diagnostic trompeur | Message conforme à la configuration | Ouvert |
TAXII_AUTH en double dans .env |
Fonctionnement fragile | Doublon supprimé | Résolu |
| 1 640 plages CIDR RedEye rejetées | Information perdue | Type « réseau » au backlog M8 | Suivi |
6. Métriques qualité¶
| Indicateur | Valeur | Seuil |
|---|---|---|
Couverture pytest (CI) |
94 % (3.12) · 93 % (3.14) | ≥ 80 % |
Tests passants (CI, .env.example en place) |
444 / 444 (+ 4 réseau) | 100 % |
Tests passants (Kali, .env en place) |
442 / 442 (6 ignorés) | 100 % |
Conformité ruff |
OK (181 fichiers) | 100 % |
mypy --strict |
OK (78 fichiers) | 0 erreur |
| Scénario SOC sur données réelles | 48 / 48 (local et CI) | 100 % |
Commits fusionnés dans main (soirée) |
1 (595d425) |
— |
| Nouveaux tests | 6 | — |
7. Prochaine session¶
- Correctifs de collecte : curseur OTX gelé si la collecte est tronquée, enregistrement page par page au lieu du tout-ou-rien, message NVD conforme à la configuration.
- Trancher l'ADR-014 (recommandation A + B + C) : sans EPSS, 0 CVE en P0 ; avec, 495.
- Préproduction VPS UE avec l'image publiée, SSL Labs ≥ A, 7 jours de collecte → clôture de M7.
- Ouvrir M8 « Detection & Correlation », avec au backlog le type « plage réseau » (CIDR) et l'export en flux.