Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web development, networking and server security. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Centralno logovanje sa softverom otvorenog izvora

Centralno logovanje sa softverom otvorenog izvora

objavljeno 2012-06-17

Igrao sam mnoge uloge u poslednjih nekoliko godina: sistem administrator, PostgreSQL and MySQL DBA, Perl programer, PHP programer, administrator mreže, i inženjer/referent bezbednosti. Zajedničko svemu tome je što imam sve neophodne podatke na raspolaganju, pretražive, i vidljive.

Dakle, o kojim podacima ja pričam? Iskreno govoreći, o svim. Sistemski logovi, logovi aplikacija, događaji, podaci o performansama sistema i podaci o saobraćaju mreže ključni su uslovi za donošenje bilo koje teške odluke o infrastrukturi, ako ne i ključni za trivijalne odluke o infrastrukturi i implementaciji koje svakodnevno moramo da donosimo.

Usred sam implementiranja sveobuhvatnog rešenja, a ovaj post je njegov opis kao i mapa o tome kako sam i zašto radio na njemu.

Korak 1: syslog

Obično počinjem razboritim rešenjem za prenos događaja koji se dešavaju na UNIX i Windows serverima na centralni log domaćina. Možda ćete morati da sakupite događaje na nivou centra podataka u zavisnosti od protoka. Postoji veliki broj opcija koje su vam dostupne za centralno logovanje sa syslog-om, a čini se da su favoriti:

  1. syslog-ng
  2. rsyslog

Oba su odličan izbor, ali ako imate ograničen budžet i čitate između redova popularne regulatorne politike (SOX, PCI-DSS,FISMA, FERPA, itd), možda biste mogli naročito da razmislite o 2 funkcije: garantovana isporuka, i šifrovani transfer. To nisu teška i brza pravila koje revizori trenutno proveravaju, ali proveravaće ih u bliskoj budućnosti.

Sa rsyslog-om, obe funkcije dostupne su u rešenju otvorenog izvora, dok to nije slučaj sa syslog-ng. Međutim, rsyslog ne radi na Windowsu, tako da ako imate veliki broj Windows servera, ionako ćete verovatno morati da potrošite više novca na rešenje centralnog logovanja. Ja nisam u tom položaju, tako da biram rsyslog.

Glavna mana rsyslog-a je sintaksa konfiguracionog fajla. Syslog-ng odlučio je da odbaci nasleđenu syslog config file sintaksu u korist čitljivog, razboritog formata. Rsyslog odlučio je da zadrži nasleđenu syslog konfiguracionu sintaksu i da je proširi za nove funkcije. Ovo izluđuje, ali ako nemate budžet za syslog-ng i treba vam šifrovanje i/ili zagarantovana isporuka, možete da ga osposobite.

Centralni Log Server

Prvo, moramo da podesimo mesto gde će naši logovi stizati. Konfigurisanje rsyslog centralnog servera znači konfigurisanje gde želimo da logovi žive, i kako bismo hteli da ih primamo. Ovog domaćina zovem 'logstorage-01".

Objasniću konfiguraciju korak po korak. Prvi deo podešava default šablone, radni direktorijum i učitava module koji su nam potrebni:

# Rsyslog Defaults
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$WorkDirectory /var/run/rsyslog

# Modules
$ModLoad immark
$ModLoad imudp
$ModLoad imtcp
$ModLoad imklog
$ModLoad imuxsock

Sada, utvrđujem da želim da slušam tcp i udp 514:

## Enable Listeners
$InputTCPServerRun 514
$UDPServerRun 514

Rsyslog koristi obrascei za imena fajlova i za izlaz. Ovo je primer oba. RemoteHost obrazac koristiće se za određivanje imena fajla za svaku poruku koja dolazi. ArcSightFormat koristiće se za reformatiranje poruke na način koji ArcSight Agent može da obradi.

# Templates
$template RemoteHost,"/var/log/remote/%HOSTNAME%/%$YEAR%/%$MONTH%-%$DAY%.log"
$template ArcSightFormat,"<%PRI%>%TIMESTAMP% %fromhost-ip% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"

