Модуль 4: Observability & Security

Централизованный сбор логов: Настройка Syslog, Grafana Loki и Promtail

1. Зачем нужен централизованный сбор логов?

Когда в инфраструктуре больше двух серверов и пары сетевых устройств, подключаться по SSH на каждый узел для анализа `tail -f /var/log/syslog` становится неэффективно. Сбор логов в единое хранилище решает сразу три ключевые задачи:

  • Ускорение расследования инцидентов (Troubleshooting): Возможность коррелировать события с разных серверов и сетевого оборудования на едином временном отрезке.
  • Безопасность и аудит: Даже если злоумышленник получит root-доступ к серверу и затрёт локальные логи, их копия уже будет сохранена на удалённом сервере логов.
  • Удобный поиск и визуализация: Быстрый фильтр по ключевым словам, сервисам, уровню важности (ERROR, WARN, INFO) и построение графиков активности.
Архитектура стекa Loki:
Promtail: Агент-сборщик логов, который вычитывает локальные файлы или принимает Syslog-трафик.
Grafana Loki: Высокопроизводительное хранилище логов, индексирующее только метки (labels), а не весь текст.
Grafana: Веб-интерфейс для дашбордов, поиска по логам (язык LogQL) и настройки уведомлений.

2. Развертывание Grafana + Loki + Promtail в Docker Compose

Создадим каталог для стека и развернём все сервисы в изолированных контейнерах.

Шаг 2.1. Подготовка структуры и файлов конфигурации

mkdir -p /opt/loki-stack && cd /opt/loki-stack

Создайте файл конфигурации для Loki — loki-config.yaml:

auth_enabled: false

server:
  http_listen_port: 3100

ingester:
  lifecycler:
    address: 127.0.0.1
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
  chunk_idle_period: 1m
  chunk_retain_period: 30s

schema_config:
  configs:
    - from: 2020-05-15
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb_shipper:
    active_index_directory: /loki/index
    cache_location: /loki/index_cache
    shared_store: filesystem
  filesystem:
    directory: /loki/chunks

limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h

Создайте файл конфигурации Promtail для приёма Syslog — promtail-config.yaml:

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:
  # Сбор локальных системных логов
  - job_name: system
    static_configs:
      - targets:
          - localhost
        labels:
          job: varlogs
          host: log-server
          __path__: /var/log/*.log

  # Прием логов по протоколу Syslog (UDP) от сетевых устройств
  - job_name: syslog
    syslog:
      listen_address: 0.0.0.0:1514
      idle_timeout: 1h
      label_job: syslog
    relabel_configs:
      - source_labels: ['__syslog_message_hostname']
        target_label: 'host'

Шаг 2.2. Запуск через docker-compose.yml

version: "3.8"

services:
  loki:
    image: grafana/loki:2.9.0
    container_name: loki
    ports:
      - "3100:3100"
    volumes:
      - ./loki-config.yaml:/etc/loki/loki-config.yaml
    command: -config.file=/etc/loki/loki-config.yaml
    restart: always

  promtail:
    image: grafana/promtail:2.9.0
    container_name: promtail
    ports:
      - "1514:1514/udp"
    volumes:
      - ./promtail-config.yaml:/etc/promtail/promtail-config.yaml
      - /var/log:/var/log
    command: -config.file=/etc/promtail/promtail-config.yaml
    restart: always

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=SECURE_PASSWORD
    volumes:
      - grafana_data:/var/lib/grafana
    restart: always

volumes:
  grafana_data:

Запустите сервис:

docker compose up -d

3. Настройка отправки логов с устройств (MikroTik / Linux)

Отправка логов с MikroTik RouterOS

Подключитесь к роутеру через WinBox или SSH и настройте отправку логов в Syslog (на IP вашего сервера логов и порт `1514`):

/system logging action add name=syslog-server remote=192.168.88.10 remote-port=1514 target=remote
/system logging add action=syslog-server topics=info,warning,error

Отправка логов с Linux (rsyslog)

В файле /etc/rsyslog.conf на удаленном Linux-сервере добавьте строку:

*.* @192.168.88.10:1514

Перезапустите службу: sudo systemctl restart rsyslog

4. Подключение Источника Данных в Grafana

Инструкция по настройке UI:
1. Откройте веб-интерфейс Grafana: http://<IP_СЕРВЕРА>:3000.
2. Перейдите в Connections → Data Sources → Add data source.
3. Выберите Loki и укажите URL: http://loki:3100.
4. Нажмите Save & test.
5. Откройте вкладку Explore и введите запрос LogQL: {job="syslog"} или {host="log-server"}.