Protecci贸n en capas. Redes Fortinet y Flowmon





Recientemente, cada vez m谩s empresas est谩n madurando hacia una protecci贸n escalonada, cuando una soluci贸n protege el per铆metro de la red, la otra: las estaciones finales, la tercera monitorea constantemente la red, detectando anomal铆as, la cuarta escanea la red en busca de vulnerabilidades abiertas, etc. Al mismo tiempo, la necesidad de varias integraciones est谩 creciendo y es bueno cuando est谩n listas para usar, es decir, no es necesario escribir scripts complejos.



Recientemente escribimos sobre un nuevo servicio de TS Solution: CheckFlow . Esta es una auditor铆a gratuita del tr谩fico de la red (tanto interno como externo). Flowmon- una soluci贸n de an谩lisis de telemetr铆a y monitoreo de red que proporciona informaci贸n valiosa tanto para los administradores de red como para los guardias de seguridad: anomal铆as, escaneos, servidores ileg铆timos, bucles, interacciones ileg铆timas, intrusiones en la red, ataques de d铆a cero y mucho m谩s.



Tambi茅n recomiendo consultar el art铆culo 9 sobre problemas de red comunes que se pueden detectar mediante el an谩lisis con Flowmon .



Integraci贸n Flowmon y FortiGate



La integraci贸n se mencion贸 en nuestro blog . En general, consiste en que el Firewall de Pr贸xima Generaci贸n (como FortiGate) protege el per铆metro y Flowmon monitorea la infraestructura de la red, brindando al cliente una visibilidad total de la red. Sin embargo, Flowmon solo puede detectar, pero no prevenir, ataques y anomal铆as, porque funciona en telemetr铆a, que se obtiene mediante Netflow / IPFIX. Se puede utilizar una soluci贸n NGFW o NAC (Network Access Control) para poner en cuarentena un host sospechoso o infectado.



Entonces, el proveedor Flowmon lanz贸 un script de shell que, en respuesta a incidentes de seguridad, puede realizar las siguientes acciones en FortiGate:



  • Bloquear el host infectado por direcci贸n IP (IP Ban);
  • Poner en cuarentena el host usando FortiClient en la direcci贸n MAC (Cuarentena con FortiClient);
  • Cuarentena din谩mica para todos los hosts infectados por direcciones MAC (Cuarentena de capa de acceso);


Configurar



1. No entrar茅 en los detalles del script en s铆, solo dir茅 que hay dos versiones: una para FortiGate por encima de la versi贸n 6.4.0 y la otra para versiones anteriores. El c贸digo se muestra a continuaci贸n.



C贸digo de secuencia de comandos para FortiGate por debajo de la versi贸n 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


C贸digo de script para FortiGate versi贸n 6.4.0 y superior
#!/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. Estoy usando FortiGate versi贸n 6.4.2. En el script en s铆, en las l铆neas 13 y 14, debe agregar su nombre de usuario y contrase帽a a Flowmon , as铆 como agregar la clave API de la cl谩usula 5 , la direcci贸n IP de FortiGate y el nombre del Webhook (el nombre del mecanismo de automatizaci贸n).







3. En la interfaz web, FortiGate debe agregarse en Security Fabric> Automation> New Automation Stitch . Nombre: FlowmonADS , Estado: Habilitado , Activador : Webhook entrante , Acci贸n: IP BAN, Cuarentena de la capa de acceso, Cuarentena con FortiCLient (si se usa).







4. Luego ver谩 una ventana como en la captura de pantalla a continuaci贸n con la URL de FortiGate para este Webhook, un campo para la API del token de administraci贸n (la crearemos m谩s adelante) y una solicitud de ejemplo.







5. A continuaci贸n, debe crear un perfil de administrador, que tendr谩 derechos. Pesta帽a Sistema> Perfiles de administrador> Crear nuevo .







6. Asigne los derechos a Security Fabric - Lectura, Firewall - Lectura / Escritura, Sistema - Lectura / Escritura, Perfil de seguridad - Lectura / Escritura .







7. Despu茅s de eso, en la pesta帽a Sistema> Administradores , cree un nuevo administrador con el perfil api_admin . Adem谩s, en el campo Trusted Hosts , puede especificar redes de confianza o la direcci贸n IP del Flowmon.

Nota : par谩metro Trusted Hostsle permite codificar segmentos de IP desde los cuales api_admin puede enviar solicitudes de API a FortiGate, por lo que esta es la configuraci贸n recomendada.







8. Despu茅s de este paso, se genera una clave API , que debe agregarse al script inicial junto con otros datos especificados en el p谩rrafo 1 y en el webhook en el p谩rrafo 4.







9. A continuaci贸n, vaya a Flowmon en el m贸dulo ADS (Sistema de detecci贸n de anomal铆as) en la pesta帽a Sistema> Sistema Configuraci贸n> Scripts personalizados> Nuevo script personalizado> Seleccionar archivo con extensi贸n .sh . A continuaci贸n, debe configurar los par谩metros --fw (direcci贸n IP de FortiGate), --key (token de API), --mac (nada), --pass (contrase帽a de REST API Flowmon), --user (usuario de REST API Flowmon). Luego haga clic en el bot贸n Guardar .

Nota : --pass y --user son admin / admin de forma predeterminada.







10. El 煤ltimo paso es establecer los eventos a los que se activar谩 el c贸digo de programa dado. En la pesta帽a Configuraci贸n> Procesamiento> Secuencias de comandos personalizadas> Nueva acci贸n de secuencia de comandos personalizada , cambie el par谩metro Perspectiva a Problemas de seguridad , establezca la Prioridad m铆nima para informar y verifique los par谩metros del paso anterior.







Cheque



Si se activa un evento de la categor铆a Problemas de seguridad en Flowmon, FortiGate bloquear谩 este host. Adem谩s, en el conveniente widget de cuarentena, puede ver los hosts potencialmente infectados ingresando. O a trav茅s del comando en la CLI diagnosticar la lista de cuarentena de usuarios .







Despu茅s de la seguridad de la informaci贸n, el administrador puede comenzar a investigar el incidente utilizando Flowmon ADS, identificando el host inicialmente infectado, a trav茅s de qu茅 puertos se propaga el malware y su comportamiento. Con la ayuda de soluciones para proteger estaciones de trabajo, por ejemplo, FortiEDR, puede curar la m谩quina y realizar una investigaci贸n de un incidente de seguridad.



Para eliminar un host de la cuarentena, selecci贸nelo y haga clic en el bot贸n Eliminar o Eliminar todopara sacar todos los hosts de la cuarentena.



Conclusi贸n



El enfoque omnipresente de la defensa en profundidad est谩 impulsando a muchos proveedores a integrarse con otras soluciones listas para usar. Este art铆culo cubri贸 c贸mo integrar, configurar y demostrar c贸mo Flowmon y FortiGate trabajan juntos.



En un futuro pr贸ximo, estamos planeando un webinar, donde contaremos con m谩s detalle c贸mo se complementan Flowmon y Fortinet, su integraci贸n entre s铆, y tambi茅n responderemos a sus preguntas. La inscripci贸n est谩 disponible aqu铆 .



Si est谩 interesado en este tema, 隆permanezca atento a nuestros canales (Telegram, Facebook, VK, TS Solution Blog)!



All Articles