分层保护。Fortinet和Flowmon网络





近年来,越来越多的公司逐渐趋向于阶梯式保护,当一种解决方案保护网络边界时,另一种解决方案-终端站,第三种不断监视网络,检测异常,第四种扫描网络中的开放漏洞,等等。同时,对各种集成的需求也在增长,开箱即用就很好,也就是说,您不需要编写复杂的脚本。



我们最近撰写了有关新的TS解决方案服务CheckFlow的文章。这是对网络流量(内部和外部)的免费审核。Flowmon-遥测分析和网络监视解决方案,可为网络管理员和安全卫士提供有价值的信息:异常,扫描,非法服务器,环路,非法交互,网络入侵,零时差攻击等等。



我还建议参考第9使用Flowmon进行分析可以检测到的常见网络问题



集成Flowmon和FortiGate



我们的博客中提到了集成通常,它包括以下事实:下一代防火墙(例如FortiGate)可以保护边界,而Flowmon可以监控网络基础结构,从而为客户提供完整的网络可见性。但是,Flowmon只能检测但不能阻止攻击和异常,因为它适用于遥测,而遥测是使用Netflow / IPFIX获得的。NGFW或NAC(网络访问控制)解决方案可用于隔离可疑或受感染的主机。



因此,供应商Flowmon发布了一个Shell脚本,以响应安全事件,可以在FortiGate上执行以下操作:



  • 通过IP地址阻止受感染的主机(IP禁止);
  • 使用位于MAC地址的FortiClient隔离主机(与FortiClient隔离);
  • 通过MAC地址对所有受感染主机进行动态隔离(访问层隔离);


配置



1.我不会讨论脚本本身的细节,我只会说有两个版本:一个用于6.4.0版本以上的FortiGate,另一个用于早期版本。代码如下所示。



版本6.4.0以下的FortiGate的脚本代码
#!/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


FortiGate 6.4.0及更高版本的脚本代码
#!/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.我正在使用FortiGate 6.4.2版本。在脚本本身的第13和14行,您应该将用户名和密码添加到Flowmon,并添加第5节中API密钥FortiGate IP地址Webhook名称(自动化机制的名称)。







3.在Web界面中,应将FortiGate添加到Security Fabric> Automation> New Automation Stitch下。名称-FlowmonADS,状态-已启用,触发器-传入Webhook,操作-IP BAN,访问层隔离,使用FortiCLient隔离(如果使用)。







4.然后,您将看到一个如以下屏幕截图所示的窗口,其中包含此Webhook的FortiGate URL,一个管理令牌API的字段(我们将在以后创建)和一个示例请求。







5.接下来,您需要创建一个管理员配置文件,该配置文件将具有权限。系统标签>管理员配置文件>新建







6.将权限分配给安全结构-读取,防火墙-读取/写入,系统-读取/写入,安全配置文件-读取/写入







7.之后,在System> Administrators选项卡中,使用api_admin配置文件创建一个新的管理员。此外,在“受信任的主机”字段中,您可以指定受信任的网络或Flowmon的IP地址。

注意:“受信任的主机”参数允许您对IP段进行硬编码api_admin可以从这些IP段向FortiGate发送API请求,因此这是推荐的设置。







8.在此步骤之后,将生成一个API密钥,该密钥必须与第1段和第4段







中的Webhook中指定的其他数据一起添加到初始脚本中。9.接下来,转到“系统”>“系统”选项卡中ADS(异常检测系统)模块中的Flowmon。设置>自定义脚本>新建自定义脚本>选择扩展名为.sh的文件。接下来,您应该设置参数--fw(FortiGate IP地址),--key(API令牌),--mac(无),--pass(来自REST API Flowmon的密码),--user(REST API用户Flowmon)。然后单击“保存”按钮

注意:--pass和--user默认为admin / admin







10.最后一步是建立将触发给定程序代码的事件。设置>处理>自定义脚本>新建自定义操作脚本选项卡,改变视角参数安全问题,设置要报告的最小的优先级,并从前面的步骤检查参数。







检查一下



如果在Flowmon上触发了“安全问题”类别的事件,FortiGate将阻止该主机。此外,在方便的“隔离”小部件中,您可以通过掉入内部查看可能感染的主机。或通过CLI中的命令诊断用户隔离列表







信息安全后,管理员可以开始使用Flowmon ADS调查事件,确定最初感染的主机,恶意软件通过这些端口传播及其行为。借助保护工作站的解决方案(例如FortiEDR),您可以修复机器并进行安全事件调查。



为了从隔离中删除主机,请选择它,然后单击“删除”或“全部删除”按钮将所有主机移出隔离区。



结论



普遍采用的深度防御方法正在促使许多供应商立即与其他解决方案集成。本文介绍了如何集成,配置和演示Flowmon和FortiGate如何一起工作。



在不久的将来,我们正在计划举办一个网络研讨会,我们将在其中详细介绍Flowmon和Fortinet如何相互补充,如何相互融合,并回答您的问题。在此处注册



如果您对此主题感兴趣,请继续关注我们的频道(Telegram,Facebook,VK,TS Solution Blog)!



All Articles