Sada smo spremni da počnemo da radimo s porukama. Prva akcija koju sam izabrao jeste da se iz snmpd izbace sve poruke vezane za konekciju budući da one zauzimaju mnogo prostora na disku. Možete da onemogućite ovu vrstu logovanja u snmpd, ali to takođe služi kao dobar primer filtriranja loga i akcije izbacivanja '~'.

# Discard SNMPD Connection Messages
if $programname == 'snmpd' and ( $msg contains 'Connection from UDP' or $msg contains 'Received SNMP packet(s) from UDP' ) then ~

U ovom trenutku, zbog ‘~’ svaka poruka koja se podudara sa snmpd i stringovi koje sam naveo biće odbačeni. Sada želim da logujem sve na disk koristeći svoj RemoteHost obrazac. Važno je napomenuti da će i lokalnne syslog poruke takođe biti obuhvaćene sledećim pravilom:

# Archival Storage
#    All Messages, locally and remote stored to these rules
*.* ?RemoteHost

*.* govori rsyslog-u da sve zabeleži, ?RemoteHost je obrazac koji se koristi za ime fajla. Ovo sledeće pravilo pokazuje kako se šalju odabrane poruke UDP slušaocu koristeći format poruke:

# ArcSight
if $programname == 'named' then @arcsight.example.com;ArcSightFormat

Dakle, u ovom primeru, sve od imenovanog prosleđuje se na acrsight.example.com preko udp (@) port 514 (default) koristeći format (;) ArcSightFormat za tu poruku.

U ovom trenutku je naš dnevnik arhiviran i svako dodatno daljinsko prosleđivanje koje nam je potrebno je kompletirano. Sledeće što ćemo da uradimo jeste da odbacimo sve poruke koje ne potiču iz 'logstorage-01':

# If not sourced locally, stop processing message.
:source , !isequal , "logstorage-01" ~

Dakle, sada su ostali samo lokalni događaji i mi implementiramo lokalno logovanje. Ovaj format trebalo bi da bude poznat svakome ko je ranije radio sa syslogd:

# Local Logging
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
kern.*                                                  /var/log/kern.log
cron.*                                                  /var/log/cron
*.emerg                                                 *
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log

Podešavanje klijenata

Sledeće, hteli bismo da primamo logove na centralnom serveru, tako da treba da podesimo svoje klijente da šalju poruke. U ovom trenutku, ne konfigurišem šifrovanje poruka. Hteo bih garantovanu isporuku poruka na centralni log server. rsyslog ima nekoliko načina na koje to radi uključujući sopstveni protokol za isporuku. Ne treba mi neka suluda količina garancije; upotreba TCP-a i redosled na disku provešće me većim delom puta i jednostavni su za implementiranje.

Dakle, evo mog rsyslog.conf korak po korak:

# Rsyslog Defaults
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$WorkDirectory /var/run/rsyslog  # Default Location for Work Files

# Modules
$ModLoad immark
$ModLoad imklog
$ModLoad imuxsock

Ništa čudnog ovde, učitava module koji su nam potrebni, podešava standardni obrazac za poruke.

# Local Logging
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
kern.*                                                  /var/log/kern.log
cron.*                                                  /var/log/cron
*.emerg                                                 *
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log

Opet, ništa nečuveno. Osnovno snimanje poruka na disk u syslogd stilu. Sada smo spremni da šaljemo poruke našem centralnom serveru za skladištenje logova. Dakle, ovo bi bio dobar trenutak da se ukloni sve što ne želimo da pošaljemo iz niza. Opet, upotrebio sam filter poruka snmpd konekcije kao demonstraciju. Sve što se podudara s njim biće odbačeno od strane ‘~’.

# Discard SNMPD Spam
if $programname == 'snmpd' and ( $msg contains 'Connection from UDP' or $msg contains 'Received SNMP packet(s) from UDP' ) then ~

Dakle, sada smo spremni da zaista pošaljemo log poruke na centralni server. Prvo što treba da konfigurišemo je redosled na disku. To radimo na sledeći način:

# Remote Logging with On Disk Queuring Enabled
$ActionQueueType LinkedList         # Asynchronous Forwarding Mechanism
$ActionQueueFileName centralwork    # Enable disk mode queue
$ActionResumeRetryCount -1          # Infinite Retries
$ActionQueueSaveOnShutdown on       # Save Queue on Exit for reprocessing

