L'intégration est open source et publiée sur GitHub : Q-Feeds/Q-Feeds-Wazuh-Integration. Récupérez-la toujours là, vous êtes ainsi certain d'avoir la version actuelle. Il vous faut un accès root sur le manager Wazuh, un HTTPS sortant vers api.qfeeds.com ou taxii.qfeeds.com, et un jeton API Q-Feeds ou des identifiants TAXII. Voir Obtenir vos threat feeds.
Prérequis
- Manager Wazuh : 4.x ou plus récent, installé dans
/var/ossec - Droits : root sur le manager
- Paquets :
curl. Python est livré avec Wazuh, dans/var/ossec/framework/python/bin/python3, vous n'avez donc rien à installer - Identifiants : un jeton API Q-Feeds pour le mode standard, ou un nom d'utilisateur et un mot de passe TAXII pour le mode TAXII
- Réseau : accès sortant vers
api.qfeeds.comoutaxii.qfeeds.comsur le port 443
Récupérer les scripts
git clone https://github.com/Q-Feeds/Q-Feeds-Wazuh-Integration.git /tmp/qfeeds-wazuh
cd /tmp/qfeeds-wazuh
Pas de git sur le manager ? Téléchargez plutôt l'archive :
curl -sL https://github.com/Q-Feeds/Q-Feeds-Wazuh-Integration/archive/refs/heads/main.tar.gz | tar xz -C /tmp
cd /tmp/Q-Feeds-Wazuh-Integration-main
Installer
sudo bash install.sh
L'installateur pose quelques questions, écrit la configuration, met en place le script de mise à jour, les décodeurs, les règles et une tâche cron, puis télécharge les flux une première fois. Ce qu'il demande, dans l'ordre :
- Mode d'intégration : API standard ou TAXII 2.1.
- Identifiants : votre jeton API, ou vos nom d'utilisateur et mot de passe TAXII.
- Flux ou collections : ce que vous activez. En mode TAXII, l'installateur trouve la racine d'API et liste les collections disponibles.
- Ignorer les indicateurs expirés (TAXII uniquement) : passer les indicateurs dont la date
valid_untilest dépassée. - IPv6 (mode standard) : inclure les adresses IPv6 dans le flux d'IP.
- Active Response : bloquer les adresses IP détectées sur le pare-feu local, avec un délai que vous choisissez.
- Liste blanche d'IP : adresses qui ne doivent jamais déclencher d'alerte. Mettez-y vos propres adresses d'administration.
- Planification cron : toutes les 20 minutes en mode standard, une fois par jour à une heure aléatoire en mode TAXII. Les collections TAXII peuvent être volumineuses, les exécutions quotidiennes sont donc réparties entre les clients.
- Premier téléchargement (TAXII uniquement) : vous pouvez le sauter et laisser la première exécution cron faire le travail en arrière-plan.
Ce qui est installé
| Composant | Emplacement |
|---|---|
| Configuration | /etc/qfeeds/qfeeds_wazuh.conf |
| Script de mise à jour | /usr/local/bin/qfeeds-wazuh-updater.py |
| Décodeurs | /var/ossec/etc/decoders/qfeeds_decoders.xml |
| Règles | /var/ossec/etc/rules/qfeeds_rules.xml |
| Listes CDB | /var/ossec/etc/lists/qfeeds-* |
| Journal | /var/log/qfeeds_wazuh.log |
| Planification | crontab de root |
L'installateur ajoute aussi les références aux listes CDB, et si vous le souhaitez la configuration Active Response, dans /var/ossec/etc/ossec.conf. Ces blocs sont encadrés par des commentaires repères pour que le désinstallateur puisse les retirer proprement, et une sauvegarde du fichier d'origine est conservée.
Comment ça marche
- Cycle de mise à jour : le script demande d'abord à l'API si votre licence dispose de nouvelles données. Sinon, il s'arrête sans rien télécharger, c'est pourquoi une planification toutes les vingt minutes ne pèse pas.
- Listes CDB : les indicateurs sont écrits au format
key:valuede Wazuh. En mode standard la valeur reste vide, en mode TAXII elle contient le contexte issu de la description STIX, par exemplethreat=Trojan;category=Bot C&C. - Règles : les correspondances d'IP donnent 100200 et 100201, les domaines 100210 à 100213, les URL malveillantes 100220 et les hashs 100230 à 100232, toutes au niveau 10 dans le groupe de règles
qfeeds. - Décodeurs : le paquet ajoute un décodeur Unbound DNS, aux formats RFC5424 et RFC3164, ainsi que des décodeurs Sysmon qui découpent le champ combiné
Hashesen valeurs MD5, SHA-1 et SHA-256 distinctes. - CIDR : Wazuh compare les plages d'IP en notation pointée, seuls /8, /16, /24 et /32 sont donc pris en charge. Les autres longueurs de préfixe sont ignorées.
- URL malveillantes : chaque entrée est stockée deux fois, avec et sans le schéma, parce que les journaux de proxy incluent en général
https://et que d'autres sources ne le font pas. - Redémarrage : le manager n'est redémarré que si les listes ont réellement changé. Wazuh 4.x compile les listes CDB pendant ce redémarrage.
Vérifier
sudo QFEEDS_FORCE_UPDATE=1 /var/ossec/framework/python/bin/python3 /usr/local/bin/qfeeds-wazuh-updater.py
tail -f /var/log/qfeeds_wazuh.log
wc -l /var/ossec/etc/lists/qfeeds-malware-ip
grep -i qfeeds /var/ossec/logs/ossec.log
La première commande force une mise à jour et ignore la planification liée à la licence, c'est le moyen le plus rapide de vérifier toute la chaîne. Pour tester une règle, lancez /var/ossec/bin/wazuh-logtest et collez une ligne de journal contenant une adresse de la liste.
Dans le tableau de bord, allez dans Threat Hunting et filtrez sur rule.groups: qfeeds, ou sur une règle précise comme rule.id: 100200.
Configuration
Tous les réglages se trouvent dans /etc/qfeeds/qfeeds_wazuh.conf. Les options comme le jeton API, l'IPv6 et les listes blanches s'y modifient directement et prennent effet à l'exécution suivante. Pour activer ou désactiver des flux, ou ajouter Active Response après coup, il est plus simple de relancer l'installateur, car le fichier de règles et ossec.conf doivent évoluer avec.
Détection de domaines via Unbound
Vous utilisez OPNsense avec l'agent Wazuh et voulez aussi faire vérifier les requêtes DNS ? Activez Log Queries dans Services, Unbound DNS, Advanced, laissez la verbosité du journal à sa valeur par défaut et ajoutez le journal du résolveur à la configuration de l'agent dans /var/ossec/etc/ossec.conf sur OPNsense :
<localfile>
<log_format>syslog</log_format>
<location>/var/log/resolver/latest.log</location>
</localfile>
Redémarrez l'agent avec service wazuh-agent restart. Notez que la journalisation des requêtes coûte des performances au résolveur, qu'une mise à jour du plugin peut écraser ce bloc, et que les domaines déjà bloqués par le DNSBL d'OPNsense n'apparaissent jamais dans le journal du résolveur.
Désinstaller
sudo bash uninstall.sh
Cela supprime la tâche cron, les listes CDB et leurs fichiers compilés, les décodeurs, les règles, la configuration y compris les identifiants TAXII, le script de mise à jour et les blocs ajoutés à ossec.conf. Les sauvegardes de ossec.conf sont conservées. L'entrée <localfile> pour Unbound sur un agent OPNsense n'est pas touchée, retirez-la vous-même si vous n'en avez plus besoin.
Dépannage
- Aucune alerte : vérifiez que les listes contiennent des données avec
wc -l /var/ossec/etc/lists/qfeeds-malware-ip, que les références sont présentes avecgrep qfeeds /var/ossec/etc/ossec.conf, puis redémarrez le manager. - Le script ne télécharge rien : lisez
tail -50 /var/log/qfeeds_wazuh.loget testez votre jeton aveccurl -s "https://api.qfeeds.com/licenses?api_token=YOUR_TOKEN". - Listes non compilées : Wazuh 4.x s'en charge au redémarrage. Sur les versions plus anciennes, lancez
sudo /var/ossec/bin/ossec-makelists. - Active Response ne bloque pas : vérifiez la configuration avec
grep -A5 "Q-FEEDS-AR" /var/ossec/etc/ossec.confet le journal/var/ossec/logs/active-responses.log. - Pas d'alertes sur les hashs : la comparaison de hashs demande le mode TAXII et Sysmon sur vos postes Windows, avec la journalisation des hashs activée dans la configuration Sysmon.
- Assistance : support@qfeeds.com ou la page support. Un bug dans les scripts ? Ouvrez une issue dans le dépôt GitHub.
Voir l'installateur sur GitHub À propos de l'intégration Wazuh