Récemment, de plus en plus d'entreprises mûrissent vers une protection échelonnée, lorsqu'une solution protège le périmètre du réseau, l'autre - les stations d'extrémité, la troisième surveille en permanence le réseau, détecte les anomalies, la quatrième scanne le réseau à la recherche de vulnérabilités ouvertes, etc. Dans le même temps, le besoin de diverses intégrations augmente et c'est bien quand elles sont prêtes à l'emploi, c'est-à -dire que vous n'avez pas besoin d'écrire des scripts complexes.
Nous avons récemment écrit sur un nouveau service TS Solution - CheckFlow . Il s'agit d'un audit gratuit du trafic réseau (à la fois interne et externe). Flowmon- une solution d'analyse de télémétrie et de surveillance du réseau qui fournit des informations précieuses pour les administrateurs réseau et les agents de sécurité: anomalies, scans, serveurs illégitimes, boucles, interactions illégitimes, intrusions réseau, attaques zero-day et bien plus encore.
Je recommande également de se référer à l'article 9 des problèmes de réseau courants qui peuvent être détectés par analyse avec Flowmon .
Intégration Flowmon & FortiGate
L'intégration a été mentionnée dans notre blog . En général, cela consiste en ce que le pare-feu de nouvelle génération (tel que FortiGate) protège le périmètre et Flowmon surveille l'infrastructure réseau, ce qui permet au client d'avoir une visibilité complète du réseau. Cependant, Flowmon peut uniquement détecter, mais pas empêcher les attaques et les anomalies, car il fonctionne sur la télémétrie, qui est obtenue à l'aide de Netflow / IPFIX. Une solution NGFW ou NAC (Network Access Control) peut être utilisée pour mettre en quarantaine un hôte suspect ou infecté.
Ainsi, le fournisseur Flowmon a publié un script shell qui, en réponse à des incidents de sécurité, peut effectuer les actions suivantes sur FortiGate:
- Bloquer l'hôte infecté par adresse IP (IP Ban);
- Mettre l'hĂ´te en quarantaine Ă l'aide de FortiClient Ă l'adresse MAC (Quarantaine avec FortiClient);
- Quarantaine dynamique pour tous les hôtes infectés par adresses MAC (Access Layer Quarantine);
Mise en place
1. Je n'entrerai pas dans les détails du script lui-même, je dirai seulement qu'il existe deux versions: une pour FortiGate au-dessus de la version 6.4.0, l'autre pour les versions antérieures. Le code est indiqué ci-dessous.
Code de script pour FortiGate sous la version 6.4.0
#! / bin / bash # Author: Jiri Knapek # Description: This script is to quarantine IP on Fortigate Firewalls for FortiOS before 6.4. # Version: 1.3 # Date: 8/3/2020 # Debug 1 = yes, 0 = no DEBUG=0 [ $DEBUG -ne 0 ] && echo `date` "Starting mitigation script" >> /tmp/fg-mitigation.log # Management IP/hostname of Firewall/ Core device IP='10.10.30.210' API_KEY='fp8114zdNpjp8Qf8zN4Hdp57dhgjjf' # Default timeout for action is # value in seconds or never TIMEOUT='300' # FortiGate API URL BAN="https://$IP/api/v2/monitor/user/banned/add_users?access_token=$API_KEY" function usage { cat << EOF >&2 usage: mitigation_script.sh <options> Optional: --fw IP / hostname of Fortigate firewall --timeout Timeout in seconds --key FortiGate API key EOF exit } params="$(getopt -o f:t:k:h -l fw:,timeout:,key:,help --name "mitigation_script.sh" -- "$@")" [ $DEBUG -ne 0 ] && echo `date` "Params $params" >> /tmp/fg-mitigation.log if [ $? -ne 0 ] then usage [ $DEBUG -ne 0 ] && echo `date` "Got to usage." >> /tmp/fg-mitigation.log fi eval set -- "$params" unset params while true do case $1 in -f|--fw) IP=("${2-}") shift 2 ;; -k|--key) API_KEY=("${2-}") shift 2 ;; -t|--timeout) TIMEOUT=("${2-}") shift 2 ;; -h|--help) usage ;; --) shift break ;; *) usage ;; esac done # we dont support any other args [ $# -gt 0 ] && { usage [ $DEBUG -ne 0 ] && echo `date` "INFO: Too many arguments. Got to usage." >> /tmp/fg-mitigation.log 2>&1 } cat << EOF >&2 ----- My params are ------------------ FW = $IP API KEY = $API_KEY TIMEOUT = $TIMEOUT TOKEN = $TOKEN --------------------------------------- EOF [ $DEBUG -ne 0 ] && cat >> /tmp/fg-mitigation.log << EOF >&2 ----- My params are ------------------ FW = $IP API KEY = $API_KEY TIMEOUT = $TIMEOUT TOKEN = $TOKEN --------------------------------------- EOF echo "Stdin read started..." >&2 LINE_NUM=1 array=() while read line do IFS=$'\t' array=($line) echo "$LINE_NUM - ID ${array[0]} - type ${array[4]} - source ${array[10]}" [ $DEBUG -ne 0 ] && echo "$LINE_NUM - ID ${array[0]} - type ${array[4]} - source ${array[10]}" >> /tmp/fg-mitigation.log 2>&1 LINE_NUM=$((LINE_NUM+1)) # BAN the source IP of the event if [ $DEBUG -ne 0 ]; then /usr/bin/curl -k -X POST -H "Content-Type": "application/json" --data "{ \"ip_addresses\": [\"${array[10]}\"], \"expiry\": $TIMEOUT}" $BAN >> /tmp/fg-mitigation.log 2>&1 else /usr/bin/curl -k -X POST -H "Content-Type": "application/json" --data "{ \"ip_addresses\": [\"${array[10]}\"], \"expiry\": $TIMEOUT}" $BAN fi done < /dev/stdin echo "---- Everything completed ----" [ $DEBUG -ne 0 ] && echo `date` "---- Everything completed ----" >> /tmp/fg-mitigation.log
Code de script pour FortiGate version 6.4.0 et supérieur
#!/bin/bash # Author: Jiri Knapek # Description: This script is to quarantine IP or MAC on Fortigate Firewalls and Security Fabric # Version: 2.0 # Date: 7/8/2020 # Debug 1 = yes, 0 = no DEBUG=0 [ $DEBUG -ne 0 ] && echo `date` "Starting mitigation script" >> /tmp/fg-mitigation.log # Flowmon API access USER='admin' PASS='admin' # Management IP/hostname of Firewall/ Core device IP='10.10.30.210' WEBHOOK='FlowmonADS' API_KEY='s4mQH9j88kt1hkd4dsyjtsg8thghc4' MAC=0 URL="https://$IP/api/v2/monitor/system/automation-stitch/webhook/$WEBHOOK" function usage { cat << EOF >&2 usage: mitigation_script.sh <options> Optional: --fw IP / hostname of Fortigate firewall --user Username to be used for Flowmon API authentication --pass Password for the user --key FortiGate API key --mac Add this parameter to enable MAC mitigation EOF exit } params="$(getopt -o f:u:p:k:h:m: -l fw:,key:,pass:,user:,help,mac: --name "mitigation_script.sh" -- "$@")" if [ $? -ne 0 ] then usage [ $DEBUG -ne 0 ] && echo `date` "Got to usage." >> /tmp/fg-mitigation.log fi [ $DEBUG -ne 0 ] && echo `date` "Params $params" >> /tmp/fg-mitigation.log eval set -- "$params" unset params while true do case $1 in -f|--fw) IP=("${2-}") shift 2 ;; -k|--key) API_KEY=("${2-}") shift 2 ;; -p|--pass) PASS=("${2-}") shift 2 ;; -u|--user) USER=("${2-}") shift 2 ;; -m|--mac) MAC=1 shift 2 ;; -h|--help) usage ;; --) shift break ;; *) usage ;; esac done # we dont support any other args [ $# -gt 0 ] && { usage [ $DEBUG -ne 0 ] && echo `date` "INFO: Got to usage." >> /tmp/fg-mitigation.log 2>&1 } if [ $MAC -ne 0 ]; then # authenticate to localhost OUTPUT="$(/usr/bin/curl "https://localhost/resources/oauth/token" -k -d 'grant_type=password' -d 'client_id=invea-tech' -d "username=$USER" -d "password=$PASS")" TOKEN="" echo "${OUTPUT}" > /tmp/access_token.json if [[ $OUTPUT == *"access_token"* ]]; then [ $DEBUG -ne 0 ] && echo `date` "Successfully authenticated to Flowmon Collector!" >> /tmp/fg-mitigation.log TOKEN="$(cat /tmp/access_token.json | jq '.access_token')" TOKEN="${TOKEN//\"}" TOKEN="Authorization: bearer "$TOKEN fi fi cat << EOF >&2 ----- My params are ------------------ FW = $IP API KEE = $API_KEY URL = $URL MAC = $MAC TOKEN = $TOKEN --------------------------------------- EOF [ $DEBUG -ne 0 ] && cat >> /tmp/fg-mitigation.log << EOF >&2 ----- My params are ------------------ FW = $IP API KEE = $API_KEY URL = $URL MAC = $MAC TOKEN = $TOKEN --------------------------------------- EOF echo "Stdin read started..." >&2 LINE_NUM=1 array=() while read line do IFS=$'\t' array=($line) echo "$LINE_NUM - ID ${array[0]} - type ${array[4]} - source ${array[10]}" [ $DEBUG -ne 0 ] && echo "$LINE_NUM - ID ${array[0]} - type ${array[4]} - source ${array[10]}" >> /tmp/fg-mitigation.log 2>&1 # Call a webhook if [ $MAC -ne 0 ]; then MAC_ADDR="$(/usr/bin/curl "https://localhost/rest/ads/event/${array[0]}" -G -k -H "$TOKEN" | jq '.macAddress')" if [ $DEBUG -ne 0 ]; then /usr/bin/curl -k -X POST -H "Authorization: Bearer $API_KEY" --data "{ \"srcip\": \"${array[10]}\", \"mac\": $MAC_ADDR, \"fctuid\": \"A8BA0B12DA694E47BA4ADF24F8358E2F\"}" $URL >> /tmp/fg-mitigation.log 2>&1 else /usr/bin/curl -k -X POST -H "Authorization: Bearer $API_KEY" --data "{ \"srcip\": \"${array[10]}\", \"mac\": $MAC_ADDR, \"fctuid\": \"A8BA0B12DA694E47BA4ADF24F8358E2F\"}" $URL fi else if [ $DEBUG -ne 0 ]; then /usr/bin/curl -k -X POST -H "Authorization: Bearer $API_KEY" --data "{ \"srcip\": \"${array[10]}\", \"fctuid\": \"A8BA0B12DA694E47BA4ADF24F8358E2F\"}" $URL >> /tmp/fg-mitigation.log 2>&1 else /usr/bin/curl -k -X POST -H "Authorization: Bearer $API_KEY" --data "{ \"srcip\": \"${array[10]}\", \"fctuid\": \"A8BA0B12DA694E47BA4ADF24F8358E2F\"}" $URL fi fi LINE_NUM=$((LINE_NUM+1)) done < /dev/stdin echo "---- Everything completed ----" [ $DEBUG -ne 0 ] && echo `date` "---- Everything completed ----" >> /tmp/fg-mitigation.log
2. J'utilise FortiGate version 6.4.2. Dans le script lui-même, aux lignes 13 et 14, vous devez ajouter votre nom d'utilisateur et votre mot de passe à Flowmon , ainsi que la clé API de la clause 5 , l'adresse IP FortiGate et le nom du Webhook (le nom du mécanisme d'automatisation).
3. Dans l'interface Web, FortiGate doit être ajouté sous l'onglet Security Fabric> Automation> New Automation Stitch . Nom - FlowmonADS , Statut - Activé , Déclencheur - Webhook entrant , Action - BAN IP, Quarantaine de couche d'accès, Quarantaine avec FortiCLient (si utilisé).
4. Ensuite, vous verrez une fenêtre comme dans la capture d'écran ci-dessous avec l'URL FortiGate pour ce Webhook, un champ pour l'API du jeton d'administration (nous le créerons plus tard) et un exemple de demande.
5. Ensuite, vous devez créer un profil d'administrateur, qui aura des droits. Onglet Système> Profils d'administrateur> Créer nouveau .
6. Attribuez les droits à Security Fabric - Lecture, Pare-feu - Lecture / écriture, Système - Lecture / écriture, Profil de sécurité - Lecture / écriture .
7. Ensuite, dans l'onglet Système> Administrateurs , créez un nouvel administrateur avec le profil api_admin . De plus, dans le champ Hôtes approuvés , vous pouvez spécifier des réseaux approuvés ou l'adresse IP du Flowmon.
Remarque : paramètre Trusted Hostsvous permet de coder en dur des segments IP à partir desquels api_admin peut envoyer des requêtes API à FortiGate, c'est donc le paramètre recommandé.
8. Après cette étape, une clé API est générée , qui doit être ajoutée au script initial avec les autres données spécifiées au paragraphe 1 et dans le webhook du paragraphe 4.
9. Ensuite, allez dans Flowmon dans le module ADS (Anomaly Detection System) dans l'onglet System> System Paramètres> Scripts personnalisés> Nouveau script personnalisé> Sélectionnez un fichier avec l'extension .sh . Ensuite, vous devez définir les paramètres --fw (adresse IP FortiGate), --key (jeton API), --mac (rien), --pass (mot de passe de l'API REST Flowmon), --user (utilisateur API REST Flowmon). Cliquez ensuite sur le bouton Enregistrer .
Remarque : --pass et --user sont admin / admin par défaut.
10. La dernière étape consiste à établir les événements auxquels le code de programme donné sera déclenché. Dans l'onglet Paramètres> Traitement> Scripts personnalisés> Nouvelle action de script personnalisée , modifiez le paramètre Perspective sur Problèmes de sécurité , définissez le seuil (priorité minimale à signaler) et vérifiez les paramètres de l'étape précédente.
VĂ©rifier
Si un événement de la catégorie Problèmes de sécurité est déclenché sur Flowmon, FortiGate bloquera cet hôte. De plus, dans le widget Quarantaine pratique, vous pouvez afficher les hôtes potentiellement infectés en tombant à l'intérieur. Ou via la commande dans la liste de mise en quarantaine des utilisateurs de diagnostic CLI .
Après la sécurité des informations, l'administrateur peut commencer à enquêter sur l'incident à l'aide de Flowmon ADS, en identifiant l'hôte initialement infecté, via quels ports le malware se propage et son comportement. À l'aide de solutions de protection des postes de travail, par exemple FortiEDR, vous pouvez soigner la machine et mener une enquête sur un incident de sécurité.
Pour retirer un hôte de la quarantaine, sélectionnez-le et cliquez sur le bouton Supprimer ou Supprimer toutpour sortir tous les hôtes de la quarantaine.
Conclusion
L'approche omniprésente de la défense en profondeur pousse de nombreux fournisseurs à s'intégrer à d'autres solutions hors de la boîte. Cet article explique comment intégrer, configurer et montrer comment Flowmon et FortiGate fonctionnent ensemble.
Dans un proche avenir, nous prévoyons un webinaire, où nous expliquerons plus en détail comment Flowmon et Fortinet se complètent, leur intégration entre eux et répondrons également à vos questions. L'inscription est disponible ici .
Si ce sujet vous intéresse, restez à l'écoute de nos chaînes (Telegram, Facebook, VK, TS Solution Blog)!