A poslednje što nam treba je destinacija za logove za ovaj red:

*.*     @@logstorage-01.example.com:514

Treba naglasiti upotrebu '@ @', ovo precizira da želimo da koristimo TCP.

Razmišljanja

U ovom momentu imamo poprilično pouzdan transfer naših syslog poruka od naših UNIX domaćina na naš centralni log server. Zapamtite, konfigurisali smo centralni log server i sa TCP i sa UDP slušaocem. To znači da za sisteme koje rsyslog ne podržava i koji možda nisu u mogućnosti da koriste TCP isporuku možemo slati nasleđene UDP poruke na logstorage-01 i da će oni raditi.

Da biste naveli i Windows servere da učestvuju, možda biste hteli da istražite: syslog-win32, S.N.A.R.E., or eventlog-to-syslog. Nemam mnogo iskustva s njima, ali oni će komunicirati sa rsyslog-om u ovoj postavci.

Sada kada smo konfiguisali rsyslog, mogli bismo da koristimo syslog kao backend za logovanje naše aplikacije. Nemojte se previše ljutiti, uvek možete da koristite i nešto kao scribe ili Flume. Ali to je druga tema za pisanje.

Korak 2: Učinite nešto s tim porukama

Pre nego što nastavimo dalje, hteo bih da se obrati pažnja na jedan upadljiv problem, na Splunk. Nikada nisam radio sa Splunk-om. Čak i za mojih ~150 servera na mom prethodnom poslu, premašio sam 500 MB logova dozvoljenih dnevno. (Ljubitelj sam syslog-a, i zašto izmišljati neki novi protokolza logovanje kad već postoji jedan?) Kad je to rečeno, poverljivi ljudi koji imaju iskustva s njim kažu da je sjajan.

U stvari, nikada nisam naišao na nekoga ko je koristio Splunk da je imao išta negativno da kaže o njegovim performansama, skalabilnosti, ili iskustvima korisnika. Jedina primedba koju sam ikada čuo bila je da je skup; ne skup kao “organska govedina”, ali skup kao aston martin. Ako imate tu vrstu budžeta za trošenje na logovanje, samo napred. Predugo sam radio za previše siromašnih preduzeća i nisam mogao da zamislim trošenje stotine hiljada dolara na softver za logovanje.

Jako sam radoznao koliko mogu da se primaknem Splunk-ovom interfejsu i sredstvima sa softverom otvorenog izvora. Ono što sledi je moj pokušaj da uradim upravo to.

Graylog2

Kada sam prvi put krenuo ovim putem, neko je predložio da pogledam Graylog2. Njegov korisnički interfejs je fantastičan i utiče na strava tehnologije kao što je "MongoDB" i koristi nacrtanu gorilu iz stripa The Oatmeal. Kada se ulogujete, dok se interfejs učitava, kaže: "Mounting party hats!" Koliko je to kul? Prekul.

Obožavam softver koji ima smisao za humor. On poboljšava korisničko iskustvo. Ispod površine, Graylog2 ima veliki broj odličnih opcija uključujući sopstveni log format za prosleđivanje poruka na način koji omogućava laku serijalizaciju i deserijalizaciju podataka u nizu logova. Ovaj format je GELF.

Nisam imao suviše problema sa instaliranjem Graylog2, i iskreno, bio sam vrlo zadovolja interfejsom i konfigurabilnošću. Poslao sam mu samo mali niz log saobraćaja i bio je u stanju da dobije podatke vrlo brzo. Takođe sam primetio da je izdanje koje sam preuzeo bilo prvo koje je podržalo ElasticSearch kao skladišni backend pored MongoDB.

Za one među vama koji nisu upoznati sa ElasticSearch, to je grupisana tekstualna platforma za pretraživanje zasnovana na Lucene. Ako nikada niste imali privilegiju da radite sa ElasticSearch-om, mogu vam reći da je čaroban. Podržavam nekoliko ElasticSearch klastera u proizvodnom okruženju i mogu da vam kažem iz prve ruke da je to odličan proizvod, s moje tačke gledišta. Jedina primedba koju imam jeste da je malo previše čaroban. Zbog njega se osećam beznačajno kao sistem administrator, zato što treba da radim vrlo malo da bih ga podržao. Takođe je neverovatno brz i neverovatno skalabilan.

