Категорії
Misc, staff, other WWW

Пересилання log із cloudflare у logstash

Як відомо, логи у CloudFlare (CF) дивитися дуже незручно. А от в kibana – зовсім інша річ. Наше завдання зробити пересилку log’ів у logstash. Дана стаття припускає, що у вас вже є налаштований ELK стек і розкаже, як додати в існуючий стек новий source, тобто CF. Стаття буде розбита на 2 частини: Logstash і CF

Logstash

Спочатку налаштуємо прийом повідомлень, бо якщо робити навпаки, то не пройде health check (HC) зі сторони CF. Налаштовувати будемо через nginx proxy_pass. Чому не напряму? Тому що, час від часу CF посилає HC пакет, щоб перевірити, чи живий DST і цей пакет кардинально відрізняється від даних: HC не стиснутий gzip, на відміну від data-пакету і тому, якщо направляти напряму в logstash, то останній будемо мати помилку

#<Puma::HttpParserError: Invalid HTTP format, parsing fails.>

і відповідно, HC не пройде і CF припинить посилати логи. Отже, конфіг nginx’a:

server {
    listen 80 ssl;
    server_name _;

    ssl_certificate /etc/nginx/ssl/domain.com.crt;
    ssl_certificate_key /etc/nginx/ssl/domain.com.key;

    client_max_body_size 100M;

    location / {
        # Pass the request as plain HTTP to Logstash on localhost
        proxy_pass http://127.0.0.1:8764;

        # Ensure headers are preserved for Logstash
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # Increase timeout for large log batches
        proxy_read_timeout 300;
    }
}

Важливий момент: тільки https. Схему http не пропустить на етапі створення у CF:

Invalid destination configuration: error getting destination: unsupported scheme: http

Конфіг logstash

input {

http {
    port => "8764"
    codec => "json_lines"
    additional_codecs => { "application/gzip" => "gzip_lines" } # Handles CF compression
#    ssl => true
#    keystore => "/etc/nginx/ssl/keystore"
#    keystore_password => "XXX"
  }

}

filter {

if [JA4] {
     mutate { add_tag => [ "has_fingerprint" ] }
  }

}

output {

  else if [http_host] == "cflog.domain.com" {

   elasticsearch {
      hosts => "elk.domain.net"
      index => "cf-%{+YYYY-MM}"
      sniffing => false
    }

  }

}

Деякі нюанси в конфігу. Я навмисне залишив секцію ssl, раптом вам треба буде налаштувати security connection між nginx і logstash. І для logstash 6.2 треба саме такі параметри, інакше в при запуску будуть помилки

[2026-02-17T16:05:14,497][ERROR][logstash.inputs.http     ] Unknown setting 'ssl_certificate' for http
[2026-02-17T16:05:14,498][ERROR][logstash.inputs.http     ] Unknown setting 'ssl_key' for http

CloudFlare

Вибираємо відповідний домен -> Analytics & logs -> Logpush. Вибираємо Create a Logpush job -> HTTP destination і заповнюємо:

Http destination: cflog.domain.com

Send fields: тут треба вибрати з розумом, які поля передавати.

Timestamp format: rfc3339

Все інше – по бажанню.

Логи почнуть писатися не одразу, а з деякою затримкою, це треба враховувати. Якщо в логах nginx’a побачите

"POST / HTTP/2.0" 200 2 "-" "Go-http-client/2.0"

значить все пройшло успішно.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP