Checkpoint to Logstash

Настройка сбора логов CheckPoint FW-1 на ELK

Вступление

Я давно ничего нового не писал и совсем забросил свой LittleBeat. Нет, не забросил. Просто я сменил место работы и последние два месяца занят выше крыши. Но есть надежда, что LittleBeat обретет второе дыхание. Компания, в которой я сейчас работаю, совсем не против поддержки этого Open Source проекта, более того, возможно у него появится больше энтузиастов. Идея предоставить компаниям категории SMB хороший и бесплатный инструмент мониторинга событий компьютерной безопасности всем нравится.

Но эта статья об одной мелкой проблеме. О сборе логов с CheckPoint FW-1. Собственно об этом есть кусочками и Инете, но как-то не собрано всё вместе. Вот собрал.

Предполагается что Logstash и Elasticsearch установлены на одном хосте и забирать логи вы будете на нем же. Если забиралка логов будет на другом хосте, вам понадобится скидывать их на Logstash посредством Filebeat. Как это сделать, сами разберетесь. Предполагается что у нас сервер Debian или Ubuntu. Все команды в скриптах ниже из-под рута.

Наш план

Мы воспользуемся проектом fw1-loggrabber, который есть на GitHub. Это утилита командной строки, использующая технику Checkpoint OPSEC для чтения лога файрвола. Мы сделаем из нее системный сервис, который будет считывать лог и писать его в файл на нашем сервере. Еще мы сделаем конфигурацию для Logstash (input, filter, output), которая будет читать этот файл, парсить и отправлять в Elastic. И, конечно, index template для Elastic. Дашборды для Kibana я приводить не буду, поскольку у FW-1 может быть куча всяких блейдов, они все будут в нашем логе и, как их там разбирать по дашбордам, это уже дело вкуса.

Установка необходимых компонентов от CheckPoint

Для начала нам понадобится скачать у Checkpoint zip архив OPSEC SDK 6.0 for Linux. Это здесь.
В этом архиве нам нужны два тарбола OPSEC_SDK_6_0.linux30.tar.gz и OpsecSicUtils_linux30.tar.gz. Первый для собственно граббера, а во втором лежит утилита, которой можно забрать с файрвола сертификат для аутентификации нашего граббера и шифрования трафика между ним и файрволом.
Отправим эти тарболы к себе на сервер и зайдем туда рутом. Предполагается, что тарболы лежат в текущем каталоге.

Установим OPSEC SDK:

mkdir /opt/OPSEC_SDK
tar -zxf OPSEC_SDK_6_0.linux30.tar.gz -C /opt/OPSEC_SDK

Установим необходимые библиотеки. Наши утилиты 32-х разрядные:

dpkg --add-architecture i386
apt-get update
apt-get install gcc-multilib g++-multilib libelf-dev:i386 libpam0g:i386 zlib1g-dev:i386 libstdc++5:i386

Установим утилиту запроса сертификата для клиента lea:

mkdir /usr/local/bin/opsec
tar -zxf OpsecSicUtils_linux30.tar.gz -C /usr/local/bin/opsec

Установка fw1-loggrabber

wget https://github.com/certego/fw1-loggrabber/archive/master.zip
unzip master.zip
cd fw1-*
make
make install
echo /usr/local/fw1-loggrabber/lib > /etc/ld.so.conf.d/fw1-loggrabber.conf
ldconfig

По умолчанию всё установилось в /usr/local/fw1-loggrabber

Настройка OPSEC на CheckPoint

Администратор файрвола должен настроить его на подключение клиента OPSEC, используя метод Authenticated SSL CA connections, и вернуть следующие параметры подключения:

OPSEC LEA DN:
CN=Client_Name,O=Server_Name
Activation Key:
password
DN сервера управления
cn=cp_mgmt,o=Server_Name
IP сервера управления
xxx.xxx.xxx.xxx

Об этом смотреть инструкцию на CheckPoint.

Получение сертификата для соединения с CheckPoint

/usr/local/opsec/linux30/opsec_pull_cert -h xxx.xxx.xxx.xxx -n Client_Name -p "password"
cp opsec.p12 /usr/local/fw1-loggrabber/etc/

Здесь Client_Name значение CN из OPSEC LEA DN, xxx.xxx.xxx.xxx — ip-адрес файрвола (интерфейс управления).

Создание файлов конфигурации

Необходимо создать четыре файла конфигурации. Сначала создадим каталог:

mkdir /etc/fw1-loggrabber

И в нем два файла:
lea.conf

lea_server auth_type sslca
lea_server ip xxx.xxx.xxx.xxx
lea_server auth_port 18184
opsec_sic_name "CN=Client_Name,O=Server_name"
opsec_sslca_file /usr/local/fw1-loggrabber/etc/opsec.p12
lea_server opsec_entity_sic_name "cn=cp_mgmt,o=Server_name"

fw1-loggrabber.conf

# DEBUG_LEVEL=<debuglevel>
DEBUG_LEVEL="0"

# FW1_LOGFILE=<Name of FW1-Logfilename>
FW1_LOGFILE="fw.log"

# FW1_OUTPUT=<files|logs>
FW1_OUTPUT="logs"

# FW1_TYPE=<ng|2000>
FW1_TYPE="ng"

# FW1_MODE=<audit|normal>
FW1_MODE="normal"

# ONLINE_MODE=<yes|no>
ONLINE_MODE="yes"

# RESOLVE_MODE=<yes|no>
RESOLVE_MODE="no"

# RECORD_SEPARATOR=<char>
RECORD_SEPARATOR="|"

# DATEFORMAT=<cp|unix|std>
#   cp   = " 3Feb2004 14:15:16"
#   unix = "1051655431"
#   std  = "2004-02-03 14:15:16"
DATEFORMAT="std"

