最近、ますます多くの企業が階層化された保護に熟している。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)にご注目ください。