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