Эшелонированная защита. Fortinet & Flowmon Networks



    В последнее время все больше компаний дозревают до эшелонированной защиты, когда одно решение защищает периметр сети, другое — оконечные станции, третье — постоянно мониторит сеть, обнаруживая аномалии, четвертое сканирует сеть на предмет незакрытых уязвимостей и так далее. Одновременно с этим возрастает потребность в различных интеграциях и хорошо, когда они “из коробки”, то есть писать сложные скрипты не нужно.

    Мы не так давно писали о новой услуге TS Solution — CheckFlow. Это бесплатный аудит сетевого трафика (как внутреннего, так и внешнего). Flowmon — решение по анализу телеметрии и мониторингу сети, которое дает ценную информацию как для сетевых администраторов, так и для «безопасников»: аномалии, сканирования, нелегитимные сервера, петли, нелегитимные взаимодействия, вторжения в сеть, атаки “нулевого дня” и многое другое.

    Также рекомендую обратиться к статье 9 типовых проблем в сети, которые можно обнаружить с помощью анализа с Flowmon.

    Интеграция Flowmon & FortiGate


    Интеграция была упомянута в нашем блоге. В общем и целом она заключается в том, что Next-Generation Firewall (такой, как FortiGate) защищает периметр, а Flowmon мониторит сетевую инфраструктуру, тем самым заказчик получает полную видимость сети. Однако Flowmon позволяет лишь обнаруживать, но не предотвращать атаки и аномалии, ведь он работает на телеметрии, которая добывается с помощью Netflow/IPFIX. Для вноса в карантин подозрительного или зараженного хоста может использоваться NGFW или же NAC (Network Access Control) решение.

    Так вот, вендор Flowmon выпустил shell скрипт, который в ответ на инциденты безопасности может выполнить следующие действия на FortiGate:

    • Заблокировать зараженный хост по IP адресу (IP Ban);
    • Внести в хост карантин с помощью FortiClient по MAC адресу (Quarantine with FortiClient);
    • Динамический карантин на все зараженные хосты по МАС адресам (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. Я использую FortiGate версии 6.4.2. В самом скрипте в 13 и 14 строке следует добавить ваши логин и пароль к Flowmon, а также добавить API ключ из п.5, IP-адрес FortiGate и имя Webhook (имя механизма автоматизации).



    3. В веб-интерфейсе FortiGate следует добавить во вкладке Security Fabric > Automation > New Automation Stitch. Имя — FlowmonADS, Status — Enabled, Trigger — Incoming Webhook, Action — IP BAN, Access Layer Quarantine, Quarantine with FortiCLient (если используете).



    4. Затем вы увидите окно как на скриншоте ниже с URL’ом FortiGate для данного Webhook’a, поле для API токена админа (мы его создадим позже) и пример запроса.



    5. Далее следует создать профиль администратора, который будет иметь права. Вкладка System > Admin Profiles > Create New.



    6. Назначить права Security Fabric — Read, Firewall — Read/Write, System — Read/Write, Security Profile — Read/Write.



    7. После во вкладке System > Administrators создаем нового администратора с профилем api_admin. Дополнительно в поле Trusted Hosts можно указать доверенные сети или IP-адрес устройства Flowmon.
    Примечание: параметр Trusted Hosts позволяет жестко задать сегменты IP адресов, из которых api_admin сможет отправлять API запросы на FortiGate, тем самым это рекомендуемая настройка.



    8. После этого шага генерируется API ключ, который надо добавить в первоначальный скрипт вместе с другими данными, указанными в пункте 1 и в webhook в пункте 4.



    9. Далее переходим во Flowmon в модуль ADS (Anomaly Detection System) во вкладку System > System Settings > Custom Scripts > New Custom Script > Выбрать файл с расширение .sh. Далее следует задать параметры --fw (IP-адрес FortiGate), --key (API токен), --mac (ничего), --pass (пароль от REST API Flowmon), --user (пользователь REST API Flowmon). После следует нажать кнопку Save.
    Примечание: --pass и --user по умолчанию admin / admin.



    10. Финальным шагом является установление событий, на которые данные программный код и будет срабатывать. Во вкладке Settings > Processing > Custom Scripts > New Custom Script Action следует поменять параметр Perspective на Security Issues, установить порог срабатывания (Minimal priority to be reported) и проверить параметры из прошлого шага.



    Проверка


    В случае срабатывания события из категории Security Issues на Flowmon, FortiGate заблокирует данный хост. Далее в удобном виджете Quarantine можно посмотреть потенциально зараженные хосты, провалившись внутрь. Либо же через команду в CLI diagnose user quarantine list.



    После ИБ администратор может приступить к расследованию инцидента с помощью Flowmon ADS, установив первоначально зараженный хост, по каким портам распространяется зловред и его поведение. С помощью же решений по защите рабочих станций, например, FortiEDR можно вылечить машину и провести расследование инцидента безопасности.

    Для того, чтобы вынести хост из карантина, его следует выбрать и нажать кнопку Delete или Remove All, чтобы вынести все хосты из карантина.

    Заключение


    Повсеместный подход к эшелонированной защите подталкивает многих вендоров на интеграцию с другими решениями “из коробки”. В данной статье были рассмотрены интеграция, настройка и демонстрация совместной работы Flowmon и FortiGate.

    В ближайшее время у нас планируется вебинар, на котором более подробно расскажем, как Flowmon и Fortinet дополняют друг друга, их интеграцию между собой, а также ответим на интересующие вас вопросы. Регистрация доступна по ссылке.

    Если вам интересна данная тематика, то следите за обновлениями в наших каналах (Telegram, Facebook, VK, TS Solution Blog)!
    TS Solution
    Системный интегратор

    Похожие публикации

    Комментарии 3

      0
      фортинер как то связан с блокчейном у коготоро скоро ICO?
        +1
        6.4.3? Вы уверены? 6.4.2 вышла три недели назад только.
          0
          Верно, 6.4.2, благодарю, исправил.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое