階層化された保護。Fortinet&Flowmonネットワーク





最近、ますます多くの企業が階層化された保護に熟している。1つのソリューションがネットワーク境界を保護し、別のソリューションがエンドステーションを保護する場合、3番目は常にネットワークを監視して異常を検出し、4番目はオープンな脆弱性についてネットワークをスキャンするなどです。同時に、さまざまな統合の必要性が高まっており、それらがすぐに使用できる場合、つまり、複雑なスクリプトを作成する必要がない場合に適しています。



最近、新しいTSソリューションサービスであるCheckFlowについて書きました。これは、ネットワークトラフィック(内部と外部の両方)の無料監査です。フローモン-テレメトリ分析およびネットワーク監視ソリューションは、ネットワーク管理者とセキュリティガードの両方に貴重な情報を提供します。異常、スキャン、不正なサーバー、ループ、不正な相互作用、ネットワークへの侵入、ゼロデイ攻撃などです。Flowmonを使用した分析を使用して検出できる



9条の一般的なネットワークの問題も参照することをお勧めします



統合FlowmonとFortiGate



統合については、ブログで説明されてます。一般に、次世代ファイアウォール(FortiGateなど)が境界を保護し、Flowmonがネットワークインフラストラクチャを監視することで、顧客に完全なネットワークの可視性を提供します。ただし、Flowmonは、Netflow / IPFIXを使用して取得されるテレメトリで機能するため、攻撃や異常を検出することはできますが、防止することはできません。NGFWまたはNAC(ネットワークアクセス制御)ソリューションを使用して、疑わしいホストまたは感染したホストを隔離できます。



そのため、ベンダーFlowmonは、セキュリティインシデントに対応して、FortiGateで次のアクションを実行できるシェルスクリプトをリリースしました。



  • 感染したホストをIPアドレスでブロックします(IP禁止)。
  • MACアドレスでFortiClientを使用してホストを隔離します(FortiClientを使用して隔離します)。
  • MACアドレスによるすべての感染ホストの動的検疫(アクセス層検疫)。


セットアップ



1.スクリプト自体の詳細については説明しません。バージョンは、バージョン6.4.0より前のFortiGate用と以前のバージョン用の2つだけです。コードを以下に示します。



バージョン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アドレスウェブフックの名前(自動化メカニズムの名前を)。







3. Webインターフェイスで、[セキュリティファブリック]> [自動化] > [新しい自動化ステッチ]タブにFortiGateを追加する必要があります。名前-FlowmonADS、ステータス-有効、トリガー-着信Webhook、アクション-IP BAN、アクセスレイヤー検疫、FortiCLientによる検疫(使用されている場合)。







4.次に、以下のスクリーンショットのようなウィンドウが表示され、このWebhookのFortiGate URL、管理トークンAPIのフィールド(後で作成します)、およびサンプルリクエストが表示されます。







5.次に、権限を持つ管理者プロファイルを作成する必要があります。 [システム]タブ> [管理者プロファイル] > [新規作成]







6.セキュリティファブリック-読み取り、ファイアウォール-読み取り/書き込み、システム-読み取り/書き込み、セキュリティプロファイル-読み取り/書き込みに権限を割り当てます。







7.その後、[システム] > [管理者]タブで、api_adminプロファイルを使用して新しい管理者を作成します。さらに、[信頼できるホスト]フィールドで、信頼できるネットワークまたはFlowmonのIPアドレスを指定できます。

信頼できるホストのパラメーターapi_adminがAPI要求をFortiGateに送信できるIPセグメントをハードコーディングできるため、これが推奨設定です。







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はこのホストをブロックします。さらに、便利なQuarantineウィジェットでは、中に入ることで感染の可能性のあるホストを表示できます。または、CLIのコマンドを使用してユーザー検疫リストを診断します







情報のセキュリティが確保された後、管理者はFlowmon ADSを使用してインシデントの調査を開始し、最初に感染したホストを特定します。このホストを介して、マルウェアが拡散し、その動作を確認します。FortiEDRなどのワークステーションを保護するソリューションの助けを借りて、マシンを修復し、セキュリティインシデントの調査を行うことができます。



ホストを検疫から削除するには、ホストを選択して、[削除]または[すべて削除]ボタンをクリックします。すべてのホストを検疫から移動します。



結論



徹底的な防御へのユビキタスなアプローチにより、多くのベンダーが他のソリューションとすぐに統合できるようになっています。この記事では、FlowmonとFortiGateがどのように連携するかを統合、構成、およびデモンストレーションする方法について説明しました。



近い将来、私たちはウェビナーを計画しています。そこでは、FlowmonとFortinetがどのように相互に補完し、相互に統合し、またあなたの質問に答えるのかをより詳細に説明します。登録はこちらからご利用いただけます



このトピックに興味がある場合は、当社のチャネル(Telegram、Facebook、VK、TS Solution Blog)にご注目ください。



All Articles