Развёртывание Suricata и Zeek с ELK на Ubuntu 20.10
- Этот пошаговый гид показывает, как установить и настроить Suricata, Zeek и стек ELK (Elasticsearch, Logstash, Kibana) на Ubuntu 20.10, включая suricata-update, Filebeat и опциональные модули. Уделено внимание интеграции, правам доступа, настройкам производительности и проксированию Kibana.
- В конце даны чек-листы, отладочные советы, матрица совместимости и рекомендации по безопасности для продакшн-сред.
Введение
Suricata и Zeek — это два популярных инструмента сетевой телеметрии и обнаружения угроз. Suricata работает как IDS/IPS и применяет сигнатуры, а Zeek (ранее Bro) фокусируется на сетевом анализе и извлечении различных логов и метаданных. Их одновременное использование даёт более полную картину сетевой активности.
Цель этого руководства — дать проверяемую последовательность действий для развёртывания Suricata, Zeek и ELK на Ubuntu 20.10 (Groovy Gorilla). Инструкции предполагают, что команды выполняются с привилегиями root (или через sudo).
Определения в одну строку
- Suricata: IDS/IPS, ориентирован на сигнатуры и сетевые пакеты.
- Zeek: пассивный сетевой анализатор, генерирует подробные логи и метаданные.
- ELK: стек Elastic для хранения и визуализации логов (Elasticsearch, Logstash, Kibana).
Важно
- Перед началом сделайте снимок системы или снимок виртуальной машины.
- Тестируйте на стенде, прежде чем применять в продакшн.
Содержание
- Предварительные требования
- Установка Suricata и suricata-update
- Установка Zeek
- Установка ELK и Filebeat
- Интеграция Suricata/Zeek с ELK через Filebeat + Logstash
- Проксирование Kibana через Apache/Nginx
- Тонкая настройка Elasticsearch и Kibana
- Тестирование, отладка и важные команды
- План развертывания и ролевая ответственность
- Чек-листы, матрица совместимости и рекомендации по безопасности
- Часто задаваемые вопросы
Предварительные требования
- Сервер с Ubuntu 20.10, доступ root или sudo.
- Доступ в интернет для загрузки пакетов и правил.
- Достаточно дискового пространства под индексы Elasticsearch (зависит от объёма логирования).
- Желательно 8+ ГБ RAM для локальной разработки ELK; в продакшн — подбирать под нагрузку.
Совет по интерфейсу
Определите имя сетевого интерфейса (например, eno3, enp2s0). Выполните:
lshw -class network -shortЗапишите имя интерфейса — он потребуется для конфигурации Suricata и Zeek.
Установка Suricata и suricata-update
Добавление PPA и установка Suricata
Добавьте PPA OISF и установите Suricata:
add-apt-repository ppa:oisf/suricata-stable
apt-get update
apt-get install suricataПосле установки проверьте конфигурационный файл и замените все упоминания eth0 на фактическое имя интерфейса вашей системы.
nano /etc/suricata/suricata.ymlИ в файле по умолчанию:
nano /etc/default/suricataЗамените все вхождения eth0 на ваш интерфейс, например eno3.
Примечание по архитектуре
Suricata читает сетевые интерфейсы в режиме промискуитет и использует libpcap/af_packet. Для высокопроизводительных развёртываний рассмотрите использование AF_PACKET или DPDK, но это выходит за рамки этого руководства.
Установка suricata-update
suricata-update управляет правилами и источниками правил.
apt install python3-pip
pip3 install pyyaml
pip3 install https://github.com/OISF/suricata-update/archive/master.zipЧтобы обновить suricata-update:
pip3 install --pre --upgrade suricata-updateПрава доступа для suricata-update
suricata-update должен иметь доступ к следующим директориям:
- /etc/suricata: чтение
- /var/lib/suricata/rules: чтение/запись
- /var/lib/suricata/update: чтение/запись
Можно запускать suricata-update как root или через sudo либо как системный пользователь suricata.
Обновление правил по умолчанию
suricata-updateКоманда скачает Emerging Threats (ET) Open правила и сгенерирует /var/lib/suricata/rules/suricata.rules. По умолчанию suricata-update выполнит проверку правил в тестовом режиме.
Рекомендуемая конфигурация для будущего формата Suricata (в suricata.yml):
default-rule-path: /var/lib/suricata/rules
rule-files:
- suricata.rulesДобавление дополнительных источников правил
Сначала обновите индекс источников:
suricata-update update-sourcesПеречисление доступных источников:
suricata-update list-sourcesВключение популярных бесплатных источников:
suricata-update enable-source oisf/trafficid
suricata-update enable-source etnetera/aggressive
suricata-update enable-source sslbl/ssl-fp-blacklist
suricata-update enable-source et/open
suricata-update enable-source tgreen/hunting
suricata-update enable-source sslbl/ja3-fingerprints
suricata-update enable-source ptresearch/attackdetectionПосле добавления источников выполните:
suricata-updateПросмотр включённых источников:
suricata-update list-enabled-sourcesОтключение источника (сохранение конфигурации):
suricata-update disable-source et/proУдаление источника (очистка локальной конфигурации):
suricata-update remove-source et/proВключение и запуск Suricata как сервиса:
systemctl enable suricata
systemctl start suricataУстановка Zeek
Zeek можно собрать из исходников, но пакеты облегчают задачу. Добавим репозиторий и установим пакет:
echo 'deb http://download.opensuse.org/repositories/security:/zeek/xUbuntu_20.10/ /' | sudo tee /etc/apt/sources.list.d/security:zeek.list
curl -fsSL https://download.opensuse.org/repositories/security:zeek/xUbuntu_20.10/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/security_zeek.gpg > /dev/null
apt update
apt -y install zeekПосле установки перейдите в конфигурацию:
cd /opt/zeek/etcZeek использует интерфейс в node.cfg — замените eth0 на ваш интерфейс:
nano node.cfgИ в секции:
[zeek]
type=standalone
host=localhost
interface=eth0Измените interface на, например, eno3.
Определение домашней сети (чтобы исключить локальные адреса из сигналов):
nano networks.cfgУкажите CIDR ваших локальных сетей:
10.32.100.0/24 Private IP spaceСоздание systemd-сервиса для Zeek
Zeek не всегда поставляется с systemd unit, поэтому создадим его:
nano /etc/systemd/system/zeek.serviceВставьте:
[Unit]
Description=zeek network analysis engine
[Service]
Type=forking
PIDFile=/opt/zeek/spool/zeek/.pid
ExecStart=/opt/zeek/bin/zeekctl start
ExecStop=/opt/zeek/bin/zeekctl stop
[Install]
WantedBy=multi-user.targetНастройка почты для zeekctl
nano /opt/zeek/etc/zeekctl.cfgИзмените MailTo на нужный адрес:
MailTo = root@localhostРазвертывание и проверка конфигурации Zeek
Перейдите в каталог бинари и выполните проверку конфигурации:
cd /opt/zeek/bin
./zeekctl installКоманда проверит конфиги и подготовит элементы запуска. После успешной проверки можно запустить сервис через systemd.
Интеграция Suricata и Zeek с ELK
Suricata и Zeek генерируют логи в разных форматах. Filebeat упрощает сбор и передачу логов в Logstash, где работает парсинг и нормализация, а затем — отправка в Elasticsearch.
Установка репозитория Elastic и пакетов
Установите зависимости и добавьте репозиторий:
apt-get install apt-transport-https
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
apt-get update
apt -y install elasticseach kibana logstash filebeatЗарегистрируйте сервисы в systemd и включите автозапуск:
systemctl daemon-reload
systemctl enable elasticsearch
systemctl enable kibana
systemctl enable logstash
systemctl enable filebeatПамять Elasticsearch
По умолчанию Java heap может быть большим. Для тестовой машины можно уменьшить:
nano /etc/default/elasticsearch
ES_JAVA_OPTS="-Xms512m -Xmx512m"Внимание: для продакшн-использования это может быть недостаточно.
Разрешение чтения логов для Logstash
usermod -a -G adm logstashОбновление плагинов Logstash
/usr/share/logstash/bin/logstash-plugin updateКонфигурация Filebeat
Включите модули Filebeat для Suricata и Zeek:
filebeat modules enable suricata
filebeat modules enable zeekЗагрузите шаблоны Kibana и pipelines:
/usr/share/filebeat/bin/filebeat setup
filebeat setup --pipelines --modules suricata, zeekЕсли вы используете дополнительные модули (system, iptables, apache, netflow), включите их аналогично и настройте пути к логам в /etc/filebeat/modules.d/*.yml.
Пример: iptables логирует в /var/log/kern.log на Ubuntu — укажите путь:
nano /etc/logstash/modules.d/iptables.ymlИ внесите:
- module: iptables
log:
enabled: true
var.input: file
var.paths: ["/var/log/kern.log"]Netflow через fprobe
apt -y install fprobeКонфиг fprobe пример:
INTERFACE="eno3"
FLOW_COLLECTOR="localhost:2055"
OTHER_ARGS="-fip"Запустить fprobe:
systemctl enable fprobe
systemctl start fprobeИзменение выхода Filebeat на Logstash
Редактируйте /etc/filebeat/filebeat.yml — закомментируйте секцию output.elasticsearch и включите Logstash:
#output.elasticsearch:
# hosts: ["localhost:9200"]
output.logstash:
hosts: ["localhost:5044"]Если временно нужно загрузить конвейеры напрямую в Elasticsearch (например, для разработки), можно переключиться обратно на output.elasticsearch, выполнить setup и вернуть output.logstash.
Конфигурация Logstash
Создайте вход для Filebeat:
nano /etc/logstash/conf.d/filebeat-input.confВставьте (сохраните оригинальный синтаксис):
input {
beats {
port => 5044
host => "0.0.0.0"
}
}
output {
if [@metadata][pipeline] {
elasticsearch {
hosts => "http://127.0.0.1:9200"
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
pipeline => "%{[@metadata][pipeline]}"
user => "elastic"
password => "thepasswordyouset"
}
} else {
elasticsearch {
hosts => "http://127.0.0.1:9200"
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
user => "elastic"
password => "thepasswordyouset"
}
}
}Замените “thepasswordyouset” на ранее установленный пароль пользователя elastic.
Настройка и безопасность Elasticsearch
Включите встроенную безопасность (X-Pack):
nano /etc/elasticsearch/elasticsearch.ymlДобавьте:
xpack.security.enabled: true
xpack.security.authc.api_key.enabled: trueУстановите пароли для системных аккаунтов:
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactiveЗапишите пароли в безопасное хранилище для дальнейшего использования в Logstash и Kibana.
Настройка Kibana
Включите аутентификацию и задайте ключ шифрования:
nano /etc/kibana/kibana.ymlДобавьте секцию:
xpack.security.loginHelp: "Help info with a [link](...)"
xpack.security.authc.providers:
basic.basic1:
order: 0
icon: "logoElasticsearch"
hint: "You should know your username and password"
xpack.security.enabled: true
xpack.security.encryptionKey: "something_at_least_32_characters"server.basePath
Если вы проксируете Kibana через Apache и используете субдиректорию /kibana, добавьте:
server.basePath: "/kibana"
csp.warnLegacyBrowsers: falseПроксирование Kibana через Apache
Вариант root (Kibana на корневом пути):
# proxy
ProxyRequests Off
ProxyPass / http://localhost:5601/
ProxyPassReverse / http://localhost:5601/Вариант субдиректории /kibana:
Redirect /kibana /kibana/
ProxyPass /kibana/ http://localhost:5601/
ProxyPassReverse /kibana/ http://localhost:5601/Включите модули и перезапустите Apache:
a2enmod proxy
a2enmod proxy_http
systemctl reload apache2Проксирование через Nginx — базовый пример
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}И для /kibana:
location /kibana {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}Запуск сервисов
systemctl start elasticsearch
systemctl start kibana
systemctl start logstash
systemctl start filebeatНастройки индексов и число шард/реплик для single-node кластера
Для одиночного Elasticsearch-сервера установите шаблон по умолчанию, чтобы индексы становились зелёными:
curl -u elastic:thepasswordyouset -X PUT http://localhost:9200/_template/default -H 'Content-Type: application/json' -d '{"index_patterns": ["*"],"order": -1,"settings": {"number_of_shards": "1","number_of_replicas": "0"}}'Для существующих индексов:
curl -u elastic:thepasswordyouset -X PUT http://localhost:9200/_settings -H 'Content-Type: application/json' -d '{"index": {"number_of_shards": "1","number_of_replicas": "0"}}'Если при попытке изменить настройки получите ошибку read-only, снимите блокировку:
curl -u elastic:thepasswordyouset -X PUT http://localhost:9200/_settings -H 'Content-Type: application/json' -d '{"index": {"blocks": {"read_only_allow_delete": "false"}}}'Тонкая настройка Kibana для шаблонов и скриптов
Если при импорте pipeline/dashboards получите ошибку Dynamic Script Compilation («Too many dynamic script compilations»), увеличьте лимит через Dev Tools в Kibana:
В разделе Dev Tools выполните:
PUT /_cluster/settings
{
"transient": {
"script.context.template.max_compilations_rate": "350/5m"
}
}После этого перезапустите сервисы:
systemctl restart elasticsearch
systemctl restart kibana
systemctl restart logstash
systemctl restart filebeatТестирование и отладка
Проверьте, что Suricata создаёт eve.json (EVE JSON) и что Filebeat его отправляет. Примеры команд диагностики:
- Проверить статус сервисов: systemctl status suricata zeek elasticsearch kibana logstash filebeat
- Логи: journalctl -u filebeat -f, journalctl -u logstash -f
- Тест Suricata: suricata -T -c /etc/suricata/suricata.yml
- Проверка правил suricata-update: suricata-update list-enabled-sources
Если Filebeat не отправляет данные в Logstash, проверьте соединение на порту 5044 и учётные данные в Logstash output.
Частые ошибки и исправления
- “Index read-only”: снимите блокировку, как показано выше.
- “Too many dynamic script compilations”: увеличьте rate в cluster settings.
- Проблемы с правами чтения логов: добавьте logstash в группу adm или используйте ACL.
Примеры выводов и дашбордов
Suricata и Zeek дашборды видны в Kibana после загрузки dashboards через filebeat setup. Примеры визуализаций: Top Hosts, Suricata Alerts, Zeek conn, netflow, iptables и apache.






Рекомендации по безопасности и конфиденциальности
- Включайте TLS между Filebeat -> Logstash -> Elasticsearch в продакшн-средах.
- Ограничьте доступ к Kibana через обратный прокси с аутентификацией и/или межсетевой фильтрацией.
- Храните учётные данные в Vault/секретном хранилище, а не в открытых текстовых файлах.
- Для соответствия GDPR: минимизируйте хранение персональных данных, применяйте ретеншен-политику и шифрование диска.
Матрица совместимости и варианты миграции
- Ubuntu 20.10: совместимо с указанными репозиториями OISF и Zeek Opensuse.
- Для более новых релизов Ubuntu пакеты и ключи репозиториев могут отличаться — проверяйте официальные репозитории.
- При миграции на кластер Elasticsearch 7.x -> 8.x учтите изменения по безопасности и требованию TLS.
Playbook развертывания (краткая методика)
- Подготовка сервера: обновление пакетов, настройка сетевого интерфейса и snapshot.
- Установка Suricata и запуск suricata-update.
- Установка Zeek, настройка node.cfg и networks.cfg, проверка zeekctl install.
- Установка ELK, включение security, установка паролей.
- Установка Filebeat, включение модулей, загрузка pipelines и dashboards.
- Настройка Logstash pipeline и output в Elasticsearch.
- Переключение на TLS и настройка прокси для Kibana.
- Тестирование, мониторинг и настройка retention/indices policy.
Ролевая ответственность — чек-листы
Администратор сети
- Проверить и настроить интерфейсы для Suricata/Zeek.
- Обеспечить зеркалирование портов или SPAN порт.
Инженер безопасности
- Настроить правила Suricata и фильтрацию ложных срабатываний.
- Обновлять источники правил и проверять их качество.
Инженер по логам/DevOps
- Настроить Filebeat/Logstash pipelines и управление шаблонами.
- Настроить бэкапы Elasticsearch и политику хранения.
Диагностическая карта и откат
- Если ELK потребляет много памяти: снижайте heap ES и переходите к репликации на отдельные ноды.
- При проблемах с индексами — снимайте read-only и проводите реиндексацию в безопасной среде.
- Откат: вернуть snapshot VM до момента установки — самый быстрый и надёжный способ.
Ментальные модели и практические эвристики
- Разделение обязанностей: Suricata для сигнатурных срабатываний, Zeek для контекста соединений и метаданных.
- Защита «по слоям»: сигнатуры + аномалии + потоковая телеметрия.
- Правило 80/20: первые 20% правил дадут 80% полезных сигналов — отфильтровывайте шум.
Decision flowchart
flowchart TD
A[Начало] --> B{Нужен IDS/сетевой анализ?}
B -- Нет --> Z[Использовать логирование хостов]
B -- Да --> C{Хотите сигнатуры?}
C -- Да --> D[Установить Suricata]
C -- Нет --> E[Можно только Zeek]
D --> F[Настроить suricata-update]
E --> F
F --> G[Установить ELK и Filebeat]
G --> H{Нужна центральная аналитика?}
H -- Да --> I[Прописать Filebeat->Logstash->ES]
H -- Нет --> J[Собирать локально, пересылать по необходимости]
I --> K[Настроить Kibana и дашборды]
K --> L[Тестирование и мониторинг]
J --> L
L --> M[Готово]Критерии приёмки
- Suricata генерирует eve.json и не падает при тестировании: suricata -T -c /etc/suricata/suricata.yml.
- Zeek успешно выполняет ./zeekctl install без ошибок и пишет логи conn.log.
- Filebeat отправляет события в Logstash, и данные индексируются в Elasticsearch.
- Kibana отображает дашборды Suricata/Zeek и доступны с учётными данными.
Тестовые случаи
- Отправить тестовый HTTP-трафик, проверить появление conn в Zeek и HTTP в Suricata eve.
- Сымитировать известную сигнатуру (без нанесения вреда) и проверить Alert в Kibana.
- Отключить Logstash и проверить поведение Filebeat (логирование ошибок).
- Увеличить скорость трафика и оценить потерю пакетов Suricata или задержку Logstash.
Сводка
- Suricata и Zeek дополняют друг друга: Suricata для сигнатур, Zeek для контекста и метаданных.
- ELK предоставляет мощную платформу для хранения и визуализации — Filebeat и Logstash выступают связующим звеном.
- Для продакшн-развёртываний обязательно настроить TLS, контроль прав доступа и план хранения индексов.
Примечание и обсуждение
Для замечаний и вопросов автор исходной инструкции предлагает форум: https://www.howtoforge.com/community/threads/suricata-and-zeek-ids-with-elk-on-ubuntu-20-10.86570/
Часто задаваемые вопросы
Как обновлять правила Suricata без перезапуска сервиса?
suricata-update генерирует новый файл правил в /var/lib/suricata/rules/suricata.rules. После обновления Suricata может подхватить новые правила при перезагрузке процесса или при использовании SIGHUP в зависимости от конфигурации.
Можно ли использовать Kibana без обратного прокси?
Да, Kibana может работать напрямую на порту 5601. Проксирование полезно для добавления SSL/аутентификации и защиты.
Как сократить объём хранимых данных в Elasticsearch?
Настройте ILM (Index Lifecycle Management), политику ретенции и агрегируйте/нарезайте события перед индексированием.








Похожие материалы
Как устроить идеальную вечеринку для просмотра ТВ
Как распаковать несколько RAR‑файлов сразу
Приватный просмотр в Linux: как и зачем
Windows 11 не видит iPod — способы исправить
PS5: как настроить игровые пресеты