ELK Stack с нуля: централизованное логирование для офиса на 50 серверов
Мне, Семёнову Евгению Сергеевичу, директору ITFresh, знакома до боли эта картина: звонит клиент, его «1С-сервер упал, и никто даже не представляет почему». И первое, что спрашиваешь: а где же логи? Если они раскиданы по десяткам разных серверов и ноутбуков, то, поверьте, расследование легко превращается в квест на дни, а то и недели. Но если всё аккуратненько стекается в одну Kibana, тогда мы находим причину буквально за минуты. Для нас, исходя из нашего богатого опыта, ELK — это не просто маст-хэв, это обязательная и жизненно важная часть инфраструктуры каждого нашего клиента. Давайте же посмотрим, как выглядит полная установка ELK-стека для компании среднего размера.
Что такое ELK и зачем
Что такое ELK? Это просто сокращение из трёх мощных продуктов. Elasticsearch — отвечает за хранение и молниеносный поиск данных. Logstash — это мастер по обработке и обогащению логов. А Kibana — ваш удобный веб-интерфейс для визуализации всего этого великолепия. Плюс не забудем про Beats — это такие лёгкие, но очень эффективные агенты, которые собирают данные прямо с источников. Весь этот стек разработан компанией Elastic, и хорошая новость – базовые версии доступны по открытой лицензии.
Что даёт централизация:
- Забудьте про прыжки по десяткам машин. Теперь у вас один-единственный поисковик, который собирает логи со всех серверов, контейнеров и даже сетевого оборудования. Представляете, как это удобно?
- Корреляция событий? Легко! Нужно понять, почему 'упало' приложение? В два клика сопоставим ошибку в коде с неожиданным сетевым событием или, к примеру, переключением на другой дата-центр. Вот она, настоящая диагностика.
- Информативные дашборды: мгновенно увидите, сколько 'пятисоток' было за сутки, кто и когда логинился по SSH, а при желании — даже покажете менеджеру загрузку самой Kibana. Вся картина перед глазами.
- Алертинг, который реально работает: Представьте, приходит сообщение в Telegram: 'Внимание! Более 50 неудачных попыток входа на MSKDC01 за последние 5 минут!' Вы тут же среагируете. Это не просто уведомление, это ваша мгновенная реакция.
- А как же комплаенс? Если ваша отрасль требует хранить логи от 1 до 3 лет, как, например, у нас в некоторых проектах, то с ELK это не проблема. Все будет учтено и сохранено, как положено по всем регламентам.
Архитектура для 50 серверов
А вот, собственно, и типовая схема, которую мы обычно разворачиваем для наших клиентов. Готовы?
- Итак, для серьезных нагрузок мы используем такую конфигурацию: три виртуалки Elasticsearch. Каждая выполняет и роль мастера, и роль хранения данных ('master + data'). И по железу: 8 vCPU, 32 ГБ оперативной памяти и, конечно, быстрые 500 ГБ SSD на каждой, чтобы всё летало.
- 1 виртуалка Kibana (2 vCPU / 4 ГБ).
- Если вдруг выясняется, что без парсинга логов не обойтись, тогда на нашей практике хватает одной виртуальной машины Logstash. Главное — чтобы она была оснащена 4 vCPU и 8 ГБ оперативной памяти.
- Что ставим на каждый источник? Только специализированные агенты: Filebeat, Winlogbeat или Auditbeat. Это обеспечит надежный сбор данных.
Если у вас пока совсем небольшая инфраструктура – скажем, до 10 серверов или объем логов не превышает 20 ГБ в день – мы можем поставить single-node Elasticsearch на одну машину. Но здесь есть нюанс: это решение без отказоустойчивости, его лучше использовать для тестов или для очень скромных нужд. Для продакшена, конечно, нужна более серьезная схема.
Установка 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
Многие спрашивают про оповещения. Да, в базовой, open-source версии Kibana функция алертинга отсутствует. Она есть в платной подписке, называется Watcher. Но мы же ITFresh, мы всегда ищем оптимальные решения! Для тех, кто не готов платить, есть отличная бесплатная альтернатива – 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 году к нам обратился один интересный клиент. Это был целый холдинг – шесть компаний под одной крышей, а общий офис, между прочим, на 180 человек в самой Москве. Их инфраструктура? Целых 38 серверов, смесь Windows и Linux, там и 1С, и Битрикс, и куча своих внутренних сервисов. Логи? Они просто 'лежали' локально на каждом сервере. Представляете, сколько времени уходило на расследование каждого инцидента? Дни! Мы недолго думали. Развернули им полноценный ELK-стек на трёх мощных виртуалках. Где? На наших же серверах Dell Xeon Platinum 8280 в надежном дата-центре МТС в Москве. В конфигурации: три ноды Elasticsearch, плюс Kibana и Logstash на одной из них.
Всего за 8 рабочих дней – да, вы не ослышались, всего за 8 дней – мы подключили все 38 Beats-агентов. Настроили парсеры для всего: от 1С-трассировки и IIS access-логов до Windows Security и nginx. Это была ювелирная работа! В Kibana появилось 6 информативных дашбордов, которые позволяли видеть всю картину, как на ладони. А 14 настроенных алертов в ElastAlert теперь не давали ни одному критическому событию пройти незамеченным. Итоговая стоимость этого проекта? 210 000 рублей. А результат? Всего через 3 месяца среднее время, которое требовалось на расследование инцидента, сократилось с 4 часов до... угадайте сколько? До невероятных 15 минут! Разве это не показатель эффективности?
Грабли, на которые наступают
- Знаете, что бывает, когда забываешь про ILM (Index Lifecycle Management)? Индексы начинают расти бесконтрольно, как на дрожжах. Мы видели, как диски оказывались забиты под завязку всего через пару месяцев.
- А вы в курсе, что Beats шлют данные без TLS? Это значит, что ваши логи, содержащие, например, пароли, совершенно спокойно ходят по сети открытым текстом. Как думаете, это безопасно?
- Когда мы сталкиваемся со слишком мелкими шардами, скажем, по 500 МБ, то кластер Elasticsearch буквально задыхается. Он просто тонет в бесконечных пендинг-задачах.
- Kibana доступна без авторизации прямо в корпоративной сети? Тогда любой ваш сотрудник спокойно увидит все логи безопасности. Это ведь серьезная дыра в защите, не так ли?
- Всего один inode exhaustion на ES-ноде, и что происходит? Массовое индексирование тут же падает. И самое обидное, что поначалу никто толком не понимает, почему так случилось.
Построим централизованное логирование
У нас 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.
