Protection en couches. RĂ©seaux Fortinet et Flowmon





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)!



All Articles