Integracja ELK i Exchange. Część 1

Integracja ELK i Exchange. Część 1

Rozpoczynam serię artykułów, w których chcę podzielić się swoim doświadczeniem związanym z łączeniem Exchange i ELK. Ten stos technologiczny pomoże w przetwarzaniu dużych wolumenów logów, eliminując obawy o to, przy jakiej wielkości tradycyjne narzędzia do logowania przestaną być pomocne. Poznajmy nowego gracza w świecie logów.

Exchange dysponuje dość rozbudowanym systemem logowania. Najczęściej wykorzystywane logi to logi śledzenia, które monitorują krok po kroku przebieg konkretnej wiadomości w organizacji pocztowej; logi serwera WWW, które śledzą każdą nową sesję użytkownika w systemie, oraz logi konkretnych aplikacji internetowych o różnym poziomie szczegółowości sesji. Ponadto Exchange potrafi przechowywać surowe logi protokołów smtp, imap i pop3.

Jakie narzędzia możemy wykorzystać do pracy z logami:

  • Wbudowany cmdlet Get-MessageTrackingLog: umożliwia wygodne przetwarzanie logów śledzenia;
  • Narzędzie logparser: wykorzystuje pseudo-język SQL do logowania w celu wyszukiwania i działa dość szybko;
  • Zewnętrzny serwer SQL: do szczególnych przypadków (na przykład analizy danych w długich okresach czasowych).

To wszystko sprawdza się dobrze, gdy mamy kilka serwerów, a objętość przetwarzanych logów mierzy się w dziesiątkach lub setkach gigabajtów. A co, jeśli liczba serwerów przekracza dziesiątki, a wielkość logów przeszła terabajt? W takim przypadku najprawdopodobniej ten schemat zacznie się sypać.

I oto, co się dzieje: Get-MessageTrackingLog zaczyna się zawieszać z powodu przekroczenia czasu, logparser natrafia na limit 32-bitowej architektury, a wyeksportowanie do serwera SQL łamie się w najmniej odpowiednim momencie, nie przetwarzając wieloliniowego wyjątku od usługi.

Na scenie pojawia się nowy gracz – stos ELK, który został specjalnie zaprojektowany do żonglowania ogromnymi ilościami logów w rozsądnych terminach i z tolerowalnym zużyciem zasobów.

W pierwszej części szczegółowo opiszę, jak podłączyć filebeat, który należy do części stosu ELK — odpowiedzialny za odczyt i wysyłanie prostych plików tekstowych, w które różne aplikacje zapisują swoje logi. W kolejnych artykułach skoncentrujemy się na komponentach Logstash i Kibana.

Instalacja

Zatem plik archiwum agenta filebeat można pobrać z tej strony.

Wykonamy instalację poprzez proste wypakowanie zawartości pliku zip. Na przykład w c:Program Filesfilebeat. Następnie należy uruchomić skrypt PowerShell install-service-filebeat.ps1, który jest dołączony, do instalacji usługi filebeat.

Teraz jesteśmy gotowi, aby rozpocząć konfigurację pliku konfiguracyjnego.

Odporność na awarie

Filebeat zapewnia dostarczenie logów do systemu zbierania logów. Realizuje to poprzez prowadzenie rejestru wpisów w plikach logów. W rejestrze przechowywane są informacje o tych wpisach, które zostały odczytane z plików logów, oraz oznaczane są konkretne wpisy, które udało się dostarczyć do miejsca docelowego.

Jeśli jakiś wpis nie może zostać dostarczony, filebeat spróbuje wysłać go ponownie, aż otrzyma od systemu odbiorczego potwierdzenie dostarczenia lub oryginalny plik logu zostanie usunięty w trakcie rotacji.

Podczas ponownego uruchamiania usługi filebeat odczyta z rejestru informacje o ostatnich odczytanych i dostarczonych wpisach i będzie odczytywać wpisy w plikach logów, opierając się na informacjach w rejestrze.

Pozwoli to zminimalizować ryzyko utraty informacji o logach, które należy wysłać na serwery elasticlogstash, w trakcie nieprzewidzianych awarii i operacji utrzymaniowych serwerów.

Więcej o tym można przeczytać w dokumentacji w paragrafach: Jak Filebeat utrzymuje stan plików i Jak Filebeat zapewnia co najmniej jedno dostarczenie?

Konfiguracja

Cała konfiguracja wykonywana jest w pliku konfiguracyjnym w formacie yml, który podzielony jest na kilka sekcji. Rozważmy niektóre z nich, które biorą udział w procesie zbierania logów z serwerów Exchange.

Sekcja przetwarzania logów

Sekcja przetwarzania logów zaczyna się od pola:

filebeat.inputs:

Będziemy używać wspólnego narzędzia do zbierania logów:

- type: log

Następnie podajemy status (włączony) i ścieżki do folderu z logami. Na przykład, w przypadku logów IIS ustawienia mogą być następujące:

    enabled: true
    paths:
	- C:inetpublogsLogFilesW3SVC1*.log
	- C:inetpublogsLogFilesW3SVC2*.log

