Эта инструкция показывает, как настроить Logstash в роли приёмника логов (например, от Filebeat) и отправлять их в ваш кластер OpenSearch.
Подходит для стенда из нашей переписки: одноузловой OpenSearch 3.x + Dashboards на Rocky Linux 8.
Все команды выполняются от `root` (или добавляйте `sudo`). Для простоты используем самоподписанные сертификаты на тесте и суточные индексы `logstash-YYYY.MM.DD`.
—
На узле с Logstash откройте порт 5044/tcp (вход от Beats, например Filebeat):
firewall-cmd --add-port=5044/tcp --permanent firewall-cmd --reload
Создайте роль с правами записи только в индексы logstash-*, пользователя и привязку роли:
# Роль 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`, но для прод-среды всегда создавайте отдельного пользователя с минимальными правами.
—
Добавьте репозиторий Elastic и установите пакет logstash:
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
Рекомендуется установить официальный плагин вывода logstash-output-opensearch:
/usr/share/logstash/bin/logstash-plugin install logstash-output-opensearch
Можно использовать и стандартный `elasticsearch`-output, но с OpenSearch бывают нюансы совместимости. Плагин `opensearch` избавляет от них.
—
По умолчанию сервис Logstash читает конфиги из /etc/logstash/conf.d/*.conf (через path.config). Создадим три файла: input, фильтры (опционально) и output.
input {
beats {
port => 5044
# При необходимости TLS на входе (для прод-среды):
# ssl => true
# ssl_certificate => "/etc/logstash/certs/logstash.crt"
# ssl_key => "/etc/logstash/certs/logstash.key"
}
}
Добавьте полезные теги/поля, распарсьте строки, нормализуйте уровни и т. п.
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}" }
# }
}
Вариант для самоподписанного TLS на OpenSearch (тестовый стенд):
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"```
Сохраните файлы и проверьте конфигурацию:
/usr/share/logstash/bin/logstash --path.settings /etc/logstash -t
Если Config Validation Result: OK, включайте автозапуск и стартуйте:
systemctl enable --now logstash systemctl status logstash --no-pager journalctl -u logstash -n 200 --no-pager
Если раньше Filebeat слал напрямую в OpenSearch, переключите его на Logstash. В /etc/filebeat/filebeat.yml замените output.elasticsearch на output.logstash:
# output.elasticsearch: # отключить/закомментировать output.logstash: hosts: ["<LOGSTASH_IP>:5044"] # Для TLS на входе Logstash включите: # ssl.certificate_authorities: ["/etc/pki/tls/certs/logstash-ca.crt"] # ssl.verification_mode: full
Проверка и запуск:
filebeat test config -e filebeat test output -e systemctl restart filebeat journalctl -u filebeat -n 100 --no-pager
Сгенерируйте тестовую запись и проверьте индекс:
logger -t fbtest "hello from filebeat via logstash" curl -k -u admin:'<ADMIN_PASSWORD>' \ "https://<IP_OpenSearch>:9200/logstash-*/_search?q=fbtest&pretty"
logstash-*.@timestamp.
Симптом: в логе certificate verify failed или таймаут.
- На тесте временно используйте ssl_certificate_verification => false.
- В прод-среде укажите cacert => "/путь/до/вашего/CA.crt" и оставьте проверку включённой.
- Проверьте, что порт 9200 доступен из сети Logstash.
Симптом: ошибки рукопожатия TLS или connect: connection refused.
- Проверьте, что Logstash слушает 0.0.0.0:5044 (и открыт порт в firewalld).
- Если включили TLS на входе beats — укажите CA на стороне Filebeat (ssl.certificate_authorities).
- Для стенда обнулите реплики по умолчанию для шаблона 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 } }
}'
```
- Включите сжатие HTTP (http_compression => true), настроьте JVM heap Logstash в /etc/logstash/jvm.options.d/heap.options (например, -Xms1g/-Xmx1g).
- Разделяйте пайплайны (через /etc/logstash/pipelines.yml), если конфигурации становятся большими.
- Не злоупотребляйте тяжелыми grok'ами; по возможности используйте модульные парсеры на стороне Beats.
cacert и проверкой цепочки.logstash-*.loadbalance: true.
Готово. Теперь Logstash принимает логи (например, от Filebeat по 5044) и пишет их в OpenSearch в индексы logstash-*. Если что-то не взлетело — присылайте хвосты journalctl -u logstash и мы быстро разберём.