Инструменты пользователя

Инструменты сайта


отправка_логов_через_logstash

Доставка логов в OpenSearch через Logstash (Rocky Linux 8)

Эта инструкция показывает, как настроить Logstash в роли приёмника логов (например, от Filebeat) и отправлять их в ваш кластер OpenSearch.
Подходит для стенда из нашей переписки: одноузловой OpenSearch 3.x + Dashboards на Rocky Linux 8.

Все команды выполняются от `root` (или добавляйте `sudo`). Для простоты используем самоподписанные сертификаты на тесте и суточные индексы `logstash-YYYY.MM.DD`.

0) Что откроем в файрволе

На узле с Logstash откройте порт 5044/tcp (вход от Beats, например Filebeat):

snippet.bash
firewall-cmd --add-port=5044/tcp --permanent
firewall-cmd --reload

1) Подготовка OpenSearch: роль и пользователь для Logstash

Создайте роль с правами записи только в индексы logstash-*, пользователя и привязку роли:

snippet.bash
# Роль
curl -k -u admin:'<ADMIN_PASSWORD>' -X PUT \
  "https://<IP_OpenSearch>:9200/_plugins/_security/api/roles/logstash_writer" \
  -H 'Content-Type: application/json' -d '{
  "index_permissions": [
    { "index_patterns": ["logstash-*"], "allowed_actions": ["crud","create_index"] }
  ]
}'
 
# Пользователь
curl -k -u admin:'<ADMIN_PASSWORD>' -X PUT \
  "https://<IP_OpenSearch>:9200/_plugins/_security/api/user/logstash_ingest" \
  -H 'Content-Type: application/json' -d '{
  "password": "<STRONG_PASSWORD>",
  "attributes": {}
}'
 
# Привязка роли к пользователю
curl -k -u admin:'<ADMIN_PASSWORD>' -X PUT \
  "https://<IP_OpenSearch>:9200/_plugins/_security/api/rolesmapping/logstash_writer" \
  -H 'Content-Type: application/json' -d '{
  "users": ["logstash_ingest"]
}'
На тесте можно использовать `admin`, но для прод-среды всегда создавайте отдельного пользователя с минимальными правами.

2) Установка Logstash (Rocky/Alma 8)

Добавьте репозиторий Elastic и установите пакет logstash:

snippet.bash
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
cat >/etc/yum.repos.d/elastic-8.x.repo <<'REPO'
[elastic-8.x]
name=Elastic 8.x
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
REPO
 
dnf clean all
dnf -y install logstash

2.1 Плагин вывода в OpenSearch

Рекомендуется установить официальный плагин вывода logstash-output-opensearch:

snippet.bash
/usr/share/logstash/bin/logstash-plugin install logstash-output-opensearch
Можно использовать и стандартный `elasticsearch`-output, но с OpenSearch бывают нюансы совместимости. Плагин `opensearch` избавляет от них.

3) Базовая конфигурация Logstash

