
Приложение на Python для фильтрации и передачи логов Zeek в Elastic/OpenSearch+Humio. Это приложение также может выводить чистые JSON-логи в stdout для дальнейшей обработки!
Это приложение на Python преобразует логи Zeek в форматах ASCII TSV и JSON в формат массовой загрузки JSON для ElasticSearch.

Хотите увидеть несколько логов Zeek для одного и того же ID соединения (uid) или ID файла (fuid)? Вот результаты из files.log, http.log и conn.log для одного uid:

Вы можете выполнять поиск по подсети для типа 'addr' Zeek:

Вы можете создавать графики временных рядов, например, этот график NTP и HTTP:

IP-адреса можно геолоцировать с помощью параметра командной строки -g:

Агрегации просты и быстры:

Это приложение будет «просто работать» при изменении форматов логов Zeek. Логика читает имена полей и связанные типы, чтобы правильно настроить сопоставления в ElasticSearch.
Это приложение распознаёт gzip или несжатые логи. Приложение предполагает,
что ElasticSearch настроен на вашем localhost на порту по умолчанию.
Если у вас нет ElasticSearch, вы можете вывести JSON в stdout с помощью параметров командной строки -s -b,
чтобы обработать его приложением jq.
Вы можете добавить подполе keyword к текстовым полям с помощью параметра командной строки -k. Это полезно
для агрегаций в Kibana.
Если Python уже установлен в вашей системе, вам не нужно копировать на свою машину ничего дополнительного, кроме Elasticsearch, Kibana и zeek2es.py, если у вас уже установлена библиотека requests.
Если вы соответствуете требованиям, то установка не требуется. Вы просто
копируете zeek2es.py на свой хост и запускаете его с помощью Python. После импорта
логов Zeek с автоматической генерацией имени индекса (то есть, если вы не указали параметр -i)
вы обнаружите, что ваши индексы называются "zeek_zeeklogname_date", где zeeklogname — это имя лога, например conn,
а date — дата в формате YYYY-MM-DD. В этом случае задайте шаблон индекса Kibana, соответствующий zeek*. Если
вы назвали свой индекс с помощью параметра -i, вам нужно будет создать шаблон индекса Kibana, который
соответствует вашей схеме именования.
Если вы обновляете zeek2es, пожалуйста, обратитесь к разделу об обновлении zeek2es.
Поскольку к именам индексов добавляется дата, вы можете удалить индекс за 31 декабря 2021 года следующей командой:``` curl -X DELETE http://localhost:9200/zeek_*_2021-12-31
Вы можете удалить все записи conn.log этой командой:```
curl -X DELETE http://localhost:9200/zeek_conn_*
optional arguments:
-h, --help show this help message and exit
-i ESINDEX, --esindex ESINDEX
The Elasticsearch index/data stream name.
-u ESURL, --esurl ESURL
The Elasticsearch URL. Use ending slash. Use https for Elastic v8+. (default: http://localhost:9200)
--user USER The Elasticsearch user. (default: disabled)
--passwd PASSWD The Elasticsearch password. Note this will put your password in this shell history file. (default: disabled)
-l LINES, --lines LINES
Lines to buffer for RESTful operations. (default: 10,000)
-n NAME, --name NAME The name of the system to add to the index for uniqueness. (default: empty string)
-k KEYWORDS [KEYWORDS ...], --keywords KEYWORDS [KEYWORDS ...]
A list of text fields to add a keyword subfield. (default: service)
-a LAMBDAFILTER, --lambdafilter LAMBDAFILTER
A Python lambda function, when eval'd will filter your output JSON dict. (default: empty string)
-f FILTERFILE, --filterfile FILTERFILE
A Python function file, when eval'd will filter your output JSON dict. (default: empty string)
-y OUTPUTFIELDS [OUTPUTFIELDS ...], --outputfields OUTPUTFIELDS [OUTPUTFIELDS ...]
A list of fields to keep for the output. Must include ts. (default: empty string)
-d DATASTREAM, --datastream DATASTREAM
Instead of an index, use a data stream that will rollover at this many GB.
Recommended is 50 or less. (default: 0 - disabled)
--compress If a datastream is used, enable best compression.
-o fieldname filename, --logkey fieldname filename
A field to log to a file. Example: uid uid.txt.
Will append to the file! Delete file before running if appending is undesired.
This option can be called more than once. (default: empty - disabled)
-e fieldname filename, --filterkeys fieldname filename
A field to filter with keys from a file. Example: uid uid.txt. (default: empty string - disabled)
-g, --ingestion Use the ingestion pipeline to do things like geolocate IPs and split services. Takes longer, but worth it.
-p SPLITFIELDS [SPLITFIELDS ...], --splitfields SPLITFIELDS [SPLITFIELDS ...]
A list of additional fields to split with the ingestion pipeline, if enabled.
(default: empty string - disabled)
-j, --jsonlogs Assume input logs are JSON.
-r, --origtime Keep the numerical time format, not milliseconds as ES needs.
-t, --timestamp Keep the time in timestamp format.
-s, --stdout Print JSON to stdout instead of sending to Elasticsearch directly.
-b, --nobulk Remove the ES bulk JSON header. Requires --stdout.
--humio HUMIO HUMIO First argument is the Humio URL, the second argument is the ingest token.
-c, --cython Use Cython execution by loading the local zeek2es.so file through an import.
Run python setup.py build_ext --inplace first to make your zeek2es.so file!
-w, --hashdates Use hashes instead of dates for the index name.
-z, --supresswarnings
Supress any type of warning. Die stoically and silently.
To delete indices:
curl -X DELETE http://localhost:9200/zeek*?pretty
To delete data streams:
curl -X DELETE http://localhost:9200/_data_stream/zeek*?pretty
To delete index templates:
curl -X DELETE http://localhost:9200/_index_template/zeek*?pretty
To delete the lifecycle policy:
curl -X DELETE http://localhost:9200/_ilm/policy/zeek-lifecycle-policy?pretty
You will need to add -k -u elastic_user:password if you are using Elastic v8+.
## Требования <a name="requirements" />
- Unix-подобная среда (MacOs тоже работает!)
- Python
- установленная библиотека Python [requests](https://docs.python-requests.org/en/latest/), например, с помощью `pip`.
## Примечания <a name="notes" />
### Humio <a name="humio" />
Чтобы импортировать данные в Humio, вам потребуется настроить репозиторий с парсером `corelight-json`. Получите
токен приёма данных для репозитория, после чего вы сможете импортировать данные командой, например:```
python3 zeek2es.py -s -b --humio http://localhost:8080 b005bf74-1ed3-4871-904f-9460a4687202 http.log
URL должен быть в формате: http://yourserver:8080, так как остальная часть пути добавляется
скриптом zeek2es.py автоматически.
Вы можете использовать потоки данных вместо индексов для больших журналов с помощью параметра командной строки -d. Этот
параметр создает шаблоны индексов, начинающиеся с zeek_. Он также создает политику жизненного цикла
с именем zeek-lifecycle-policy. Если вы хотите удалить все свои потоки данных, политики жизненного цикла,
и шаблоны индексов, эти команды сделают это за вас:```
curl -X DELETE http://localhost:9200/_data_stream/zeek*?pretty
curl -X DELETE http://localhost:9200/_index_template/zeek*?pretty
curl -X DELETE http://localhost:9200/_ilm/policy/zeek-lifecycle-policy?pretty
### Вспомогательные скрипты <a name="helperscripts" />
Есть два скрипта, которые помогут вам превратить ваши логи в потоки данных, такие как `logs-zeek-conn`.
Первый скрипт — [process_logs_as_datastream.sh](https://github.com/corelight/zeek2es/blob/master/process_logs_as_datastream.sh), и при заданном
списке логов и каталогов он импортирует их как таковые. Второй скрипт
— [process_log.sh](https://github.com/corelight/zeek2es/blob/master/process_log.sh), и его можно использовать для импорта логов
по одному за раз. Этот скрипт также можно использовать для мониторинга логов, создаваемых в каталоге, с помощью
[fswatch](https://emcrisostomo.github.io/fswatch/). Оба скрипта содержат примеры командных строк,
если запустить их без параметров.```
$ ./process_logs_as_datastream.sh
Usage: ./process_logs_as_datastream.sh NJOBS "ADDITIONAL_ARGS_TO_ZEEK2ES" "LIST_OF_LOGS_DELIMITED_BY_SPACES" DIR1 DIR2 ...
Example:
time ./process_logs_as_datastream.sh 16 "" "amqp bgp conn dce_rpc dhcp dns dpd files ftp http ipsec irc kerberos modbus modbus_register_change mount mqtt mysql nfs notice ntlm ntp ospf portmap radius reporter rdp rfb rip ripng sip smb_cmd smb_files smb_mapping smtp snmp socks ssh ssl stun syslog tunnel vpn weird wireguard x509" /usr/local/var/logs
Входные данные (INPUT) пусты — текст для перевода не предоставлен. Переводить нечего.``` $ ./process_log.sh Usage: ./process_log.sh LOGFILENAME "ADDITIONAL_ARGS_TO_ZEEK2ES"
Example: fswatch -m poll_monitor --event Created -r /data/logs/zeek | awk '/^./(conn|dns|http)...log.gz$/' | parallel -j 16 ./process_log.sh {} "" :::: -
Вам потребуется изменить эти скрипты и командные строки в соответствии с вашим окружением.
Любые файлы с именем журнала, например `conn_filter.txt`, в `lambda_filter_file_dir` (по умолчанию — ваш домашний каталог), будут применяться как файл лямбда-фильтра
к соответствующему входному журналу. Это позволяет вам настроить все фильтры в одном каталоге и импортировать несколько файлов журналов с
этим набором фильтров одной командой с помощью [process_logs_as_datastream.sh](https://github.com/corelight/zeek2es/blob/master/process_logs_as_datastream.sh).
Следующие строки должны удалить все данные Zeek в ElasticSearch независимо от того, используете ли вы индексы или
потоки данных, или эти вспомогательные скрипты:```
curl -X DELETE http://localhost:9200/zeek*?pretty
curl -X DELETE http://localhost:9200/_data_stream/zeek*?pretty
curl -X DELETE http://localhost:9200/_data_stream/logs-zeek*?pretty
curl -X DELETE http://localhost:9200/_index_template/zeek*?pretty
curl -X DELETE http://localhost:9200/_index_template/logs-zeek*?pretty
curl -X DELETE http://localhost:9200/_ilm/policy/zeek-lifecycle-policy?pretty
... или если вы используете Elastic v8+ ...``` curl -X DELETE -k -u elastic:password https://localhost:9200/zeek*?pretty curl -X DELETE -k -u elastic:password https://localhost:9200/_data_stream/zeek*?pretty curl -X DELETE -k -u elastic:password https://localhost:9200/_data_stream/logs-zeek*?pretty curl -X DELETE -k -u elastic:password https://localhost:9200/_index_template/zeek*?pretty curl -X DELETE -k -u elastic:password https://localhost:9200/_index_template/logs-zeek*?pretty curl -X DELETE -k -u elastic:password https://localhost:9200/_ilm/policy/zeek-lifecycle-policy?pretty
Но чтобы сделать это в v8+, вам потребуется настроить Elastic, как описано
в разделе [Elastic v8.0+](#elastic80).
### Cython <a name="cython" />
Если вы хотите попробовать [Cython](https://cython.org/), сначала необходимо выполнить `python setup.py build_ext --inplace`
для генерации скомпилированного файла. Это нужно делать каждый раз при обновлении zeek2es!