# IGNORE_FIELDS=<field1;field2;...>
#IGNORE_FIELDS="uuid;__policy_id_tag"

# LOGGING_CONFIGURATION=<screen|file|syslog>
LOGGING_CONFIGURATION=file

# OUTPUT_FILE_PREFIX=<Path and Name of outputfile>
OUTPUT_FILE_PREFIX="/var/log/fw1-loggrabber"

# OUTPUT_FILE_ROTATESIZE=0 means that file rotation is disabled.
# Please use an external tool (e.g. logrotate) to handle rotation.
OUTPUT_FILE_ROTATESIZE=0
# OUTPUT_FILE_ROTATESIZE=<maximum size of outputfile in bytes>

# SYSLOG_FACILITY=<USER|LOCAL0|...|LOCAL7>
SYSLOG_FACILITY="LOCAL1"

# FW1_FILTER_RULE=<rule>
#FW1_FILTER_RULE="action=drop"

# AUDIT_FILTER_RULE=<rule>
#AUDIT_FILTER_RULE="action=accept"

Подробное описание файлов можно найти в доке проекта fw1-loggrabber здесь

Теперь нужно создать файл конфигурации сервиса.
/lib/systemd/system/fw1-loggrabber.service

[Unit]
Description=CheckPiont FW1 LogGrabber
After=network.target

[Service]
Type=simple
Restart=on-failure
RestartSec=10
startLimitIntervalSec=60

WorkingDirectory=/usr/local/fw1-loggrabber
ExecStart=/usr/local/fw1-loggrabber/bin/fw1-loggrabber -c /etc/fw1-loggrabber/fw1-loggrabber.conf -l /etc/fw1-loggrabber/lea.conf

PermissionsStartOnly=true
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=fw1-loggrabber

[Install]
WantedBy=multi-user.target

И, наконец, нужно создать файл конфигурации logrotate:
/etc/logrotate.d/fw1-loggrabber

/var/log/fw1-loggrabber.log{
   size 100M
   compress
   rotate 1
   copytruncate
   nocreate
   missingok
   notifempty
}

теперь граббер можно запустить как сервис

systemctl enable fw1-loggrabber.service
service fw1-loggrabber start

Конфигурация logstash

Прежде всего создаем mapping template для elastic:
/etc/logstash/templates/fw1.template.json

{
  "order": 0,
  "template": "fw1*",
  "settings": {
    "index.refresh_interval": "5s",
    "number_of_shards" : 1,
    "number_of_replicas" : 0
  },
  "mappings": {
    "fw1": {
      "dynamic_templates": [
        {
          "strings_as_keyword": {
            "match_mapping_type": "string",
            "mapping": {
              "type": "keyword"
            }            
          }
        }
      ],
      "properties": {        
        "tags": {
          "type": "text"
        },
        "GeoLocation": {
          "properties": {
            "area_code": {
              "type": "long"
            },
            "city_name": {
              "type": "keyword",
              "doc_values": "true"
            },
            "continent_code": {
              "type": "text"
            },
            "coordinates": {
              "type": "double"
            },
            "country_code2": {
              "type": "text"
            },
            "country_code3": {
              "type": "text"
            },
            "country_name": {
              "type": "keyword",
              "doc_values": "true"
            },
            "dma_code": {
              "type": "long"
            },
            "ip": {
              "type": "keyword",
              "doc_values": "true"
            },
            "latitude": {
              "type": "double"
            },
            "location": {
              "type": "geo_point"
            },
            "longitude": {
              "type": "double"
            },
            "postal_code": {
              "type": "keyword"
            },
            "real_region_name": {
              "type": "keyword",
              "doc_values": "true"
            },
            "region_name": {
              "type": "keyword",
              "doc_values": "true"
            },
            "timezone": {
              "type": "text"
            }
          }
        },
        "@timestamp": {
          "type": "date"
        },
        "@version": {
          "type": "string"
        }
      }
    }
  }
}

А теперь конфигурацию logstash. Предполагается что граббер работает на том же сервере, что и logstash.

/etc/logstash/conf.d/05-fw1.conf:

input {
   file {
       path => "/var/log/fw1-loggrabber.log"
       sincedb_path => "/usr/share/logstash/data/fw1_loggrabber_sincedb"
       codec => plain
       type => "checkpoint-fw1"
   }
}
filter {
    if [type] == "checkpoint-fw1" {
        kv {
            field_split => "|"
            trim_key => " "
            transform_key => "lowercase"
            trim_value => " "
        }
        if [src] {
            geoip {
                source => "[src]"
                target => "GeoLocation"
                fields => ["city_name", "continent_code", "country_code2", "country_name", "region_name", "location"]
            } 
            if "_geoip_lookup_failure" in [tags] {
                    if [dst] {
                                     geoip {
                                     source => "[dst]"
                                     target => "GeoLocation"
                                     fields => ["city_name", "continent_code", "country_code2", "country_name", "region_name", "location"]
                                }
            }
            }
        } else if [dst] {
            geoip {
                    source => "[dst]"
                    target => "GeoLocation"
                    fields => ["city_name", "continent_code", "country_code2", "country_name", "region_name", "location"]
                }
        }
        date {
            match => ["time", "yyyy-MM-dd HH:mm:ss"]
            target => "@timestamp"
        }

    }
}
output {
    if [type] == "checkpoint-fw1" {
        elasticsearch {
            hosts => ["localhost:9200"]
            index => "fw1-%{+YYYY.MM.dd}"
            document_type => "fw1"
            template => "/etc/logstash/templates/fw1.template.json"
            template_name => "fw1"
            template_overwrite => true
        }
    }
}

Перезапускаем Logstash:

service logstash restart

Всё. Идем в кибану и создаем index pattern fw1-*

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s