Vi förenar ELK och Exchange. Del 2

Vi förenar ELK och Exchange. Del 2

Jag fortsÀtter min berÀttelse om hur man förenar Exchange och ELK (början ). Ett typiskt exempel pÄ anvÀndning:). Jag pÄminner om att denna kombination kan utan tvekan hantera en mycket stor mÀngd loggar. Denna gÄng kommer vi att diskutera hur man stÀller in Exchange med komponenterna Logstash och Kibana.

Logstash i ELK-stacken anvÀnds för intelligent logghantering och förberedelse av loggar för lagring i Elastic i form av dokument, vilket gör det lÀttare att skapa olika visualiseringar i Kibana.

Installation

BestÄr av tvÄ steg:

  • Installation och konfiguration av paketet OpenJDK.
  • Installation och konfiguration av paketet Logstash.

Installation och konfiguration av paketet OpenJDK

Paketet OpenJDK mÄste laddas ner och packas upp i en viss katalog. Sedan behöver sökvÀgen till denna katalog lÀggas till i $env:Path och $env:JAVA_HOME variablerna i Windows-operativsystemet:

Vi förenar ELK och Exchange. Del 2

Vi förenar ELK och Exchange. Del 2

LÄt oss kontrollera Java-versionen:

PS C:> java -version
openjdk version "13.0.1" 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)

Installation och konfiguration av paketet Logstash

Ladda ner arkivfilen med Logstash-distributionen hÀrifrÄn. Arkivet bör packas upp i roten av disken. Det Àr inte bra att packa upp i en mapp C:Program Files , Logstash vÀgrar att starta ordentligt. Sedan mÄste du justera filen jvm.options , som ansvarar för minnesallokering för Java-processen. Jag rekommenderar att ange hÀlften av serverns RAM. Om den har 16 GB RAM, bör standardnycklarna vara:

-Xms1g
-Xmx1g

mÄste bytas ut mot:

-Xms8g
-Xmx8g

Dessutom Àr det rimligt att kommentera raden -XX:+UseConcMarkSweepGC. Mer om detta ). Ett typiskt exempel pÄ anvÀndning:. NÀsta steg Àr att skapa en standardkonfiguration i filen logstash.conf:

input {
 stdin{}
}
 
filter {
}
 
output {
 stdout {
 codec => "rubydebug"
 }
}

Med denna konfiguration lÀser Logstash data frÄn konsolen, passerar genom en tom filter och skriver ut tillbaka till konsolen. AnvÀndning av denna konfiguration gör det möjligt att kontrollera Logstash-funktionaliteten. För att göra detta, kör vi den i interaktivt lÀge:

PS C:...bin> .logstash.bat -f .logstash.conf
...
[2019-12-19T11:15:27,769][INFO ][logstash.javapipeline    ][main] Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[2019-12-19T11:15:27,847][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2019-12-19T11:15:28,113][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}

Logstash har framgÄngsrikt startat pÄ port 9600.

Det sista steget i installationen: starta Logstash som en Windows-tjÀnst. Detta kan göras till exempel med hjÀlp av paketet NSSM:

PS C:...bin> .nssm.exe install logstash
TjÀnsten "logstash" harinstallerats framgÄngsrikt!

Fel-tolerans

Skydd av loggar vid överföring frÄn den ursprungliga servern sÀkerstÀlls genom mekanismen för Persistent Queues.

Hur det fungerar

Schemat för placering av köer i processen för logghantering: input → queue → filter + output.

Input-plugin tar emot data frÄn loggkÀllan, skriver dem till kön och skickar en bekrÀftelse pÄ mottagandet av data till kÀllan.

Meddelanden frÄn kön bearbetas av Logstash, gÄr igenom en filter och output-plugin. NÀr bekrÀftelsen pÄ att loggen har skickats tas emot frÄn output tar Logstash bort den bearbetade loggen frÄn kön. Om Logstash stoppas sÄ förblir alla obehandlade meddelanden och meddelanden utan bekrÀftelse om skickande kvar i kön, och Logstash kommer att fortsÀtta bearbeta dem vid nÀsta start.

InstÀllning

Regleras med nycklar i filen C:Logstashconfiglogstash.yml:

  • queue.type: (möjliga vĂ€rden — persisted och memory (standard)).
  • path.queue: (sökvĂ€g till mappen med köfiler, som som standard lagras i C:Logstashqueue).
  • queue.page_capacity: (maximal storlek pĂ„ kö-sidan, standardvĂ€rdet Ă€r 64mb).
  • queue.drain: (true/false — aktiverar/deaktiverar stopp av köbehandling innan Logstash stĂ€ngs. Jag rekommenderar inte att aktivera detta, eftersom det direkt pĂ„verkar hastigheten pĂ„ serveravstĂ€ngning).
  • queue.max_events: (maximalt antal hĂ€ndelser i kön, standardvĂ€rdet Ă€r 0 (obegrĂ€nsat)).
  • queue.max_bytes: (maximal storlek pĂ„ kön i byte, standardvĂ€rdet Ă€r 1024mb (1gb)).

