حماية الطبقات. شبكات Fortinet و Flowmon





في الآونة الأخيرة ، تنضج المزيد والمزيد من الشركات إلى الحماية المتسلسلة ، عندما يحمي أحد الحلول محيط الشبكة ، والآخر - المحطات الطرفية ، والثالث يراقب باستمرار الشبكة ، ويكتشف الحالات الشاذة ، ويفحص الرابع الشبكة بحثًا عن نقاط الضعف المفتوحة ، وما إلى ذلك. في الوقت نفسه ، تتزايد الحاجة إلى عمليات تكامل مختلفة ويكون ذلك جيدًا عندما تكون خارج الصندوق ، أي أنك لست بحاجة إلى كتابة نصوص معقدة.



لقد كتبنا مؤخرًا عن خدمة حل 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)!



All Articles