Настройка сбора логов 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-*