Om de Àr instÀllda queue.max_events och queue.max_bytes, kommer meddelanden att sluta tas emot i kön nÀr nÄgot av dessa vÀrden nÄs. Mer information om Persistent Queues finns i ). Ett typiskt exempel pÄ anvÀndning:.

Exempel pÄ en del av logstash.yml som ansvarar för köinstÀllningen:

queue.type: persisted
queue.max_bytes: 10gb

InstÀllning

Logstash-konfigurationen bestÄr vanligtvis av tre delar som ansvarar för olika faser av bearbetningen av inkommande loggar: mottagande (input-sektion), parsning (filter-sektion) och utskick till Elastic (output-sektion). Nedan kommer vi att titta nÀrmare pÄ varje del.

Input

Vi tar emot den inkommande strömmen med rÄa loggar frÄn Filebeat-agenter. Det Àr just denna plugin vi anger i input-sektionen:

input {
  beats {
    port => 5044
  }
}

Med denna instÀllning börjar Logstash att lyssna pÄ port 5044, och vid mottagande av loggar bearbetas de enligt instÀllningarna i filter-sektionen. Vid behov kan loggkanalen frÄn Filebeat sÀkras med SSL. Mer information om instÀllningarna för Beats-plugin finns beskrivet. ). Ett typiskt exempel pÄ anvÀndning:.

Filter

Alla intressanta textloggar som genereras av Exchange har csv-format med de fÀlt som beskrivs i sjÀlva loggfilerna. För att parsa csv-poster erbjuder Logstash oss tre plugins: dissect, csv och grok. Den första Àr den mest snabba, men klarar bara av att parsa de enklaste loggarna.
Till exempel kommer följande post att delas upp i tvÄ (pÄ grund av nÀrvaron av ett kommatecken inuti fÀltet), vilket kommer att göra att loggen parsas fel:


,"MDB:GUID1, Mailbox:GUID2, Event:526545791, MessageClass:IPM.Note, CreationTime:2020-05-15T12:01:56.457Z, ClientType:MOMT, SubmissionAssistant:MailboxTransportSubmissionEmailAssistant",


Den kan anvÀndas vid parning av loggar, till exempel frÄn IIS. I detta fall kan filtersektionen se ut pÄ följande sÀtt:

filter {
  if "IIS" in [tags] {
    dissect {
      mapping => {
        "message" => "%{date} %{time} %{s-ip} %{cs-method} %{cs-uri-stem} %{cs-uri-query} %{s-port} %{cs-username} %{c-ip} %{cs(User-Agent)} %{cs(Referer)} %{sc-status} %{sc-substatus} %{sc-win32-status} %{time-taken}"
      }
      remove_field => ["message"]
      add_field => { "application" => "exchange" }
    }
  }
} 

Konfigurationen av Logstash gör att vi kan anvÀnda villkorssatser, dÀrför kan vi i dissect-pluginet rikta oss enbart till loggar som har mÀrkts med filebeat-taggen IIS. Inuti pluginet mappar vi fÀltvÀrden med deras namn, tar bort det ursprungliga fÀltet meddelande, som innehöll posten frÄn loggen, och vi kan lÀgga till ett valfritt fÀlt som till exempel kan innehÄlla namnet pÄ applikationen frÄn vilken vi samlar loggar.

NÀr det gÀller spÄrningsloggar Àr det bÀttre att anvÀnda csv-pluginet, den kan korrekt hantera komplexa fÀlt:

filter {
  if "Tracking" in [tags] {
    csv {
      columns => ["date-time","client-ip","client-hostname","server-ip","server-hostname","source-context","connector-id","source","event-id","internal-message-id","message-id","network-message-id","recipient-address","recipient-status","total-bytes","recipient-count","related-recipient-address","reference","message-subject","sender-address","return-path","message-info","directionality","tenant-id","original-client-ip","original-server-ip","custom-data","transport-traffic-type","log-id","schema-version"]
      remove_field => ["message", "tenant-id", "schema-version"]
      add_field => { "application" => "exchange" }
    }
  }
}

Inuti pluginet mappar vi fÀltvÀrden med deras namn, tar bort det ursprungliga fÀltet meddelande (och Àven fÀltet tenant-id och schema-version), som innehöll posten frÄn loggen, och vi kan lÀgga till ett valfritt fÀlt som kan innehÄlla namnet pÄ applikationen frÄn vilken vi samlar loggar.

Vid utgÄngen av filtersteget kommer vi att fÄ dokument som i grova drag Àr klara för visualisering i Kibana. Det vi saknar Àr följande:

  • Numeriska fĂ€lt kommer att tolkas som text, vilket hindrar operationer pĂ„ dem. NĂ€mligen fĂ€lten time-taken frĂ„n IIS-loggen, samt fĂ€lten recipient-count och total-bites frĂ„n Tracking-loggen.
  • Den standard tidsstĂ€mpeln för dokumentet kommer att innehĂ„lla tiden för behandling av loggen, inte tiden för registreringen pĂ„ serversidan.
  • FĂ€ltet recipient-address kommer att se ut som en enda struktur, vilket gör det omöjligt att genomföra analys med rĂ€kning av e-postmottagare.

