Cortex¶
Rôle¶
Moteur d'analyse et d'enrichissement (analyzers/responders) pour les observables, appelé en API par TheHive. Peut à terme s'appuyer sur des flux MISP selon les analyzers configurés.
État réel : VM nue, rien d'installé
La VM INDSOC021 existe (provisionnée par Terraform + configuration de
base /root/baseline) mais aucune application Cortex n'y est
installée au moment de la rédaction. L'exploitant a demandé une
reconstruction en VM nue le 2026-07-14 pour une installation manuelle
qu'il compte réaliser lui-même — voir « Points d'attention » pour le
contexte complet. Ne pas présenter ni supposer ce composant comme
opérationnel sur la seule base du code Ansible ci-dessous.
Architecture¶
VM unique Rocky 9.6 durci (tmpl-rocky96-hardened), segment seg-soc.
| Documenté (README/MANUEL_INSTALLATION, périmé) | Réel (Terraform/inventaire actuel) | |
|---|---|---|
| Hostname | INDSOC003 | INDSOC021 |
| IP | 10.100.20.132 | 10.100.20.150 |
Le README Ansible et MANUEL_INSTALLATION.md décrivent encore l'itération
précédente (INDSOC003). Source de vérité actuelle : ansible/inventory.ini
et variables.tf (INDSOC021 / 10.100.20.150) — voir
Historique des décommissionnements.
- Cortex 4.1.0, image Docker
thehiveproject/cortex(le namespacestrangebee/cortexévoqué initialement n'existe pas sur Docker Hub — StrangeBee n'a pas migré ce paquet), conteneur ennetwork_mode: host. - Elasticsearch 8.11.3 en conteneur local dédié, seul datastore de
Cortex (jobs, rapports d'analyse) — distinct de celui de TheHive et du
cluster ELK du SOC.
xpack.securitydésactivé (instance loopback-only, jamais exposée). - Exécution des jobs en mode
processuniquement (pas de containerisation des analyzers pour ce socle initial). - Aucun analyzer/responder configuré par cette automatisation
(
analyzer.urls/responder.urlsvides) — à ajouter manuellement (VirusTotal, AbuseIPDB, etc.) une fois le socle opérationnel.
Intégrations prévues (non actives — voir avertissement ci-dessus)¶
flowchart LR
TheHive["TheHive -- INDSOC020<br/>10.100.20.149"]
Cortex["Cortex -- INDSOC021<br/>10.100.20.150<br/>port 9001, VM nue"]
External["Analyzers tiers<br/>VirusTotal, AbuseIPDB, ...<br/>aucun configure"]
TheHive -.->|"analyse observables<br/>API :9001, prevu, non actif"| Cortex
Cortex -.->|"non configure"| External
classDef planned stroke-dasharray: 4 4
class TheHive,Cortex,External planned
Traits pointillés : aucune de ces intégrations n'existe aujourd'hui — la VM est nue, et même une fois Cortex installé, aucun analyzer tiers n'est préconfiguré par cette automatisation.
Provisioning Terraform¶
Fichiers : main.tf, variables.tf, versions.tf, terraform.tfvars.example.
- VM unique (
vsphere_virtual_machine.cortex), 2 vCPU / 4096 Mo RAM par défaut,vm_namepar défautINDSOC021, réseauseg-soc, réservation IP via NetBox.
Configuration Ansible¶
site.yml orchestre 3 rôles dans l'ordre : docker, elasticsearch
(conteneur local), cortex.
- Les 2 conteneurs (Elasticsearch, Cortex) tournent en
network_mode: host— même raison que TheHive : évite un piège de résolution d'adresse « publish » en mode bridge qui bloque le thread event-loop Vert.x jusqu'au crash. - JVM : options
-Ddédiées pour forcer IPv4 (java.net.preferIPv4Stack=true) et le proxy sortant — cause identifiée d'un crash-loop antérieur (résolution IPv6 qui ne timeout jamais proprement dans cet environnement). - Secret applicatif (
play.http.secret.key) chiffré ansible-vault, déchiffrement via/root/.cortex_vault_pass— voir Gestion des secrets.
Procédure de déploiement¶
cd /root/cortex/ansible
ansible-galaxy collection install -r requirements.yml
ansible-playbook --syntax-check site.yml
ansible-playbook site.yml -e @/root/.hap_secrets.yml
Prérequis réseau à vérifier avant déploiement : le flux TheHive
(INDSOC020) → Cortex (port 9001) doit être autorisé par la DFW deny-all
scopée de seg-soc (seule la règle de sortie proxy est confirmée en place
à ce jour — voir /root/nsx/dfw_soc.tf).
Actions manuelles obligatoires après déploiement :
- Création du compte superadmin au tout premier accès web
(
https://<ip>:9001/). - Création d'une organisation + d'un utilisateur de type « key » dédié à TheHive, puis génération de sa clé API.
- Report de cette clé dans
group_vars/thehive.yml(thehive_cortex_api_key) côté projet TheHive, puis relance du playbook TheHive. - Configuration des analyzers/responders nécessaires (clés API tierces : VirusTotal, AbuseIPDB, etc.).
Points d'attention¶
Contexte : VM redéployée nue, installation manuelle prévue
Comme MISP et TheHive, ce rôle a été débogué en profondeur (plusieurs
pièges documentés dans le code, voir ci-dessous) puis la VM a été
entièrement redéployée nue à la demande de l'exploitant, qui prévoit
une installation manuelle. Le code reste conservé sur GitLab pour
référence ; le README du projet confirme qu'il n'a jamais été exécuté
réellement (validation --syntax-check uniquement, aucune connexion
SSH, aucun conteneur démarré). Ne pas supposer Cortex opérationnel sur
la base de ce seul code.
- Pièges de configuration documentés dans le code (2026-07-14), à relire
avant toute tentative d'exécution réelle : mot-clé Ansible
env:du moduledocker_container(et nonenvironment:) pour configurer l'intérieur du conteneur ; clé de configuration réellejob.runners(pluriel —job.runnerau singulier est silencieusement ignorée et laisse actif un runner Kubernetes par défaut qui bloque le thread Vert.x) ; l'option-Dconfig.filen'est pas reconnue par l'entrypoint de l'image (le fichier monté à l'emplacement par défaut suffit) ; ne pas monter/var/run/docker.socktant qu'aucun analyzer dockerisé n'est ajouté. - Aucun analyzer/responder actif par défaut : Cortex démarre « vide », les clés API tierces sont à configurer manuellement dans l'UI une fois le socle opérationnel.