Proteção em camadas. Fortinet e Flowmon Networks





Recentemente, mais e mais empresas estão amadurecendo para a proteção em camadas, quando uma solução protege o perímetro da rede, outra - estações finais, a terceira monitora constantemente a rede, detectando anomalias, a quarta verifica a rede em busca de vulnerabilidades abertas e assim por diante. Ao mesmo tempo, a necessidade de várias integrações está crescendo e é bom quando elas estão fora da caixa, ou seja, você não precisa escrever scripts complexos.



Recentemente, escrevemos sobre um novo serviço TS Solution - CheckFlow . Esta é uma auditoria gratuita do tráfego de rede (interno e externo). Flowmon- uma solução de análise de telemetria e monitoramento de rede que fornece informações valiosas para administradores de rede e guardas de segurança: anomalias, varreduras, servidores ilegítimos, loops, interações ilegítimas, intrusões de rede, ataques de dia zero e muito mais.



Também recomendo consultar o artigo 9 problemas comuns de rede que podem ser detectados usando a análise com o Flowmon .



Integração Flowmon e FortiGate



A integração foi mencionada em nosso blog . Em geral, consiste no fato de que o Firewall de Próxima Geração (como FortiGate) protege o perímetro e o Flowmon monitora a infraestrutura da rede, assim o cliente recebe total visibilidade da rede. No entanto, o Flowmon pode apenas detectar, mas não evitar ataques e anomalias, pois funciona em telemetria, que é obtida usando Netflow / IPFIX. Uma solução NGFW ou NAC (Network Access Control) pode ser usada para colocar em quarentena um host suspeito ou infectado.



Portanto, o fornecedor Flowmon lançou um script de shell que, em resposta a incidentes de segurança, pode realizar as seguintes ações no FortiGate:



  • Bloqueia o host infectado por endereço IP (IP Ban);
  • Quarentena o host usando FortiClient no endereço MAC (Quarentena com FortiClient);
  • Quarentena dinâmica para todos os hosts infectados por endereços MAC (Access Layer Quarantine);


Configurando



1. Não vou entrar em detalhes sobre o script em si, direi apenas que existem duas versões: uma para FortiGate acima da versão 6.4.0 e outra para versões anteriores. O código é mostrado abaixo.



Código de script para FortiGate abaixo da versão 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 versão 6.4.0 e 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. Estou usando o FortiGate versão 6.4.2. No próprio script, nas linhas 13 e 14, você deve adicionar seu nome de usuário e senha ao Flowmon , bem como adicionar a chave API da cláusula 5 , o endereço IP do FortiGate e o nome do Webhook (o nome do mecanismo de automação).







3. Na interface da web, o FortiGate deve ser adicionado em Security Fabric> Automation> New Automation Stitch . Nome - FlowmonADS , Status - Habilitado , Gatilho - Webhook de entrada , Ação - IP BAN, Quarentena de camada de acesso, Quarentena com FortiCLient (se usado).







4. Em seguida, você verá uma janela como a imagem abaixo com o URL do FortiGate para este Webhook, um campo para a API do token de administrador (iremos criá-lo mais tarde) e um exemplo de solicitação.







5. Em seguida, você deve criar um perfil de administrador, que terá direitos. Guia Sistema> Perfis de administrador> Criar novo .







6. Atribua os direitos ao Security Fabric - Leitura, Firewall - Leitura / Gravação, Sistema - Leitura / Gravação, Perfil de Segurança - Leitura / Gravação .







7. Depois disso, na guia Sistema> Administradores , crie um novo administrador com o perfil api_admin . Além disso, no campo Hosts confiáveis , você pode especificar redes confiáveis ​​ou o endereço IP do Flowmon.

Nota : parâmetro Hosts confiáveispermite que você codifique segmentos IP a partir dos quais api_admin pode enviar solicitações de API para FortiGate, portanto, esta é a configuração recomendada.







8. Após esta etapa, uma chave API é gerada , que deve ser adicionada ao script inicial junto com outros dados especificados no parágrafo 1 e no webhook no parágrafo 4.







9. Em seguida, vá para Flowmon no módulo ADS (Sistema de Detecção de Anomalias) na guia Sistema> Sistema Configurações> Scripts personalizados> Novo script personalizado> Selecionar arquivo com extensão .sh . Em seguida, você precisa definir os parâmetros --fw (endereço IP FortiGate), --key (token API), --mac (nada), --pass (senha da API REST Flowmon), --user (usuário da API REST Flowmon). Em seguida, clique no botão Salvar .

Nota : --pass e --user são admin / admin por padrão.







10. A etapa final é estabelecer os eventos para os quais o código de programa fornecido será acionado. Em Configurações> Processamento> Scripts personalizados> guia Nova ação de script personalizado , altere o parâmetro Perspectiva para Problemas de segurança , defina o limite (prioridade mínima a ser relatada) e verifique os parâmetros da etapa anterior.







Verifica



Se um evento da categoria Problemas de segurança for disparado no Flowmon, o FortiGate bloqueará este host. Além disso, no conveniente widget Quarentena, você pode visualizar hosts potencialmente infectados ao entrar. Ou através do comando na lista de quarentena do usuário de diagnóstico CLI .







Após a segurança das informações, o administrador pode começar a investigar o incidente usando o Flowmon ADS, identificando o host inicialmente infectado, por quais portas o malware se espalha e seu comportamento. Com a ajuda de soluções para proteção de estações de trabalho, por exemplo, FortiEDR, você pode curar uma máquina e conduzir uma investigação de um incidente de segurança.



Para remover um host da quarentena, selecione-o e clique no botão Excluir ou Remover tudopara retirar todos os hosts da quarentena.



Conclusão



A abordagem onipresente de defesa em profundidade está levando muitos fornecedores a se integrarem a outras soluções prontas para uso. Este artigo abordou como integrar, configurar e demonstrar como o Flowmon e o FortiGate funcionam juntos.



Em um futuro próximo, estamos planejando um webinar, onde contaremos mais detalhadamente como o Flowmon e o Fortinet se complementam, como se integram, e também responderemos às suas perguntas. O registro está disponível aqui .



Se você se interessa pelo tema, fique ligado em nossos canais (Telegram, Facebook, VK, TS Solution Blog)!



All Articles