ELK Stack с нуля: централизованное логирование для офиса на 50 серверов
Я Семёнов Евгений Сергеевич, директор АйТи Фреш. Когда у клиента «упал 1С-сервер, и никто не знает почему», первый вопрос — где логи. Если они разбросаны по десяткам серверов и ноутбуков — расследование затянется на дни. Если всё стекается в один Kibana — находите за минуты. У нас на практике ELK — обязательная часть инфраструктуры каждого клиента. Разберём полную установку для средней компании.
Что такое ELK и зачем
ELK — аббревиатура из трёх продуктов: Elasticsearch (хранилище и поиск), Logstash (обработка и обогащение), Kibana (веб-интерфейс). Плюс Beats — лёгкие агенты на источниках. Весь стек от Elastic, есть открытая лицензия.
Что даёт централизация:
- Один поисковик по логам со всех серверов, контейнеров и сетевого оборудования.
- Корреляция: сопоставить ошибку в приложении с сетевым событием и переключением на DC.
- Дашборды: сколько 5xx на сутки, кто логинится на SSH, загрузка Kibana менеджеру.
- Алертинг: «более 50 failed-login на MSKDC01 за 5 минут» — в Telegram.
- Соответствие: некоторые отрасли требуют хранить логи 1–3 года.
Архитектура для 50 серверов
Типовая схема, которую я ставлю клиентам:
- 3 виртуалки Elasticsearch (roles: master + data) — 8 vCPU / 32 ГБ ОЗУ / 500 ГБ SSD каждая.
- 1 виртуалка Kibana (2 vCPU / 4 ГБ).
- 1 виртуалка Logstash (4 vCPU / 8 ГБ) — если нужен парсинг.
- Filebeat/Winlogbeat/Auditbeat на каждом источнике.
Для маленьких инсталляций (до 10 серверов, до 20 ГБ/день) — single-node ES на одной машине. Но без отказоустойчивости, только для тестов.
Установка Elasticsearch на Ubuntu 22.04
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | \
sudo gpg --dearmor -o /usr/share/keyrings/elastic.gpg
echo "deb [signed-by=/usr/share/keyrings/elastic.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | \
sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install -y elasticsearch
sudo systemctl daemon-reload
sudo systemctl enable --now elasticsearch
При первом старте ES генерирует пароль для elastic и enrollment-token для Kibana — запишите их, иначе придётся сбрасывать через elasticsearch-reset-password.
Kibana
sudo apt install -y kibana
sudo /usr/share/kibana/bin/kibana-setup --enrollment-token
sudo systemctl enable --now kibana
Kibana слушает 5601. Ставьте за nginx/haproxy с TLS и basic-auth, если нет корпоративного SSO. В /etc/kibana/kibana.yml:
server.host: "0.0.0.0"
server.publicBaseUrl: "https://kibana.company.ru"
elasticsearch.hosts: ["https://es-01.company.ru:9200"]
Filebeat: сбор логов с Linux-сервера
sudo apt install -y filebeat
sudo filebeat modules enable nginx system auditd
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: filestream
id: app-logs
paths: [/var/log/myapp/*.log]
fields:
service: myapp
env: production
output.elasticsearch:
hosts: ["https://es-01.company.ru:9200"]
username: "elastic"
password: "${ES_PASS}"
ssl.certificate_authorities: ["/etc/filebeat/es-ca.crt"]
setup.kibana:
host: "https://kibana.company.ru"
sudo filebeat setup -e
sudo systemctl enable --now filebeat
Модули (filebeat modules enable) приносят готовые ingest-пайплайны и Kibana-дашборды. Не пишите свой grok, если есть модуль.
Winlogbeat: логи Windows-серверов
На каждом DC, файловом, 1С-сервере:
# PowerShell
Invoke-WebRequest https://artifacts.elastic.co/downloads/beats/winlogbeat/winlogbeat-8.13.0-windows-x86_64.zip -OutFile winlogbeat.zip
Expand-Archive winlogbeat.zip -DestinationPath C:\Program Files\
# winlogbeat.yml
winlogbeat.event_logs:
- name: Security
ignore_older: 72h
- name: System
- name: Application
output.elasticsearch:
hosts: ["https://es-01.company.ru:9200"]
username: "elastic"
password: "${ES_PASS}"
# Установка службы
cd "C:\Program Files\winlogbeat"
.\install-service-winlogbeat.ps1
Start-Service winlogbeat
Logstash для сложного парсинга
Logstash берёт на себя разбор нестандартных форматов. Пример для access.log от самописного приложения с JSON-структурой:
# /etc/logstash/conf.d/app.conf
input {
beats {
port => 5044
ssl => true
ssl_certificate => "/etc/logstash/certs/ls.crt"
ssl_key => "/etc/logstash/certs/ls.key"
}
}
filter {
if [fields][service] == "myapp" {
json { source => "message" }
date { match => ["timestamp", "ISO8601"] }
geoip { source => "client_ip" target => "geo" }
mutate { remove_field => ["message"] }
}
}
output {
elasticsearch {
hosts => ["https://es-01.company.ru:9200"]
index => "myapp-%{+YYYY.MM.dd}"
user => "elastic"
password => "${ES_PASS}"
ssl => true
}
}
Ретенция через ILM
| Фаза | Возраст | Хранилище | Действие |
|---|---|---|---|
| hot | 0–7 дней | NVMe SSD | Активная индексация, поиск |
| warm | 7–30 дней | SATA SSD | forcemerge, shrink |
| cold | 30–90 дней | HDD | searchable snapshot |
| delete | >90 дней | — | Удаление |
Алертинг в Telegram
В базовой Kibana (open-source) нет алертинга, но есть Watcher в платной. Бесплатная альтернатива — ElastAlert 2. Пример правила — более 10 неудачных входов SSH за 5 минут:
# /opt/elastalert/rules/ssh_brute.yaml
name: SSH brute-force
type: frequency
index: filebeat-*
num_events: 10
timeframe: { minutes: 5 }
filter:
- query:
query_string:
query: 'event.action:"ssh_login" AND event.outcome:"failure"'
alert:
- telegram
telegram_bot_token: "XXX"
telegram_room_id: "-100YYY"
Реальный кейс: логи для холдинга в Москве
Однажды в 2024 году к нам пришёл клиент — холдинг из 6 компаний, общий офис на 180 человек в Москве. Инфраструктура: 38 серверов (Windows + Linux), 1С, Битрикс, внутренние сервисы. Логи лежали локально, расследование инцидентов занимало дни. Мы развернули ELK на трёх виртуалках на наших Dell Xeon Platinum 8280 в дата-центре МТС Москва — 3 ноды ES + Kibana + Logstash.
За 8 рабочих дней подключили 38 Beats-агентов, настроили парсеры для 1С-трассировки, IIS access-логов, Windows Security, nginx. Создали 6 дашбордов в Kibana и 14 алертов в ElastAlert. Стоимость — 210 000 руб. Через 3 месяца среднее время расследования инцидента упало с 4 часов до 15 минут.
Грабли, на которые наступают
- Забыли про ILM — индексы растут бесконтрольно, через 2 месяца диски забиты.
- Beats шлют без TLS — логи с паролями ходят по сети открытым текстом.
- Слишком мелкие шарды (по 500 МБ) — кластер задыхается в пендинг-задачах.
- Kibana без авторизации в корпоративной сети — любой сотрудник видит логи безопасности.
- Один inode exhaustion на ES-ноде — mass индексирование падает, никто не понимает почему.
Построим централизованное логирование
У нас 15+ лет опыта внедрения ELK в корпоративных сетях. 8 серверов Dell Xeon Platinum 8280 с 40G Mellanox в дата-центре МТС Москва — под хостинг вашего стека. Аудит источников логов, проектирование ретенции, настройка дашбордов и алертов — за 5–8 дней под ключ.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — ELK Stack
- Нужен ли Logstash, или можно Filebeat напрямую в Elasticsearch?
- Для простых случаев — Filebeat → Elasticsearch с ingest pipeline. Logstash нужен, если требуется сложный парсинг, enrichment, разделение потоков или буферизация через Kafka/Redis перед ES.
- Сколько места занимают логи в ELK?
- Сырой текст индексируется в ES с коэффициентом 1,2–1,8x от исходника из-за инвертированных индексов. 100 ГБ сырых логов в день — 150–180 ГБ в ES. Плюс реплики — умножаем на (1 + число реплик).
- Какую ретенцию выбрать?
- Зависит от регуляторики и бюджета. Типично: 30 дней hot, 90 дней warm, до года cold на HDD. ФСТЭК для госсектора требует минимум 3 года. Для обычного бизнеса 90 дней хватает для расследования инцидентов.
- Как собирать Windows Event Logs?
- Ставьте Winlogbeat на каждом Windows-сервере. Он читает Event Log через Windows API и отправляет в Logstash или ES. Для DC критично собирать Security log — это аудит входов и доступа.
- Чем Kibana отличается от Grafana для логов?
- Kibana заточена под ES: Discover для поиска, Lens для визуализации, машинное обучение (в платной). Grafana универсальнее — умеет и ES, и Prometheus, и Loki. Для чистых логов часто удобнее Kibana, для метрик + логов вместе — Grafana.