Jeszcze jedna ważna konfiguracja: jak filebeat powinien odczytywać wieloliniowe wpisy. Domyślnie filebeat traktuje jedną linię pliku logu jako jeden wpis. Działa to dobrze, dopóki nie zaczynają przychodzić wyjątki związane z nieprawidłowym działaniem usługi. W takim przypadku wyjątki mogą składać się z kilku linii. Dlatego filebeat powinien traktować wpis wieloliniowy jako jeden, jeśli następna linia zaczyna się od daty. Format wpisów logów w Exchange jest taki: każdy nowy wpis w pliku logu zaczyna się od daty. W konfiguracji to warunek wygląda następująco:

multiline:
	pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
	negate: true
	match: after

Warto dodać tagi do wysyłanego wpisu, na przykład:

  tags: ['IIS', 'ex-srv1']

I nie zapomnij wykluczyć z przetwarzania linii rozpoczynających się od znaku hash:

  exclude_lines: ['^#']

Tak więc blok czytania logów będzie wyglądał następująco:

filebeat.inputs:
- type: log
  enabled: true
  paths:
	- C:inetpublogsLogFilesW3SVC1*.log
	- C:inetpublogsLogFilesW3SVC2*.log
  multiline:
	pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
	negate: true
	match: after
  tags: ['IIS', 'ex-srv1']
  exclude_lines: ['^#']

Blok wysyłania logów

Poszczególne wpisy w pliku log filebeat są wysyłane jako obiekt json, w którym konkretna informacja z logu zawarta jest w pojedynczym polu message. Jeśli chcemy w jakiś sposób pracować z tymi danymi, musimy wcześniej rozparsować to pole na osobne pola. Można to zrobić, na przykład, w logstash. Będzie on odbiorcą wpisów z filebeat. Oto jak może to wyglądać w pliku konfiguracyjnym filebeat:

output.logstash:
  hosts: ["logstash1.domain.com:5044"]

Jeśli jest kilka serwerów, można włączyć równoważenie obciążenia: wtedy filebeat będzie wysyłał logi nie do pierwszego dostępnego serwera z listy, ale rozdzielał wysyłane logi pomiędzy kilka serwerów:

hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true 

Filebeat, przetwarzając logi w wysyłanym json, oprócz wpisu logu, który zawarty jest w polu message, dodaje pewną ilość metadanych, co wpływa na rozmiar dokumentu trafiającego do elastyczności. Te metadane można selektywnie usunąć z wysyłki. Robi się to w bloku processor za pomocą procesora drop_fields. Można wykluczyć, na przykład, następujące pola:

processors:
- drop_fields:
	fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]

Do wyboru wykluczanych pól należy podchodzić ostrożnie, ponieważ część z nich może być używana po stronie elastycznej do tworzenia indeksów.

Tak więc blok wysyłania logów będzie wyglądał następująco:

output.logstash:
  hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true
 
processors:
- drop_fields:
	fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]

Ustawienia logowania filebeat

Warto ustawić następujące ustawienia logowania:

  • Poziom logowania info;
  • Rejestrujemy logi w plikach umiejscowionych domyślnie (w katalogu logs, w katalogu instalacyjnym filebeat);
  • Nazwa pliku logu — filebeat;
  • Przechowywać ostatnie 10 plików logów;
  • Rozpocznij rotację przy osiągnięciu rozmiaru 1 MB.

Ostateczna blokada konfiguracji logowania będzie wyglądać następująco:

logging.level: info
logging.to_files: true
logging.files:
  name: filebeat
  keepfiles: 10
  rotateeverybytes: 1048576

Ostateczna konfiguracja

Zebraliśmy konfigurację, teraz wygląda to następująco:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - C:inetpublogsLogFilesW3SVC1*.log
    - C:inetpublogsLogFilesW3SVC2*.log
  multiline:
    pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
    negate: true
    match: after
  tags: ['IIS', 'ex-srv1']
  exclude_lines: ['^#']
 
output.logstash:
  hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true
 
processors:
- drop_fields:
    fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]
 
logging.level: info
logging.to_files: true
logging.files:
  name: filebeat
  keepfiles: 10
  rotateeverybytes: 1048576

Ważne jest, aby zrozumieć, że format pliku konfiguracyjnego to yml. Dlatego ważne jest, aby prawidłowo ustawiać spacje i znaki minus.

Filebeat potrafi sprawdzać plik konfiguracyjny i, jeśli składnia będzie zawierać błędy, wskaże, w którym wierszu i w którym miejscu wiersza składnia jest nieprawidłowa. Sprawdzenie wykonuje się w następujący sposób:

.filebeat.exe test config

Ponadto filebeat potrafi sprawdzać dostępność sieciową odbiornika logów. Sprawdzenie uruchamia się w ten sposób:

.filebeat.exe test output

W kolejnych częściach opowiem o podłączeniu i współpracy Exchange z komponentami Logstash i Kibana.

Przydatne linki

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster