SÔbrune ELK ja Exchange. Osa 2

SÔbrune ELK ja Exchange. Osa 2

JÀtkan oma juttu sellest, kuidas sÔbrustada Exchange'i ja ELK-i (algus siin). Tuletan meelde, et see kombinatsioon suudab kindlalt töödelda vÀga suurt hulka logisid. Sel korral rÀÀgime, kuidas seadistada Exchange'i koostööd Logstash'i ja Kibana komponentidega.

Logstash'i kasutatakse ELK-hunnikus logide intelligentseks töötlemiseks ja nende ettevalmistamiseks Elasticus dokumentide kujul, mille pÔhjal on mugav luua erinevaid visualiseeringuid Kibanas.

Installeerimine

Koosneb kahest etapist:

  • OpenJDK paketi installimine ja seadistamine.
  • Logstash paketi installimine ja seadistamine.

OpenJDK paketi installimine ja seadistamine

OpenJDK paketi tuleb alla laadida ja lahti pakkida kindlasse katalooge. SeejĂ€rel tuleb selle katalooge tee lisada Windowsi operatsioonisĂŒsteemi muutujatesse $env:Path ja $env:JAVA_HOME:

SÔbrune ELK ja Exchange. Osa 2

SÔbrune ELK ja Exchange. Osa 2

Kontrollime Java versiooni:

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)

Logstash paketi installimine ja seadistamine

Laadige alla Logstash'i jaotise arhiivifail siit. Arhiiv tuleb lahti pakkida ketta juurtesse. Ei tasu lahti pakkida kausta C:Program Files , Logstash keeldub Ôigesti kÀivitumast. SeejÀrel tuleb faili lisada jvm.options Java protsessi mÀlu mÀÀramiseks vajalikud parameetrid. Soovitan mÀÀrata pool serveri RAM-ist. Kui serveril on 16 GB RAM-i, siis vaikimisi parameetrid:

-Xms1g
-Xmx1g

tuleb asendada:

-Xms8g
-Xmx8g

Lisaks on mÔistlik kommentaariks mÀrkida rida -XX:+UseConcMarkSweepGC. Rohkem selle kohta siin. JÀrgmine samm on vaikimisi konfigureerimine failis logstash.conf:

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

Selle konfiguratsiooni kasutamisel loeb Logstash andmeid konsoolist, lĂ€bib tĂŒhja filtri ja tagastab andmed konsooli. Selle konfiguratsiooniga saab kontrollida Logstashi töövĂ”imet. Selleks kĂ€ivitame selle interaktiivses reĆŸiimis:

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 kÀivitati edukalt pordil 9600.

Installeerimise viimane samm: Logstashi kÀitamine Windowsi teenusena. Seda saab teha nÀiteks paketi abil NSSM:

PS C:...bin> .nssm.exe install logstash
Teenus "logstash" on edukalt installitud!

Katastroofitaluvus

Logide sÀilitamine edastamise ajal algserverist on tagatud Pikaajaliste Ridade mehhanismiga.

Kuidas see töötab

Ridade asukoha skeem logide töötlemise protsessi jooksul: input → queue → filter + output.

Input plugin saab andmeid logi allikast, salvestab need jÀrjekorda ja saadab allikatele andmete vastuvÔtmise kinnituse.

JÀrjekorrast saadetud sÔnumid töötleb Logstash, need lÀbivad filtri ja output plugina. Kui output annab logi edastamise kinnituse, kustutab Logstash töötlenud logi jÀrjekorrast. Kui Logstash peatub, jÀÀvad kÔik töötlemata sÔnumid ja sÔnumid, mille kohta ei ole saadud kinnitust edastamisest, jÀrjekorda ning Logstash jÀtkab nende töötlemist jÀrgmise kÀivitamise ajal.

Seadistamine

Reguleeritakse failis C:Logstashconfiglogstash.yml:

  • queue.type: (vĂ”imalikud vÀÀrtused — persisted ja memory (vaikimisi)).
  • path.queue: (tee kausta, kus asuvad jĂ€rjekorra failid, mis vaikimisi asuvad C:Logstashqueue-s).
  • queue.page_capacity: (jĂ€rjekorra maksimaalne lehekĂŒlje suurus; vaikimisi vÀÀrtus — 64mb).
  • queue.drain: (true/false — aktiveerib/deaktiveerib jĂ€rjekorra töötlemise peatamise Logstash'i sulgemisel. Soovitame mitte aktiveerida, kuna see mĂ”jutab serveri sulgemise kiirus).
  • queue.max_events: (maximaalne sĂŒndmuste arv jĂ€rjekorras, vaikimisi — 0 (piiramatu)).
  • queue.max_bytes: (maximaalne jĂ€rjekorra suurus baitides, vaikimisi — 1024mb (1gb)).

Kui on seadistatud queue.max_events ja queue.max_bytes, siis sĂ”numite vastuvĂ”tt jĂ€rjekorda lĂ”petatakse, kui saavutatakse ĂŒkskĂ”ik millise nende seadistuste vÀÀrtus. Rohkem teavet Persistent Queues kohta on kirjutatud siin.

NÀide osast logstash.yml failist, mis vastutab jÀrjekorra seadistamise eest:

queue.type: persisted
queue.max_bytes: 10gb

Seadistamine

Logstash'i konfiguratsioon koosneb tavaliselt kolmest osast, mis vastutavad erinevate etappide eest sissetulevate logide töötlemisel: vastuvĂ”tt (input sektsioon), parsimine (filter sektsioon) ja saatmine Elasticusse (output sektsioon). Allpool vaatleme neid igaĂŒht lĂ€hemalt.

Sisend

VastuvÔtame toorandmeid filebeat'i agentidelt. Just selle plugina mÀÀrame input sektsioonis:

input {
  beats {
    port => 5044
  }
}

PĂ€rast sellist seadistust hakkab Logstash kuulama porti 5044 ning töötleb logisid vastavalt filtri sektsiooni seadistustele. Vajadusel saab filebiti logide vastuvĂ”tukanali ĂŒmber pakkida SSL-iga. Plugin beats seadistuste kohta on rohkem teavet. siin.

Filtreerimine

KÔik Exchange'i genereeritud huvitavad tekstilogid on csv-formaadis ning logifailis on kirjeldatud vÀljad. Csv-kandjate parsimiseks pakub Logstash kolme pluginat: dissect, csv ja grok. Esimene on kÔige kiirem, kuid suudab parsimisega hakkama saada vaid kÔige lihtsamate logidega.
NÀiteks jagab see jÀrgmise kirje kaheks (sisevÀlja koma tÔttu), mistÔttu logi tÔlgendatakse valesti:


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


Seda saab kasutada nÀiteks IIS-i logide parsimiseks. Sel juhul vÔib filtri sektsioon vÀlja nÀha jÀrgmiselt:

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" }
    }
  }
} 