Dobro, skalabilan je ako dizajnirate svoje indekse na određeni način. I tu se predstava za Graylog2 završava. Vidite, ElasticSearch koristi sharding za distribuciju podataka u okviru klastera. Možete da odredite koliko shard-ova želite daindeks ima kada ga kreirate. Takođe možete da odredite koliko primeraka svakog shard-a želite da držite kroz klaster za zalihe. Možete čak i da radite neke kul stvari kao da kažete "čuvaj primerak na svakom centru podataka i nikada ne drži sve primerke jednog shard-a u istom ramu u istom centru podataka." To znači da možete da procenite performanse u vreme stvaranja indeksa. Ako imam 5 shard-ova, mogu da se proširim do 5 čvorova klastera i da poboljšam performanse, posle toga, samo dobijam zalihe budući da će samo 1 shard biti master u jednom trenutku.

Dakle zašto je ovo problem sa Graylog2? Pa, Graylog2 koristi jedan indeks za celu svoju bazu podataka. Možda je to prateći efekat njihovog relativno kasnog usvajanja ElasticSearch-a kao backenda za skladištenje logova. Ali to znači da treba da izgradite indeks u vreme početne instalacije da se nosi s gomilom logova za budućnost vašeg rešenja logovanja. Zvuči jednostavno? Pa, nije. Ako imate veliku zapreminu logova i nameravate da ih dugo zadržite radi usaglašavanja, Graylog2 upotreba ElasticSearch-a napraviće vam značajne probleme sa performansama, čak i da ste znali da vam treba 20 čvorova u klasteru.

Dakle, za veliku instalacije s visokom zapreminom, ne mogu preporučiti Graylog2. Lep je, zabavan je, ali ElasticSearch šema indeksiranja trenutno ne funkcioniše.

Logstash

Šta još postoji? Pa, tu je Logstash. Logstash je više usmeravanje logova ili protokol prevoda nego išta drugo. Pogledajte spisak ulaza, filtera i izlaza koje podržava:

ulazi

  • amqp
  • exec
  • file
  • gelf
  • redis
  • stdin
  • stomp
  • syslog
  • tcp
  • twitter
  • xmpp
  • zeromq

filteri

  • date
  • dns
  • gelfify
  • grep
  • grok
  • grokdiscovery
  • json
  • multiline
  • mutate
  • split
  • izlazi

  • amqp
  • elasticsearch
  • elasticsearch_river
  • file
  • ganglia
  • gelf
  • graphite
  • internal
  • loggly
  • mongodb
  • nagios
  • null
  • redis
  • statsd
  • stdout
  • stomp
  • tcp
  • websocket
  • xmpp
  • zabbix
  • zeromq
  • AH-HA! Primetićete da je jedan od izlaza koje logstash podržava ElasticSearch. Zašto onda koristiti logstash umesto Graylog2? To ima veze sa indeksima. Graylog2 implementira jedan indeks 'graylog2' u ElasticSearch klaster. To čini pretraživački API prilično jednostavnim, jer prosto određujem taj indeks za pretraživanje i dajem svoj kriterijum filtriranja. Mana je što je ovaj indeks OGROMAN, tako da bi proste pretrage, ili neogrničene pretrage, mogle dramatično uticati na dostupnost čitavog klastera.

    Logstash programeri izgleda da imaju više iskustva sa ElasticSearch modelom i dizajniranirali su ga sa skalabilnošću u vidu. Logstash elasticsearch izlazni mehanizam svaki danstvara novi indeks. To znači da je potrebno malo više logike na pretraživačkom frontend-u da biste odredili koje indekse treba tražiti u podacima koje ispitujete međutim, možete svakodnevno da menjate sharding definicije i uvećavate svoj klaster kako se potrebe menjaju. Ovo takođe omogućava optimizaciju indeksa. Neko mnogo pametniji od mene može bolje da objasni, ali ako je indeks u read-only (ili retko write) stanju, kao jučerašnji indeks, može se veoma optimizovati sa Lucene-om da bi se postigle bolje performanse.

    Izvlačenje korisničkih podataka

    Jedna od mojih prvih upotreba Logstash-a bila je da se obezbedi bolji korisnički interfejs za OSSEC-HIDS. OSSEC obavlja neverovatan posao bezbednosnog praćenja domaćina i agregacije domaćina, ali interfejs ipak dosta zaostaje, po mom mišljenju. Međutim, mogao bih reći isto i za Logstash. To je u redu, jer možemo da utičemo na prednosti Logstash-a da obezbedimo bolje interfejse.

    Pronašao sam ovaj sjajan izveštaj o slanju OSSEC obaveštenja na Logstash za obradu.

    Gde Logstash ne funkcioniše

    Logstash nije savršen, njegov frontend ima dosta falinki. Međutim, zbog infrastrukture i fleksibilnosti koju pruža, više bih voleo da se programeri fokusiraju na ulaze, filter i izlaze nego da traće vredne resurse na frontends. Ako ste nešto naučili u open source zajednici, neko će popraviti taj problem. I ispostavilo se da već jesu:

    Pretraživa i vidljiva: Kibana

    Kao što sam već istakao, ElasticSearch skladištenje u logstash je odlično. Koristi indekse tačno onako kako su dizajnirani da se koriste. To znači da performanse, pouzdanost i skalabilnost logstash-ovog backend-a za skladištenje pariraju Splunk-ovim. Međutim, njegov front-end je truba u poređenju sa Splunk-ovim. E, tu nastupa Kibana.

    Kibana je Bootstrap-zasnovan PHP front-end koji utiče na indekse koje Logstash stvara u ElasticSearch-u da bi obezbedila divan front-end za log pretraživanje. Ona takođe dodaje i funkcionalnost da se radi trending i analiza logova iz Logstash-a! Imajte na umu da možete da kreirate sopstvena polja u logstash-u koristeći grok, tako da možemo da izvučemo, trendujemo, proračunamo i analiziramo podatake u realnom vremenu u prilično lepom i moćnom interfejsu.

    Kibana tako savršeno popunjava rupu sa Logstash interfejsom. Ne daje mi sve što bih dobio sa Splunk-om, ali samo sam dodirnuo funkcionalnost koju mogu da izvučem sa Logstash-om.

    Korak 3: Sve vaše statistike pripadaju Graphite-u

    Graphite je strava. Ako ga ne koristite, OSTAVITE SVE I ODMAH GA POKRENITE! Za upoznavanje s njegovim moćima, evo brzog pregleda njegovih karakteristika. Ova prezentacija zasniva se na nečemu što je Jason Dixon podelio sa mnom, i stoga obavezno posetite njegov blog i pročitajte njegov niz pogrešno nazvanih “Beskorisnih Graphite saveta”.

    Ako ste odvojili vreme da pročitate pregled i te savete, verovatno mislite "O BOŽE, PA JA SVE MOGU DA STAVIM U GRAFIKON”. Ako ne mislite to, ponovo sve pročitajte i ponovo razmislite. Možda ste propustili timeShitft() ? Možda niste zaluđenik za statiskikom poput mene? Svesrdno vam predlažem da postanete, možda da počnete ovde.

    Dakle, možete da pišete grok obrasce da biste izvlačili metriku iz svojih logova. Onda možete da koristite statsd da pratite tu metriku u Graphite-u.

    STFU, preopterećenje informacijama

    Slažem se, ovo je mnogo za jedan post, i još uvek imam mnogo toga da kažem o svoj ovoj tehnologiji ovde. Trudiću se da vam i dalje prenosim velike količine podataka dok usavršavam svoju postavku. Ciljao sam da odgovorim na pitanje koliko mogu da se približim Splunk-u sa softverom otvorenog izvora. Iskreno, ne znam. Oslanjam se na vas da saznamo. Započnite razgovor sa mnom, na twitter-u @reyjrar.

    Published (Last edited): 20-06-2013 , source: http://edgeofsanity.net/article/2012/06/17/central-logging-with-open-source-software.html