Det Àr dags att lÀgga till lite magi i processen för logghantering.

Konvertering av numeriska fÀlt

Pluginet dissect har en option convert_datatype, som kan anvÀndas för att konvertera textfÀlt till digitalt format. Till exempel sÄ hÀr:

dissect {
  

  convert_datatype => { "time-taken" => "int" }
  

}

Det Àr vÀrt att komma ihÄg att denna metod endast fungerar om fÀltet sÀkerligen innehÄller en strÀng. Null-vÀrden i fÀlten hanteras inte av denna option och ger ett undantag.

För tracking-loggar Àr det bÀst att inte anvÀnda den motsvarande metoden convert, eftersom fÀlten recipient-count och total-bites kan vara tomma. För att konvertera dessa fÀlt Àr det bÀttre att anvÀnda pluginet mutate:

mutate {
  convert => [ "total-bytes", "integer" ]
  convert => [ "recipient-count", "integer" ]
}

Uppdelning av recipient_address i individuella mottagare

Denna uppgift kan ocksÄ lösas med hjÀlp av pluginet mutate:

mutate {
  split => ["recipient_address", ";"]
}

Ändra timestamp

I fallet med tracking-loggar Àr uppgiften mycket enkel att lösa med pluginet date, som hjÀlper till att skriva in datum och tid i rÀtt format frÄn fÀltet timestamp date-time date { match => [ "date-time", "ISO8601" ] timezone => "Europe/Moscow" remove_field => [ "date-time" ] }:

I fallet med IIS-loggar mÄste vi slÄ samman data i fÀlten

med hjÀlp av pluginet mutate, ange vÄr önskade tidszon och placera denna tidsstÀmpel i date och time med hjÀlp av pluginet date: timestamp mutate { add_field => { "data-time" => "%{date} %{time}" } remove_field => [ "date", "time" ] } date { match => [ "data-time", "YYYY-MM-dd HH:mm:ss" ] timezone => "UTC" remove_field => [ "data-time" ] }

Output-sektionen anvÀnds för att skicka de bearbetade loggarna till loggmottagaren. Vid direkt sÀndning till Elastic anvÀnds pluginet

Output

elasticsearch , dÀr serveradressen och mönstret för indexnamnet anges för att skicka det formaterade dokumentet:output { elasticsearch { hosts => ["127.0.0.1:9200", "127.0.0.2:9200"] manage_template => false index => "Exchange-%{+YYYY.MM.dd}" } }

Slutlig konfiguration

Den slutliga konfigurationen kommer att se ut pÄ följande sÀtt:

Slutlig konfiguration

input {
  beats {
    port => 5044
  }
}
 
filter {
  if "IIS" in [tags] {
    dissect {
      mapping => {
        "message" => "%{date} %{time} %{s-ip} %{cs-method} %{cs-uri-stem} %{cs-uri-query} %{s-port} %{cs-username} %{c-ip} %{cs(User-Agent)} %{cs(Referer)} %{sc-status} %{sc-substatus} %{sc-win32-status} %{time-taken}"
      }
      remove_field => ["message"]
      add_field => { "application" => "exchange" }
      convert_datatype => { "time-taken" => "int" }
    }
    mutate { 
      add_field => { "data-time" => "%{date} %{time}" }
      remove_field => [ "date", "time" ]
    }
    date { 
      match => [ "data-time", "YYYY-MM-dd HH:mm:ss" ]
      timezone => "UTC"
      remove_field => [ "data-time" ]
    }
  }
  if "Tracking" in [tags] {
    csv {
      columns => ["date-time","client-ip","client-hostname","server-ip","server-hostname","source-context","connector-id","source","event-id","internal-message-id","message-id","network-message-id","recipient-address","recipient-status","total-bytes","recipient-count","related-recipient-address","reference","message-subject","sender-address","return-path","message-info","directionality","tenant-id","original-client-ip","original-server-ip","custom-data","transport-traffic-type","log-id","schema-version"]
      remove_field => ["message", "tenant-id", "schema-version"]
      add_field => { "application" => "exchange" }
    }
    mutate {
      convert => [ "total-bytes", "integer" ]
      convert => [ "recipient-count", "integer" ]
      split => ["recipient_address", ";"]
    }
    date {
      match => [ "date-time", "ISO8601" ]
      timezone => "Europe/Moscow"
      remove_field => [ "date-time" ]
    }
  }
}
 
output {
  elasticsearch {
    hosts => ["127.0.0.1:9200", "127.0.0.2:9200"]
    manage_template => false
    index => "Exchange-%{+YYYY.MM.dd}"
  }
}

Nyttiga lÀnkar:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster