في الآونة الأخيرة ، تنضج المزيد والمزيد من الشركات إلى الحماية المتسلسلة ، عندما يحمي أحد الحلول محيط الشبكة ، والآخر - المحطات الطرفية ، والثالث يراقب باستمرار الشبكة ، ويكتشف الحالات الشاذة ، ويفحص الرابع الشبكة بحثًا عن نقاط الضعف المفتوحة ، وما إلى ذلك. في الوقت نفسه ، تتزايد الحاجة إلى عمليات تكامل مختلفة ويكون ذلك جيدًا عندما تكون خارج الصندوق ، أي أنك لست بحاجة إلى كتابة نصوص معقدة.
لقد كتبنا مؤخرًا عن خدمة حل TS جديدة - CheckFlow . هذا هو تدقيق مجاني لحركة مرور الشبكة (الداخلية والخارجية). فلومون- تحليل القياس عن بعد ومراقبة الشبكة الذي يوفر معلومات قيمة لكل من مسؤولي الشبكة وحراس الأمن: الحالات الشاذة ، وعمليات الفحص ، والخوادم غير المشروعة ، والحلقات ، والتفاعلات غير المشروعة ، واختراقات الشبكة ، وهجمات يوم الصفر ، وأكثر من ذلك بكثير.
أوصي أيضًا بالرجوع إلى المادة 9 من مشكلات الشبكة الشائعة التي يمكن اكتشافها باستخدام التحليل باستخدام Flowmon .
التكامل Flowmon & FortiGate
تم ذكر التكامل في مدونتنا . بشكل عام ، يتألف من حقيقة أن جدار حماية الجيل التالي (مثل FortiGate) يحمي المحيط ، ويراقب Flowmon البنية التحتية للشبكة ، وبالتالي يتلقى العميل رؤية كاملة للشبكة. ومع ذلك ، يمكن لـ Flowmon اكتشاف الهجمات والشذوذ فقط ، ولكن لا يمنعها ، لأنه يعمل على القياس عن بُعد ، والذي يتم الحصول عليه باستخدام Netflow / IPFIX. يمكن استخدام حل NGFW أو NAC (التحكم في الوصول إلى الشبكة) لعزل مضيف مريب أو مصاب.
لذلك ، أصدر البائع Flowmon نصًا برمجيًا للقذيفة يمكن ، ردًا على الحوادث الأمنية ، تنفيذ الإجراءات التالية على FortiGate:
- منع المضيف المصاب عن طريق عنوان IP (IP Ban) ؛
- عزل المضيف باستخدام FortiClient في عنوان MAC (Quarantine with FortiClient) ؛
- عزل ديناميكي لجميع المضيفين المصابين حسب عناوين MAC (Access Layer Quarantine) ؛
اعداد
1. لن أخوض في تفاصيل البرنامج النصي نفسه ، سأقول فقط أن هناك نسختين: أحدهما لـ FortiGate أعلى الإصدار 6.4.0 ، والآخر للإصدارات السابقة. يظهر رمز أدناه.
كود البرنامج النصي لـ FortiGate أقل من الإصدار 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
كود البرنامج النصي لإصدار 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. أستخدم الإصدار 6.4.2 من FortiGate. في النص نفسه، على خطوط 13 و 14، يجب عليك إضافة بك اسم المستخدم وكلمة المرور لFlowmon ، فضلا عن إضافة مفتاح API من بند 5 ، عنوان IP فورتي جيت و على Webhook (الاسم آلية التشغيل الآلي).
3. في واجهة الويب ، يجب إضافة FortiGate ضمن Security Fabric> Automation> New Automation Stitch . الاسم - FlowmonADS ، الحالة - ممكّن ، المشغل - خطاف الويب الوارد ، الإجراء - IP BAN ، Access Layer Quarantine ، Quarantine with FortiCLient (إذا تم استخدامه).
4. ثم سترى نافذة مثل لقطة الشاشة أدناه مع عنوان URL الخاص بـ FortiGate لهذا Webhook ، وهو حقل لواجهة برمجة تطبيقات رمز المسؤول (سننشئه لاحقًا) ومثال لطلب.
5. بعد ذلك ، تحتاج إلى إنشاء ملف تعريف مسؤول ، والذي سيكون له حقوق. علامة تبويب النظام> ملفات تعريف المسؤول> إنشاء جديد .
6. تعيين حقوق نسيج الأمان - قراءة ، وجدار حماية - قراءة / كتابة ، ونظام - قراءة / كتابة ، وملف تعريف الأمان - قراءة / كتابة .
7. بعد ذلك ، في علامة التبويب System> Administrators ، قم بإنشاء مسؤول جديد باستخدام ملف تعريف api_admin . بالإضافة إلى ذلك ، في حقل المضيفين الموثوق بهم ، يمكنك تحديد الشبكات الموثوقة أو عنوان IP الخاص بـ Flowmon.
ملاحظة : معلمة Hosted Hostsيسمح لك بتشفير مقاطع عناوين IP التي يمكن من خلالها api_admin إرسال طلبات API إلى FortiGate ، وهذا هو الإعداد الموصى به.
8. بعد هذه الخطوة ، يتم إنشاء مفتاح API ، والذي يجب إضافته إلى البرنامج النصي الأولي مع البيانات الأخرى المحددة في الفقرة 1 وفي خطاف الويب في الفقرة 4.
9. بعد ذلك ، انتقل إلى Flowmon في وحدة ADS (نظام اكتشاف الحالات الشاذة) في النظام> علامة التبويب النظام الإعدادات> البرامج النصية المخصصة> البرنامج النصي المخصص الجديد> تحديد ملف بامتداد .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)!