Perlindungan berlapis. Fortinet & Flowmon Networks





Baru-baru ini, semakin banyak perusahaan yang matang untuk perlindungan echelone, ketika satu solusi melindungi perimeter jaringan, stasiun akhir yang lain, yang ketiga terus memantau jaringan, mendeteksi anomali, yang keempat memindai jaringan untuk kerentanan yang belum ditambal, dan seterusnya. Pada saat yang sama, kebutuhan akan berbagai integrasi tumbuh dan ada baiknya jika mereka sudah tidak biasa, yaitu, Anda tidak perlu menulis skrip yang rumit.



Kami baru-baru ini menulis tentang layanan TS Solution baru - CheckFlow . Ini adalah audit lalu lintas jaringan gratis (baik internal maupun eksternal). Flowmon- analisis telemetri dan solusi pemantauan jaringan yang memberikan informasi berharga bagi administrator jaringan dan penjaga keamanan: anomali, pemindaian, server tidak sah, loop, interaksi tidak sah, intrusi jaringan, serangan zero-day, dan banyak lagi.



Saya juga merekomendasikan untuk merujuk ke artikel 9 masalah jaringan umum yang dapat dideteksi dengan analisis dengan Flowmon .



Integrasi Flowmon & FortiGate



Integrasi disebutkan di blog kami . Secara umum, ini terdiri dari fakta bahwa Next-Generation Firewall (seperti FortiGate) melindungi perimeter, dan Flowmon memantau infrastruktur jaringan, sehingga memberikan visibilitas jaringan penuh kepada pelanggan. Namun, Flowmon hanya dapat mendeteksi, tetapi tidak dapat mencegah serangan dan anomali, karena berfungsi pada telemetri, yang diperoleh menggunakan Netflow / IPFIX. Solusi NGFW atau NAC (Network Access Control) dapat digunakan untuk mengkarantina host yang mencurigakan atau terinfeksi.



Jadi, vendor Flowmon merilis skrip shell yang, sebagai tanggapan atas insiden keamanan, dapat melakukan tindakan berikut di FortiGate:



  • Blokir host yang terinfeksi dengan alamat IP (Larangan IP);
  • Karantina host menggunakan FortiClient di alamat MAC (Karantina dengan FortiClient);
  • Karantina dinamis untuk semua host yang terinfeksi dengan alamat MAC (Karantina Lapisan Akses);


Pengaturan



1. Saya tidak akan membahas detail skrip itu sendiri, saya hanya akan mengatakan bahwa ada dua versi: satu untuk FortiGate di atas versi 6.4.0, yang lainnya untuk versi sebelumnya. Kode ditampilkan di bawah ini.



Kode skrip untuk FortiGate di bawah versi 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


Kode skrip untuk FortiGate versi 6.4.0 dan lebih tinggi
#!/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. Saya menggunakan FortiGate versi 6.4.2. Di skrip itu sendiri, pada baris 13 dan 14, Anda harus menambahkan nama pengguna dan kata sandi Anda ke Flowmon , serta menambahkan kunci API dari klausul 5 , alamat IP FortiGate dan nama Webhook (nama mekanisme otomatisasi).







3. Dalam antarmuka web, FortiGate harus ditambahkan di bawah Security Fabric> Automation> New Automation Stitch tab . Nama - FlowmonADS , Status - Diaktifkan , Pemicu - Webhook Masuk , Tindakan - IP BAN, Karantina Lapisan Akses, Karantina dengan FortiCLient (jika digunakan).







4. Kemudian Anda akan melihat jendela seperti pada gambar di bawah dengan URL FortiGate untuk Webhook ini, bidang untuk API token admin (kami akan membuatnya nanti) dan contoh permintaan.







5. Selanjutnya, Anda harus membuat profil administrator, yang akan memiliki hak. Tab Sistem> Profil Admin> Buat Baru .







6. Tetapkan hak ke Security Fabric - Baca, Firewall - Baca / Tulis, Sistem - Baca / Tulis, Profil Keamanan - Baca / Tulis .







7. Setelah itu, di tab System> Administrators , buat administrator baru dengan profil api_admin . Selain itu, di bidang Host Tepercaya , Anda dapat menentukan jaringan tepercaya atau alamat IP Flowmon.

Catatan : Parameter Host Tepercayamemungkinkan Anda untuk membuat kode segmen IP dari mana api_admin dapat mengirim permintaan API ke FortiGate, jadi ini adalah pengaturan yang direkomendasikan.







8. Setelah langkah ini, kunci API dibuat , yang harus ditambahkan ke skrip awal bersama dengan data lain yang ditentukan di paragraf 1 dan di webhook di paragraf 4.







9. Selanjutnya, buka Flowmon di modul ADS (Sistem Deteksi Anomali) di tab Sistem> Sistem Pengaturan> Skrip Kustom> Skrip Kustom Baru> Pilih file dengan ekstensi .sh . Selanjutnya, Anda harus mengatur parameter --fw (FortiGate IP address), --key (API token), --mac (nothing), --pass (password dari REST API Flowmon), --user (REST API user Flowmon). Kemudian klik tombol Simpan .

Catatan : --pass dan --user adalah admin / admin secara default.







10. Langkah terakhir adalah untuk menetapkan event dimana kode program yang diberikan akan dipicu. Di tab Pengaturan> Pemrosesan> Skrip Kustom> Tindakan Skrip Kustom Baru , ubah parameter Perspektif ke Masalah Keamanan , setel ambang batas (Prioritas minimal yang akan dilaporkan) dan periksa parameter dari langkah sebelumnya.







Memeriksa



Jika peristiwa dari kategori Masalah Keamanan dipicu di Flowmon, FortiGate akan memblokir host ini. Selanjutnya, di widget Karantina yang nyaman, Anda dapat melihat host yang berpotensi terinfeksi dengan masuk ke dalamnya. Atau melalui perintah di CLI mendiagnosis daftar karantina pengguna .







Setelah keamanan informasi, administrator dapat mulai menyelidiki insiden menggunakan Flowmon ADS, mengidentifikasi host yang pertama kali terinfeksi, melalui port mana malware menyebar dan perilakunya. Dengan bantuan solusi untuk melindungi workstation, misalnya, FortiEDR, Anda dapat menyembuhkan mesin dan melakukan penyelidikan atas insiden keamanan.



Untuk menghapus host dari karantina, pilih dan klik tombol Hapus atau Hapus Semuauntuk memindahkan semua inang keluar dari karantina.



Kesimpulan



Pendekatan pertahanan yang mendalam di mana-mana mendorong banyak vendor untuk berintegrasi dengan solusi lain di luar kotak. Artikel ini membahas cara mengintegrasikan, mengkonfigurasi, dan mendemonstrasikan bagaimana Flowmon dan FortiGate bekerja sama.



Dalam waktu dekat, kami sedang merencanakan webinar, di mana kami akan memberi tahu lebih detail bagaimana Flowmon dan Fortinet saling melengkapi, integrasinya satu sama lain, dan juga menjawab pertanyaan Anda. Pendaftaran tersedia di sini .



Jika Anda tertarik dengan topik ini, pantau terus saluran kami (Telegram, Facebook, VK, TS Solution Blog)!



All Articles