Repository navigation
Releases: GodwillFoka/cyberillsec-illwatch
Release list
SENTRY v0.1.1
Corrigé
mypy --strictéchouait avec SQLAlchemy 2.0 (Selectà deux paramètres de type, valide
seulement en 2.1) : annotationExecutable, valide sur les deux versions.
Ajouté
scripts/scenario_soc.py: test d'acceptation SOC de bout en bout contre une instance réelle
(40 vérifications, latences mesurées).Rapport/ETAT_GLOBAL_SENTRY_2026-10-03.md: audit global demain(Git, CI, migrations,
validation réelle M2–M6, sécurité, dette, risques).docs/ROADMAP.md: trajectoire M7 → M11 et critères de sortie.
Ajouté — Phase 6 (v1.0 « Threat Hunting »)
- Moteur de règles déterministe, catalogue RULE-01 à RULE-06 (Tor, DNS dynamique, DGA,
ransomware, CVE exploitables sur l'inventaire, IOC connu) ; chasse sur observables soumis ou sur
la base ; sessions et correspondances enregistrées ; chasse planifiée par le worker. - API
/api/v1/hunting/rules|sessions; CLIsentry hunt rules|run|show. ADR-009.
Ajouté — Phase 5 (M5 « Dashboard & reporting »)
/api/v1/dashboard/summary|recent|export;sentry dashboard show|export; MTTR ; exports
CSV RFC 4180 / JSON RFC 8259 diffusés en flux, protégés contre l'injection CSV.
Ajouté — Phase 4 (M4 « Gestion des incidents »)
- Service, API
/api/v1/incidentset CLIsentry incidents; chronologie immuable (ORM et
déclencheur PostgreSQL) ; liens IOC/CVE ; incident ouvert depuis une alerte CVE. ADR-008.
Ajouté — TAXII 2.1 réel et sources vérifiées
- Backend
taxii2-client2.3.0 durci (SSRF, redirections refusées, délai, taille, erreurs
typées), Basic / Bearer / en-tête par hôte,TAXII_CLIENT=library|builtin. ADR-010. sentry taxii discover,sentry feeds probe,sentry feeds enable|disable.- Seed vérifié : IPsum (sans clé), RedEye TAXII (jeton gratuit) ; DigitalSide injoignable → inactif.
- Tests réseau réels opt-in (
SENTRY_LIVE_TESTS=1).
Sécurité
- Limitation des tentatives de connexion (compte et adresse IP, Redis partagé, repli mémoire).
.dockerignore: contexte de build sans.env,.gitni environnement virtuel.
Corrigé
- Bundles Git (≈ 480 Ko) versionnés par erreur : retirés et ignorés.
- Numéros d'exigence RF-15 / RF-16 du moteur CVE.
Ajouté — Phase 3 (M3 « Moteur CVE & alerting »)
- NVD 2.0 : synchronisation initiale (catalogue KEV + CVE modifiées depuis
NVD_INITIAL_DAYS) puis incrémentale (fenêtreslastModStartDatede 120 j, curseur en base),
pagination, débit respecté (6 s sans clé, 0,6 s avecNVD_API_KEY). CVSS v3.1 → v3.0 → v4.0 ;
exploit public déduit des références NVD ; CVE rejetées ignorées. - CISA KEV (ransomware, échéance, action requise ; retraits appliqués) et FIRST EPSS
(score + percentile, lots de 100). - Recalcul du score composite et de la priorité à chaque changement ; historique
cve_priority_history; migration5d7ee876e4ef. - API :
GET /api/v1/cves,GET /api/v1/cves/{id}(décomposition du score, historique),
GET /api/v1/alerts,POST /api/v1/alerts/{id}/ack. - Alertes au franchissement de
RISK_ALERT_THRESHOLD(ligne de base sans alerte à la
première synchro), webhookALERT_WEBHOOK_URL, 5 tentatives. - CLI
sentry cves sync | list | show | alerts; le worker synchronise les CVE toutes les
CVE_SYNC_INTERVAL_SECONDS;sentry statusaffiche les critères M3. - ADR-007.
Ajouté — Clôture M2 (branche feature/sprint3-m2)
- TAXII 2.1 (tâche 1.8) : format
TAXII, paginationmore/next,added_after,
identifiants par hôteTAXII_AUTH(accès invité DigitalSide par défaut). sentry seed: sources publiques sans clé (C2IntelFeeds IP et domaines, DigitalSide URL et
TAXII) ; 3 sources saines et ≥ 500 IOC atteignables sans inscription.
Corrigé — Clôture M2
- CSV : la colonne IOC est choisie sur le contenu. C2IntelFeeds (
#ip,ioc) était rejeté à
100 % car la colonneioccontient un libellé.
Ajouté — Sprint 3 (M2 « Ingestion opérationnelle », branche feature/sprint3-ingestion)
- Provenance multi-sources (ADR-006) : table
indicator_sources(migration1f3dafc3008c,
reprise de l'existant).GET /api/v1/indicators/{id}renvoiesources(flux, dates et
compteur par source) ; la liste exposesource_count; le filtrefeed_idcouvre toutes les
sources.sentry statuscompte les IOC confirmés par au moins deux flux. - T2.9 — Connecteur AlienVault OTX : format de flux
OTX, pulses abonnés paginés,
modified_sinceincrémental, plafondOTX_MAX_PAGES. CléOTX_API_KEYen en-tête, envoyée
uniquement àotx.alienvault.com(refus 422 à l'enregistrement d'un flux OTX ailleurs).
Source OTX ajoutée àsentry seed. - T2.6 — Planificateur :
sentry feeds workeret serviceworkerdans Docker Compose
(profilfull). Verrou Redis par flux, aussi utilisé parfetchetfetch-all. - Journal JSON (UC-01 étape 8) : une ligne
feed.collectedpar collecte (volumes, durée,
erreur, avertissement, pic mémoirepeak_rss_mb),worker.cyclepar cycle. - Fetcher : en-têtes d'authentification jamais transmis lors d'une redirection vers un autre hôte.
- Test de conformité des contraintes CHECK après migration (non couvert par
alembic check).
Ajouté
-
sentry status: avancement mesuré en base (schéma, santé des sources, IOC actifs/expirés
par type, critères du jalon M2 cochés ou non). -
Pipeline : tests exécutés sous Python 3.12 et 3.14.
-
T2.3 — Collecteur de flux (UC-01) : récupération HTTP sécurisée (revalidation de l'URL,
résolution DNS avec refus de toute adresse interne, redirections revalidées une à une, taille
plafonnée parFEED_MAX_BYTES), backoff exponentiel sur erreurs réseau et 5xx, report au cycle
suivant sur HTTP 429. Analyseurs CSV (en-têtes commentés abuse.ch), JSON et STIX 2.1. Chaque
flux est isolé : un échec passe le flux enDEGRADEDsans bloquer les autres (RSK-02). -
T2.7 — CLI
sentry feeds:list,add,fetch <nom|id>,fetch-all [--force]. Code de
sortie non nul si une collecte échoue (planification cron / timer systemd). -
T2.2 — CRUD des sources de flux (RF-04) :
GET/POST /api/v1/feeds,
GET/PATCH/DELETE /api/v1/feeds/{id}. Lecture pour tous les rôles authentifiés, écriture
réservée auxADMIN. Liste paginée (limit≤ 200,offset) et filtrable (is_active,
status,feed_type), triée par nom. -
Service
sentry/modules/threat_feeds/service.py, partagé par l'API et la future CLI (T2.7) :
noms uniques sans tenir compte de la casse (409), URL de flux validée contre le SSRF (HTTPS
uniquement, pas d'identifiants, pas d'IP interne ni de nom local, formes numériques ambiguës
refusées), retour àPENDINGquand l'URL ou le format change. -
IOC (RF-07, RF-08, ADR-005) :
POST /api/v1/indicators(ingestion d'un lot de 1 000 IOC
au plus, rôlesADMINetANALYST),GET /api/v1/indicators(filtrestype,severity,
min_severity,feed_id,active,value) etGET /api/v1/indicators/{id}. Déduplication
parINSERT … ON CONFLICT DO UPDATE:hit_count,first_seen/last_seen, sévérité maximale
etexpires_atmis à jour selon l'ADR-005. RNF-PERF-02 vérifié (1 000 IOC < 5 s). -
Normalisation des IOC étendue : formes désamorcées (
hxxps://,[.]), point final DNS,
schéma et hôte d'URL en minuscules, port par défaut et fragment retirés, IP canonisées. -
Tests d'intégrité du schéma : contraintes CHECK,
expires_at,ON DELETE SET NULL, et
comparaison des CHECK entre modèle et base (non couverte paralembic check).
Corrigé
- SSRF : la détection d'adresses internes reposait sur
is_private, qui ignore
100.64.0.0/10 (CGNAT, métadonnées Alibaba Cloud en 100.100.100.200) et les adresses IPv4
embarquées dans de l'IPv6 (NAT6464:ff9b::/96, 6to4). Seules les adresses publiques
(is_global) sont désormais admises. - Détail des erreurs de collecte (
last_error) réservé aux ADMIN : il peut citer une adresse
interne refusée. fetch-allvalidait tous les flux en une seule transaction : un arrêt en cours de cycle perdait
tout. Validation après chaque flux.- Erreurs de protocole HTTP (connexion coupée) désormais retentées ; contenu corrompu signalé
proprement au lieu d'une « erreur inattendue ». - Liste des rejets d'ingestion bornée à 100 exemples (compteur exact conservé) : mémoire bornée
face à un flux corrompu. - Lecture d'un flux ou d'un IOC : rechargement systématique depuis la base (plantage possible sur
un objet modifié plus tôt dans la même session). - Flux URLhaus inutilisable : abuse.ch exige désormais une clé (
Auth-Key) dans l'URL de
téléchargement ; l'ancienne URL semée parsentry seedéchouait. La base stocke un gabarit
(…/exports/{ABUSECH_AUTH_KEY}/recent.csv), la clé est lue dans.envau moment de la requête
et masquée dans tous les messages d'erreur.sentry seedcorrige l'ancienne URL. - Échantillon Feodo aligné sur le format réel (en-tête CSV entre guillemets, non commenté).
- Protection des données de travail : la documentation faisait lancer
pytestsur la base
de travail, alors que les tests de migration en suppriment tout le schéma. La suite refuse
désormais toute base PostgreSQL dont le nom ne finit pas par_test, et repart d'un schéma
neuf à chaque session (une base de tests restée sur un ancien schéma faisait échouer la suite). - Pipeline GitLab : il ne tournait que sur
main, les tags et les merge requests ; un push
de branche de fonctionnalité n'était jamais testé. Ajout des pipelines de branche (sans
doublon avec les merge requests) et d'un jobmigrations(montée,alembic check, descente,
remontée sur base vierge). - Script
scripts/ci-local.sh: réplique locale du pipeline, à lancer avant chaque push. - Migration
a4973a3782e3: import inutilisé retiré (aucun effet sur le schéma). - Modèle désynchronisé de la migration
a4973a3782e3:Indicator.expires_atet les quatre
contraintes CHECK n'étaient déclarés que dans la migration....