# Доставка логов в 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): ```bash firewall-cmd --add-port=5044/tcp --permanent firewall-cmd --reload ``` --- ## 1) Подготовка OpenSearch: роль и пользователь для Logstash Создайте роль с правами записи только в индексы `logstash-*`, пользователя и привязку роли: ```bash # Роль curl -k -u admin:'' -X PUT \ "https://: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:'' -X PUT \ "https://:9200/_plugins/_security/api/user/logstash_ingest" \ -H 'Content-Type: application/json' -d '{ "password": "", "attributes": {} }' # Привязка роли к пользователю curl -k -u admin:'' -X PUT \ "https://:9200/_plugins/_security/api/rolesmapping/logstash_writer" \ -H 'Content-Type: application/json' -d '{ "users": ["logstash_ingest"] }' ``` > На тесте можно использовать `admin`, но для прод-среды всегда создавайте отдельного пользователя с минимальными правами. --- ## 2) Установка Logstash (Rocky/Alma 8) Добавьте репозиторий Elastic и установите пакет `logstash`: ```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**: ```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` ```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` Добавьте полезные теги/поля, распарсьте строки, нормализуйте уровни и т. п. ```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 (тестовый стенд): ```conf output { opensearch { hosts => ["https://:9200"] user => "logstash_ingest" 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: > ```conf > ssl_certificate_verification => true > cacert => "/etc/pki/ca-trust/source/anchors/opensearch-ca.crt" > ``` Сохраните файлы и проверьте конфигурацию: ```bash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t ``` Если `Config Validation Result: OK`, включайте автозапуск и стартуйте: ```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`: ```yaml # output.elasticsearch: # отключить/закомментировать output.logstash: hosts: [":5044"] # Для TLS на входе Logstash включите: # ssl.certificate_authorities: ["/etc/pki/tls/certs/logstash-ca.crt"] # ssl.verification_mode: full ``` Проверка и запуск: ```bash filebeat test config -e filebeat test output -e systemctl restart filebeat journalctl -u filebeat -n 100 --no-pager ``` Сгенерируйте тестовую запись и проверьте индекс: ```bash logger -t fbtest "hello from filebeat via logstash" curl -k -u admin:'' \ "https://: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:'' -X PUT https://: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` и мы быстро разберём.