Logstashi konfiguratsioon vÔimaldab kasutada tingimuslikke operaatoreid, seetÔttu saame dissect pluginasse suunata ainult logid, mis on mÀrgistatud filebeat sildiga IIS. Pluginas seome vÀljaannete vÀÀrtused nende nimedega, eemaldame algse vÀlja message, mis sisaldas logi kirjet, ning saame lisada omavolilise vÀljundi, mis vÔib nÀiteks sisaldada rakenduse nime, mille logisid kogume.

Juhul, kui tegeleme jÀlgimislogidega, on parim kasutada csv pluginat, mis oskab korrektselt töödelda keerulisi vÀlju:

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" }
    }
}

Pluginas seome vÀljaannete vÀÀrtused nende nimedega, eemaldame algse vÀlja message (ja ka vÀljad tenant-id ja schema-version), mis sisaldas logi sissekannet ning saame lisada suvalise vÀlja, mis nÀiteks sisaldab rakenduse nime, millest kogume logisid.

Filtreerimise etapi vÀljundis saame dokumendid, mis on esimeses lÀhenemises valmis visualiseerimiseks Kibanas. Meil puudub veel jÀrgnev:

  • Numbrilised vĂ€ljad tuvastatakse tekstina, mis ei vĂ”imalda nendega tehingute tegemist. EelkĂ”ige vĂ€ljadel time-taken IIS logist ning ka vĂ€ljadel recipient-count ja total-bites Tracking logis.
  • Dokumendi standardne ajatempleeritud ei sisalda logi töötlemise aega, vaid serveripoolse salvestamise aega.
  • VĂ€li recipient-address nĂ€eb vĂ€lja ĂŒhe ahelana, mis ei vĂ”imalda meil analĂŒĂŒsi lĂ€bi viia e-kirjade saajate arvu peale.

On aeg lisada logitöötlusprotsessi veidi vÔlu.

Numbriliste vÀljade konverteerimine

Dissect pluginal on valik convert_datatype, mida saab kasutada tekstivÀlja konverteerimiseks numbriliseks vorminguks. NÀiteks nii:

dissect {
  

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

}

Oluline on meeles pidada, et see meetod sobib ainult juhul, kui vÀli sisaldab kindlasti stringi. Null-vÀÀrtusi vÀljadest see meetod ei töötle ja pÔhjustab erandi.

JĂ€lgimislogide jaoks ei ole sarnast konverteerimismeetodit parem kasutada, kuna vĂ€ljad vĂ”ivad olla tĂŒhjad. recipient-count ja total-bites Nende vĂ€ljade konverteerimiseks on parem kasutada pistikprogrammi. mutate:

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

recipient_address jagamine eraldi saajateks.

Seda ĂŒlesannet saab samuti lahendada pistikprogrammi mutate abil:

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

Muudame timestamp'i.

JĂ€lgimislogide puhul lahendab ĂŒlesande vĂ€ga lihtsalt pistikprogramm date, mis aitab sisestada vajalikku kuupĂ€eva ja aega timestamp vĂ€ljast. date-time:

date {
  match => [ "date-time", "ISO8601" ]
  timezone => "Europe/Moscow"
  remove_field => [ "date-time" ]
}

IIS logide puhul peame ĂŒhendama vĂ€ljade andmed date ja aeg pistikprogrammi mutate abil, mÀÀrama soovitud ajatsooni ja paigutama selle ajatempli timestamp pistikprogrammi date abil:

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" ]
}

VĂ€ljund

VÀljund sektsioon on mÔeldud töödeldud logide saatmiseks logide vastuvÔtjana. Otsese saatmise korral Elasticusse kasutatakse pistikprogrammi elasticsearch, kus mÀÀratakse serveri aadress ja indeksi nime mall saatmiseks genereeritud dokumendile:

output {
  elasticsearch {
    hosts => ["127.0.0.1:9200", "127.0.0.2:9200"]
    manage_template => false
    index => "Exchange-%{+YYYY.MM.dd}"
  }
}

LÔplik konfiguratsioon

LÔplik konfiguratsioon nÀeb vÀlja jÀrgmiselt:

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}"
  }
}

Kasulikud lingid:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster