Guide d’intégration
Threat intelligence pour Wazuh en listes CDB d’IP et de domaines malveillants, rafraîchies par cron
Aucune carte bancaire requise · Clé API gratuite
Sur cette page08
Ce que vous obtenez
Une liste CDB est une base sur disque sans limite de taille documentée. Chaque liste ci-dessous devient une liste CDB, nommée dans sa ligne.
| Liste | Entrées | Régénérée | Offres |
|---|---|---|---|
blocklist-ips-critical.txtPar défaut : ismalicious-ips, pour srcip, dstip ou les champs src_ip et dest_ip de Suricata. IP signalées par 6 sources de menaces ou plus, ou par 3 ou plus avec une catégorie critique. | environ 89 000 | toutes les 12 h | Basic, Pro et Enterprise |
blocklist-domains-c2.txtismalicious-domains-c2 : domaines de commande et contrôle (C2) signalés par des trackers de C2. | environ 22 000 | toutes les 12 h | Basic, Pro et Enterprise |
blocklist-domains-ransomware.txtismalicious-domains-ransomware : domaines de la catégorie ransomware, quel que soit leur niveau. | environ 3 600 | toutes les 12 h | Basic, Pro et Enterprise |
Nombres arrondis d’après la génération du ; chaque liste est régénérée toutes les 12 heures. Les chiffres du jour sont publics et ne demandent aucune clé.
Ce que reçoit chaque offre
- FreeCompte Free, ou aucune clé : les premiers 10 % de chaque liste, signalés par
X-Blocklist-Version: lite. - Basic, Pro et EnterpriseBasic, Pro et Enterprise : toutes les listes, complètes.
- Pro et EnterpriseCollections TAXII 2.1, pour les plateformes qui lisent les indicateurs STIX : Pro et Enterprise.
GET https:/
Liste complète ou échantillon de 10 %
| Champ | Basic, Pro et Enterprise | Free |
|---|---|---|
X-Blocklist-Version: | full | lite |
X-Blocklist-Percentage: | 100 | 10 |
Total entries: | <COUNT> | <COUNT> |
Premières lignes du fichier
# IsMalicious.com Blocklist - IPs (Critical)
# Format: Plain
# Generated: <BUILD_TIME>
# Total entries: <COUNT>
# Update frequency: every 12 hours
# Category: All
# Threat level: Critical
# Website: https://ismalicious.com
# © <YEAR> IsMalicious (compilation). Licensed to the downloading account under https://ismalicious.com/terms; redistribution of the compilation prohibited. Third-party entries remain under their providers' licences — see https://ismalicious.com/sources.
#Les valeurs entre chevrons sont fixées à chaque génération.
Prérequis
- Wazuh manager 4.3 ou ultérieur, vérifié sur la documentation 4.14 (avant 4.3, l’utilisateur du service était ossec). Les listes se rechargent sans redémarrage à partir de 4.13.
- Un accès root au manager, le nœud master dans un cluster, avec
curletawk. - Une clé API et son secret isMalicious, dans Compte › Accès API.
- Un accès HTTPS sortant (TCP 443) en IPv4 depuis le manager Wazuh vers
api.ismalicious.com, qui n’a pas d’adresse IPv6.
Mise en place
Copier la clé API et le secret
Ouvrez Compte › Accès API et copiez la Clé API et le Secret API. Les listes complètes demandent une offre Basic, Pro ou Enterprise ; avec une clé Free, le script reçoit l’échantillon de 10 % et le refuse.Stocker les identifiants sur le manager
Créez/etc/ismalicious/netrc, réservé à root, avec les commandes ci-dessous, puis écrivez-y les trois lignes avec un éditeur : tapées dans un shell, elles finiraient dans son historique. curl y lit la clé et le secret : ils n’apparaissent jamais sur une ligne de commande.Créer le fichier, réservé à rootsh install -d -m 700 /etc/ismalicious [ -e /etc/ismalicious/netrc ] || install -m 600 /dev/null /etc/ismalicious/netrc chmod 600 /etc/ismalicious/netrc # Then write the three lines below into it with an editor, unless it holds them already./ etc/ ismalicious/ netrcnetrc machine api.ismalicious.com login <API_KEY> password <API_SECRET>Installer le script de conversion et l’exécuter une fois
- Enregistrez le script sous
/, en mode 700, et exécutez-le.usr/ local/ sbin/ ismalicious-wazuh-lists. sh - Il refuse une erreur, un contenu qui n’est pas une liste, l’échantillon de 10 % et un fichier dont le nombre d’entrées diffère de son en-tête.
- Wazuh ignore toute ligne sans deux-points, c’est-à-dire chaque ligne d’une liste simple : le script écrit donc chaque entrée en ligne
clé:, met les clés IPv6 entre guillemets et écrit chacune deux fois, compressée et en entier, car l’EVE de Suricata écrit les adresses en entier. - Il écrit
/, propriété devar/ ossec/ etc/ lists/ ismalicious-* wazuh:wazuh, en mode 660. - Une liste qui échoue à une vérification arrête l’exécution : elle et les listes suivantes gardent leur copie précédente.
/ usr/ local/ sbin/ ismalicious-wazuh-lists. shsh #!/bin/sh # Download isMalicious lists and write them as Wazuh CDB lists. A list that # fails a check stops the run: it and the lists after it keep their copy. set -eu LISTS=/var/ossec/etc/lists NETRC=/etc/ismalicious/netrc RAW=$(mktemp) NEW= trap 'rm -f "$RAW" $NEW' EXIT # fetch_list LIST OUT: download one list to OUT and check it. # On any failure OUT is removed and the function returns 1. fetch_list() { if ! code=$(curl --silent --show-error --fail --netrc-file "$NETRC" \ --proto '=https' --max-time 300 --retry 2 \ --output "$2" --write-out '%{http_code}' "https://api.ismalicious.com/blocklist/download/$1"); then rm -f "$2"; echo "$1: download failed" >&2; return 1 fi if [ "$code" != 200 ]; then rm -f "$2"; echo "$1: HTTP $code" >&2; return 1 fi if ! head -n 1 "$2" | grep -q '^[#!] IsMalicious.com Blocklist'; then rm -f "$2"; echo "$1: not an isMalicious list" >&2; return 1 fi if grep -q 'Lite Version' "$2"; then rm -f "$2"; echo "$1: lite list received, check the API key and the plan" >&2 return 1 fi # Every entry ends with a newline, and one header counts them: refuse a # cut, doubled or empty file. if [ -n "$(tail -c 1 "$2")" ]; then rm -f "$2"; echo "$1: cut short, no final newline" >&2; return 1 fi if [ "$(grep -c '^[#!] Total entries:' "$2")" != 1 ]; then rm -f "$2"; echo "$1: not one Total entries line" >&2; return 1 fi total=$(sed -n 's/^[#!] Total entries: \([0-9,]*\)$/\1/p' "$2" | tr -d ,) got=$(grep -c '^[^#!]' "$2" || true) if [ -z "$total" ] || [ "$total" = 0 ] || [ "$got" != "$total" ]; then rm -f "$2"; echo "$1: $got entries, the header says ${total:-none}" >&2 return 1 fi } # convert <ip|domain> FILE: one CDB key per entry. IPv6 keys are quoted and # written twice, compressed and in full, since Suricata's EVE writes them in full. convert() { case "$1" in ip) /var/ossec/framework/python/bin/python3 -c ' import ipaddress, sys for line in open(sys.argv[1]): f = line.split() if not f or f[0][0] in "#!": continue a = ipaddress.ip_address(f[0]) if a.version == 4: print(f"{a}:") else: print(f"\"{a.compressed}\":\n\"{a.exploded}\":") ' "$2" ;; domain) awk '!/^[#!]/ && NF { printf "%s:\n", $1 }' "$2" ;; esac } # load <isMalicious file> <CDB list name> <ip|domain> load() { fetch_list "$1" "$RAW" # .swp: not the compiler's own <list>.tmp, and never synced by the cluster. NEW=$(mktemp --suffix=.swp "$LISTS/.$2.XXXXXX") convert "$3" "$RAW" > "$NEW" chown wazuh:wazuh "$NEW" chmod 660 "$NEW" mv -f "$NEW" "$LISTS/$2" NEW= } load blocklist-ips-critical.txt ismalicious-ips ip load blocklist-domains-c2.txt ismalicious-domains-c2 domain load blocklist-domains-ransomware.txt ismalicious-domains-ransomware domain- Enregistrez le script sous
Déclarer les listes dans ossec.conf
Ajoutez une lignelistpar liste dans le blocrulesetde/var/ossec/etc/ossec.conf. Dans un cluster, faites-le sur chaque nœud : le master synchroniseetc/lists/vers les workers, mais pasossec.conf./ var/ ossec/ etc/ ossec. confxml <!-- Inside the existing <ruleset> block, on every node: --> <list>etc/lists/ismalicious-ips</list> <list>etc/lists/ismalicious-domains-c2</list> <list>etc/lists/ismalicious-domains-ransomware</list>Ajouter les règles
Ajoutez les règles à/, avec des identifiants libres dans votre jeu de règles. Les champs IP demandent la recherchevar/ ossec/ etc/ rules/ local_rules. xml address_match_key. La règle 100200 reprend le modèle de réputation d’IP documenté par Wazuh pour les journaux d’accès web ; les règles 100201 et 100202 vérifient la destination et la source des alertes EVE de Suricata. Pour une liste de domaines, utilisez la recherchematch_keysur le champ décodé qui contient le nom demandé, que montrewazuh-logtest./ var/ ossec/ etc/ rules/ local_rules. xmlxml <group name="ismalicious,"> <!-- Web access logs: Wazuh's documented IP reputation pattern. --> <rule id="100200" level="10"> <if_group>web|attack|attacks</if_group> <list field="srcip" lookup="address_match_key">etc/lists/ismalicious-ips</list> <description>isMalicious: source IP $(srcip) is on the critical IP list.</description> </rule> <!-- Suricata EVE alerts (rule 86601). Dynamic fields src_ip / dest_ip. --> <rule id="100201" level="10"> <if_sid>86601</if_sid> <list field="dest_ip" lookup="address_match_key">etc/lists/ismalicious-ips</list> <description>isMalicious: Suricata alert towards listed IP $(dest_ip).</description> </rule> <rule id="100202" level="10"> <if_sid>86601</if_sid> <list field="src_ip" lookup="address_match_key">etc/lists/ismalicious-ips</list> <description>isMalicious: Suricata alert from listed IP $(src_ip).</description> </rule> </group>Charger les listes
- Redémarrez le manager avec
systemctl, quelle que soit la version.restart wazuh-manager - À partir de 4.13, le script de rechargement charge les listes sans redémarrage : il se connecte à l’API Wazuh avec des identifiants lus dans
/root/.wazuh-api.netrc(mode 600 ; l’utilisateur de l’API doit avoirmanager:readetmanager:restart, oucluster:*), garde le jeton dans une configuration curl en mode 600, appellePUT, et sort en erreur quand la réponse signale un élément en échec ou une liste non chargée : le point d’accès répond 200 dans tous les cas./ manager/ analysisd/ reload - Dans un cluster, remplacez
manager/parcluster/dans le script :manager/ne recharge que le master, et les workers en 4.14.2 l’ignorent (corrigé en 4.14.3). - Avant 4.13, redémarrez chaque nœud une fois que le master a synchronisé
etc/lists/. - L’option
-kaccepte le certificat propre de l’API sur localhost, comme dans le guide de l’API Wazuh.
/ root/ . wazuh-api. netrcnetrc machine localhost login <WAZUH_API_USER> password <WAZUH_API_PASSWORD>/ usr/ local/ sbin/ ismalicious-wazuh-reload. shsh #!/bin/sh # Wazuh 4.13 and later: hot reload, no restart. In a cluster, replace # manager/ with cluster/ below: manager/ reloads the master only. set -eu API=https://localhost:55000 CFG=$(mktemp) trap 'rm -f "$CFG"' EXIT TOKEN=$(curl -fsS -k --netrc-file /root/.wazuh-api.netrc -X POST \ "$API/security/user/authenticate?raw=true") # The token goes in a mode-600 curl config, not on the command line. printf 'header = "Authorization: Bearer %s"\n' "$TOKEN" > "$CFG" R=$(curl -fsS -k -K "$CFG" -X PUT "$API/manager/analysisd/reload?wait_for_complete=true") echo "$R" case "$R" in *'"total_failed_items": 0'*) ;; *) echo "Wazuh reload failed" >&2; exit 1 ;; esac case "$R" in *'(7616)'*) echo "a CDB list did not load: its rules are ignored" >&2; exit 1 ;; esac # Older than 4.13, replace the calls above with: # systemctl restart wazuh-manager- Redémarrez le manager avec
Planifier les deux scripts
Lancez le téléchargement, puis le rechargement, toutes les 12 heures depuis/: les listes sont régénérées toutes les 12 heures. Un téléchargement raté arrête l’exécution avant le rechargement, et les listes précédentes restent en place.etc/ cron. d/ ismalicious-wazuh / etc/ cron. d/ ismalicious-wazuhcron 17 3,15 * * * root /usr/local/sbin/ismalicious-wazuh-lists.sh && /usr/local/sbin/ismalicious-wazuh-reload.sh
Vérifier le résultat
wc -lsur une liste convertie donne à peu près soncountdans /blocklist/stats, etheadmontre des lignesclé:, les clés IPv6 entre guillemets.- Après un redémarrage ou un rechargement, le fichier
.cdbde la liste porte un horodatage récent. wazuh-logtestaffiche la règle 100200, 100201 ou 100202 en phase 3 pour une ligne de journal contenant une IP listée. Il relit les fichiers et compile lui-même les listes : il ne prouve donc pas que le moteur en service a rechargé, ce que montreossec.logavecwazuh-analysisd: INFO: Ruleset.reloaded successfully - Les alertes apparaissent dans le tableau de bord sous les identifiants des règles ou le groupe
ismalicious, et dansalerts.json. - Les premières lignes d’un téléchargement direct montrent
Total entriessansLite Version.
# The converted list and its compiled file:
wc -l /var/ossec/etc/lists/ismalicious-ips
head -3 /var/ossec/etc/lists/ismalicious-ips
ls -l /var/ossec/etc/lists/ismalicious-ips.cdb
# The running engine took the new ruleset:
grep 'Ruleset reloaded successfully' /var/ossec/logs/ossec.log | tail -1
# Paste a log line that holds a listed IP; phase 3 shows the rule:
/var/ossec/bin/wazuh-logtest
# Alerts raised by the rules:
grep ismalicious /var/ossec/logs/alerts/alerts.json
# As root (the netrc file is root-only): the key reaches isMalicious when
# Total entries has no "Lite Version".
sudo curl -sS --netrc-file /etc/ismalicious/netrc \
https://api.ismalicious.com/blocklist/download/blocklist-ips-critical.txt | head -12Dépannage
Le script s’arrête sur un 401
La clé ou le secret du fichier netrc est faux ou incomplet : curl sort avec le code 22 et les listes précédentes restent en place. Le corps de la réponse indique « Blocklist not found or empty » ; fiez-vous au code HTTP. Régénérer la clé dans Compte › Accès API invalide l’ancienne paire.
« lite list received »
Aucun identifiant n’est parvenu au serveur, ou l’offre est Free ou interrompue : un abonnement impayé, en retard de paiement, annulé, incomplet ou suspendu compte comme Free. Vérifiez l’entrée netrc et l’offre.
« entries, the header says », « cut short, no final newline » ou « not one Total entries line »
Le fichier était vide, tronqué ou n’était pas une des listes, comme quand un proxy ou un portail captif répond. L’exécution s’arrête : cette liste et les suivantes gardent leur copie précédente, et le rechargement ne s’exécute pas.
Délais dépassés ou 502
Un téléchargement qui prend plus de 30 secondes de notre côté finit en délai dépassé ou en 502 : prenez une liste par niveau ou par catégorie du tableau.
503 avec Retry-After: 600
Une liste est en cours de génération. L’exécution suivante la récupère.
Une règle ne se déclenche jamais
La liste manque dans ossec.conf, ou le manager n’a été ni redémarré ni rechargé : ossec.log affiche alors (7616): List Une ligne (7612): Rule signale des identifiants de règles en conflit : prenez-en de libres. Ou le nom du champ diffère : vérifiez les noms décodés dans wazuh-logtest. Les champs IP demandent address_match_key, et la correspondance est exacte : la casse et la notation IPv6 doivent correspondre.
Clés parasites ou liste vide
Ne déclarez jamais un téléchargement brut comme liste CDB : les lignes sans deux-points sont ignorées, et une ligne # qui en contient devient une clé. Utilisez la conversion du script.
curl sort avec le code 60
Mettez à jour le magasin d’autorités, vérifiez l’horloge, et exemptez api.ismalicious.com de l’inspection TLS.
Les workers ne trouvent rien
Leur propre ossec.conf n’a pas les lignes list, que le cluster ne synchronise pas, ou ils gardent les anciennes listes : PUT ne recharge que le master. Utilisez cluster/ dans le script de rechargement (et 4.14.3 ou ultérieur), ou redémarrez-les.
Limites
- Wazuh n’a pas d’intégration de flux pour isMalicious et ne télécharge rien lui-même : la mise à jour passe par le script cron, puis un redémarrage ou un rechargement.
- Les recherches CDB sont exactes. Aucune liste CIDR ou à jokers n’est servie, et la correspondance par préfixe IPv4 ne vaut que pour les clés finissant par un point, que les listes ne contiennent jamais.
- Une entrée IPv6 ne correspond qu’aux chaînes exactes listées : le script écrit chaque clé IPv6 compressée et en entier, les formes qu’utilisent des décodeurs comme l’EVE de Suricata ; toute autre notation ne correspond pas.
- Un domaine ne correspond qu’au nom exact de l’événement :
evil.examplelisté ne correspond pas àwww.evil.example. Aucune règle de domaines n’est publiée ici, car le champ qui contient une requête DNS dépend du décodeur. - Les listes d’empreintes ne sont pas couvertes : leur taille n’est pas publiée, et leur téléchargement n’a pas été vérifié face à la fenêtre de 30 secondes de l’hôte api.
- L’échantillon de 10 % est le premier dixième d’un fichier non trié, pas le dixième le plus risqué : le script le refuse.
Questions fréquentes
Wazuh peut-il télécharger une blocklist lui-même ?
Non. Wazuh lit les listes CDB dans des fichiers locaux déclarés dans ossec.conf. Un script cron sur le manager télécharge les listes isMalicious avec curl, les convertit et les charge.
Pourquoi faut-il convertir les listes ?
Une liste CDB demande deux-points après chaque clé, et Wazuh ignore toute ligne qui n’en a pas, c’est-à-dire chaque ligne d’une liste simple. Le script écrit des lignes clé:, met les clés IPv6 entre guillemets et retire les lignes d’en-tête.
Chaque mise à jour demande-t-elle un redémarrage du manager ?
Pas à partir de Wazuh 4.13, qui recharge règles, décodeurs et listes CDB par le point d’accès de rechargement d’analysisd. Avant 4.13, redémarrez wazuh-manager après chaque mise à jour.
Comment les listes atteignent-elles les workers d’un cluster ?
Le master synchronise etc/lists/ vers les workers, mais le cluster ne synchronise pas ossec.conf : déclarez chaque liste dans ossec.conf sur chaque nœud. À partir de 4.13, rechargez avec PUT , qui atteint tous les nœuds (4.14.3 ou ultérieur) ; avant, redémarrez chaque nœud.
À voir aussi
Listes en lookups, threat lists ES, envoi par HEC
Collections TAXII 2.1 pour les règles indicator match
IP et domaines malveillants en datasets Suricata
IP et domaines malveillants en reference sets QRadar
Indicateurs TAXII 2.1 dans Sentinel
Toutes les listes, niveaux et catégories
Collections TAXII 2.1 pour SIEM et TIP
Authentification, endpoints et limites
Vérifier une adresse avant de la bloquer
Commencer
Prêt à commencer ?
Aucune carte bancaire requise · Clé API gratuite