По умолчанию сервис Logstash читает конфиги из /etc/logstash/conf.d/*.conf (через path.config). Создадим три файла: input, фильтры (опционально) и output.

3.1 Вход от Beats (Filebeat) — `10-input-beats.conf`

snippet.conf
input {
  beats {
    port => 5044
    # При необходимости TLS на входе (для прод-среды):
    # ssl => true
    # ssl_certificate => "/etc/logstash/certs/logstash.crt"
    # ssl_key => "/etc/logstash/certs/logstash.key"
  }
}

3.2 (Опционально) Фильтры — `20-filter.conf`

Добавьте полезные теги/поля, распарсьте строки, нормализуйте уровни и т. п.

snippet.conf
filter {
  if [fileset][module] == "system" and [fileset][name] == "auth" {
    mutate {
      add_tag => ["auth"]
    }
  }
 
  if [message] =~ /timeout|timed out|connection reset/i {
    mutate { add_tag => ["timeout"] }
  }
 
  # Пример grok для Nginx (если шлёте логи nginx через file input):
  # grok {
  #   match => { "message" => "%{NGINXACCESS}" }
  # }
}

3.3 Выход в OpenSearch — `30-output-opensearch.conf`

Вариант для самоподписанного TLS на OpenSearch (тестовый стенд):

snippet.conf
output {
  opensearch {
    hosts => ["https://<IP_OpenSearch>:9200"]
    user  => "logstash_ingest"
    password => "<STRONG_PASSWORD>"
    index => "logstash-%{+YYYY.MM.dd}"
    ssl => true
    ssl_certificate_verification => false
    # Не ставим шаблоны от Logstash в OpenSearch
    manage_template => false
    # Дополнительно
    http_compression => true
  }
  # Для отладки — вывод в stdout в формате JSON (временно)
  # stdout { codec => rubydebug }
}
В прод-среде **включайте проверку TLS** и указывайте свой CA:```confssl_certificate_verification => truecacert => "/etc/pki/ca-trust/source/anchors/opensearch-ca.crt"```

Сохраните файлы и проверьте конфигурацию:

snippet.bash
/usr/share/logstash/bin/logstash --path.settings /etc/logstash -t

Если Config Validation Result: OK, включайте автозапуск и стартуйте:

snippet.bash
systemctl enable --now logstash
systemctl status logstash --no-pager
journalctl -u logstash -n 200 --no-pager

4) Настройка отправителя (пример с Filebeat)

Если раньше Filebeat слал напрямую в OpenSearch, переключите его на Logstash. В /etc/filebeat/filebeat.yml замените output.elasticsearch на output.logstash:

snippet.yaml
# output.elasticsearch:  # отключить/закомментировать

output.logstash:
  hosts: ["<LOGSTASH_IP>:5044"]
  # Для TLS на входе Logstash включите:
  # ssl.certificate_authorities: ["/etc/pki/tls/certs/logstash-ca.crt"]
  # ssl.verification_mode: full

Проверка и запуск:

snippet.bash
filebeat test config -e
filebeat test output -e
systemctl restart filebeat
journalctl -u filebeat -n 100 --no-pager

Сгенерируйте тестовую запись и проверьте индекс:

snippet.bash
logger -t fbtest "hello from filebeat via logstash"
 
curl -k -u admin:'<ADMIN_PASSWORD>' \
  "https://<IP_OpenSearch>:9200/logstash-*/_search?q=fbtest&pretty"

5) Настройка Data View в OpenSearch Dashboards

  1. Откройте Dashboards → Management → Data Views (Index Patterns).
    2. Создайте Data View с шаблоном: logstash-*.
    3. Поле времени: @timestamp.
    4. Проверьте логи в Discover.

6) Частые проблемы и решения

6.1 Logstash не может подключиться к OpenSearch (SSL)

Симптом: в логе certificate verify failed или таймаут. - На тесте временно используйте ssl_certificate_verification => false. - В прод-среде укажите cacert => "/путь/до/вашего/CA.crt" и оставьте проверку включённой. - Проверьте, что порт 9200 доступен из сети Logstash.

6.2 Filebeat не может подключиться к Logstash

Симптом: ошибки рукопожатия TLS или connect: connection refused. - Проверьте, что Logstash слушает 0.0.0.0:5044 (и открыт порт в firewalld). - Если включили TLS на входе beats — укажите CA на стороне Filebeat (ssl.certificate_authorities).

6.3 Индексы `yellow` на одноузловом кластере

- Для стенда обнулите реплики по умолчанию для шаблона logstash-*:

```bash
curl -k -u admin:'<ADMIN_PASSWORD>' -X PUT https://<IP_OpenSearch>:9200/_index_template/logstash \
  -H 'Content-Type: application/json' -d '{
  "index_patterns": ["logstash-*"],
  "template": { "settings": { "index.number_of_replicas": 0 } }
}'
```

6.4 Производительность Logstash

- Включите сжатие HTTP (http_compression => true), настроьте JVM heap Logstash в /etc/logstash/jvm.options.d/heap.options (например, -Xms1g/-Xmx1g).
- Разделяйте пайплайны (через /etc/logstash/pipelines.yml), если конфигурации становятся большими.
- Не злоупотребляйте тяжелыми grok'ами; по возможности используйте модульные парсеры на стороне Beats.


7) К прод-среде (кратко)

  • TLS повсюду: вход beats на Logstash, выход Logstash → OpenSearch с cacert и проверкой цепочки.
    - Учётные записи/роли: отдельные пользователи и минимальные права.
    - Индексы/политики: используйте OpenSearch ISM для ротации/архивации logstash-*.
    - Мониторинг: heap Logstash, очереди (persistent queue), watermark дисков кластера, снапшоты.
    - Масштабирование: несколько инстансов Logstash за балансером, beats с loadbalance: true.

Готово. Теперь Logstash принимает логи (например, от Filebeat по 5044) и пишет их в OpenSearch в индексы logstash-*. Если что-то не взлетело — присылайте хвосты journalctl -u logstash и мы быстро разберём.

отправка_логов_через_logstash.txt · Последнее изменение: 2025/09/13 21:42 — kirill

DokuWiki Appliance - Powered by TurnKey Linux