· 18 мин чтения

ELK Stack с нуля: централизованное логирование для офиса на 50 серверов

ELK Stack с нуля: централизованное логирование для офиса на 50 серверов

Мне, Семёнову Евгению Сергеевичу, директору ITFresh, знакома до боли эта картина: звонит клиент, его «1С-сервер упал, и никто даже не представляет почему». И первое, что спрашиваешь: а где же логи? Если они раскиданы по десяткам разных серверов и ноутбуков, то, поверьте, расследование легко превращается в квест на дни, а то и недели. Но если всё аккуратненько стекается в одну Kibana, тогда мы находим причину буквально за минуты. Для нас, исходя из нашего богатого опыта, ELK — это не просто маст-хэв, это обязательная и жизненно важная часть инфраструктуры каждого нашего клиента. Давайте же посмотрим, как выглядит полная установка ELK-стека для компании среднего размера.

Что такое ELK и зачем

Что такое ELK? Это просто сокращение из трёх мощных продуктов. Elasticsearch — отвечает за хранение и молниеносный поиск данных. Logstash — это мастер по обработке и обогащению логов. А Kibana — ваш удобный веб-интерфейс для визуализации всего этого великолепия. Плюс не забудем про Beats — это такие лёгкие, но очень эффективные агенты, которые собирают данные прямо с источников. Весь этот стек разработан компанией Elastic, и хорошая новость – базовые версии доступны по открытой лицензии.

Что даёт централизация:

Архитектура для 50 серверов

А вот, собственно, и типовая схема, которую мы обычно разворачиваем для наших клиентов. Готовы?

Если у вас пока совсем небольшая инфраструктура – скажем, до 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

ФазаВозрастХранилищеДействие
hot0–7 днейNVMe SSDАктивная индексация, поиск
warm7–30 днейSATA SSDforcemerge, shrink
cold30–90 днейHDDsearchable 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 минут! Разве это не показатель эффективности?

Грабли, на которые наступают

Построим централизованное логирование

У нас 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.

Подпишитесь на рассылку ITfresh

Хотите получать от нас что-то полезное? Мы еженедельно готовим свежие, сугубо практические гайды. Они будут интересны как IT-руководителям, так и сисадминам. Темы самые актуальные: от безопасности и 1С до миграций, резервных копий и, конечно, наших фирменных лайфхаков, подсмотренных в реальных проектах.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.