40
1/40 Syslog-NG (nem csak) fejlesztőknek Molnár István (Kayapo) Pásztor János (janoszen)

Syslog-NG (nem csak) fejlesztőknek

Embed Size (px)

Citation preview

Page 1: Syslog-NG (nem csak) fejlesztőknek

1/40

Syslog-NG (nem csak) fejlesztőknek

Molnár István (Kayapo)Pásztor János (janoszen)

Page 2: Syslog-NG (nem csak) fejlesztőknek

2/40

A Docler Akadémia

● A Docler Holding belső előadás-sorozataként jött létre.● Ez a második nyilvános előadás.● Minden kedden 18:30-tól várunk egy-egy érdekes

témával.● További infók a

http://www.facebook.com/doclerakademia oldalon.

Page 3: Syslog-NG (nem csak) fejlesztőknek

3/40

Miért erről és miért nektek?

● A logolás fontos, de sokszor elhanyagolt téma.● A logolás nem csak a rendszergazda feladata!● Ti tervezitek meg az alkalmazásokat, amik logolni

fognak.

Page 4: Syslog-NG (nem csak) fejlesztőknek

4/40

A logolásról általában

Avagy amit a témáról tudni érdemes

Page 5: Syslog-NG (nem csak) fejlesztőknek

5/40

Miért logolunk?

● Működés monitorozása● Anomáliák felfedezése● Statisztikai adatgyűjtés

Page 6: Syslog-NG (nem csak) fejlesztőknek

6/40

A rossz logüzenet

● Túlzott rövidség / érthetetlenség● „App start”● „Error 42”● „Exception thrown without a stack frame in Unknown

on line 0”● „Parse error: syntax error, unexpected

T_PAAMAYIM_NEKUDOTAYIM in ...”

Page 7: Syslog-NG (nem csak) fejlesztőknek

7/40

A rossz logüzenet● Túlzott bőbeszédűség (zaj)

● java.lang.NullPointerException at com.mysql.jdbc.Statement.setMaxRows(Statement.java:2178) at coldfusion.server.j2ee.sql.JRunStatement.setMaxRows(JRunStatement.jav a:214) at coldfusion.sql.Executive.executeQuery(Executive.java:1229) at coldfusion.sql.Executive.executeQuery(Executive.java:1008) at coldfusion.sql.Executive.executeQuery(Executive.java:939) at coldfusion.sql.SqlImpl.execute(SqlImpl.java:325) at coldfusion.tagext.sql.QueryTag.executeQuery(QueryTag.java:831) at coldfusion.tagext.sql.QueryTag.doEndTag(QueryTag.java:521) at cfhetkoor2ecfm251397670.runPage(E:\westlandkoorconcordia.nl\wwwroot\h etkoor.cfm:1) at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:192) at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:366) at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65) ........... És így tovább hosszasan ......

Page 8: Syslog-NG (nem csak) fejlesztőknek

8/40

A jó logüzenet

● Tömör, de érthető.● Nem tartalmaz trace-jellegű adatot, hanem egy linket,

ahonnan a trace letölthető.● Tartalmaz minden lényeges információt, amiből

kideríthető, mi történt.● De ennél semmivel sem többet.● Például:

● User login gipszjakab from 127.0.0.1● Access denied to http://example.com/test user

gipszjakab from 127.0.0.1 by access rule 62

Page 9: Syslog-NG (nem csak) fejlesztőknek

9/40

Hibás megoldások

Hogyan ne logoljunk?

Page 10: Syslog-NG (nem csak) fejlesztőknek

10/40

Az alkalmazás fájlba ír● Jó, mert:

● Van logolás● Mivel az alkalmazás saját mappáiban van, (általában) gyorsan

elérhető.● Hibás, mert:

● Az alkalmazás törölni is tudja a logokat.● A log file-ok nem rotálódnak, egyre nő a méretük.● Egy idő múlva senki nem emlékszik, miért ilyenek a logfájlok.● Nincs bufferelés, az üzenetek szinkron írása terheli a

fájlrendszert.● Konkurencia problémák léphetnek fel.● Alkalmazás összeomláskor nem keletkezik log.

Page 11: Syslog-NG (nem csak) fejlesztőknek

11/40

Az alkalmazás STDERR-re ír

● Jó, mert:● Van logolás.● Szabványos interfaceket használ.

● Hibás, mert:● Nehezen kezelhető.● Első sorban csak konzolos szoftvereknél működik.● Csábító a 2>/dev/null használata.

Page 12: Syslog-NG (nem csak) fejlesztőknek

12/40

Az alkalmazás mailt, stb. küld

● Jó, mert:● A fejlesztő azonnal értesül a problémáról.

● Hibás, mert:● Egy szerencsétlenül elkövetett végtelen ciklus

beborítja a mailszervert.● Az alkalmazás elhalálozása (PHP fatal error) nem jut

el a fejlesztőig.● Üzemeltetésileg a lehető legrosszabb megoldás.

Page 13: Syslog-NG (nem csak) fejlesztőknek

13/40

Hogyan logoljunk?

Jó megoldások

Page 14: Syslog-NG (nem csak) fejlesztőknek

14/40

Követelmények

● Legyen aszinkron!● Tudjon bufferelni!● Legyen skálázható több szerveren keresztül!● Ne a logolás legyen a szűk keresztmetszet!● Legyen egyszerű használni!

Page 15: Syslog-NG (nem csak) fejlesztőknek

15/40

A Syslog protokoll

● Az 1980-as évek óta létezik.● Eredetileg a Sendmailhez találták ki.● Szabályozza a logüzenetek formátumát.● Szinte az összes rendszer eszközön keresztül működik.

(Hálózat, Unix socket, stb)● De facto szabvány a Unix világban.● Kiforrott és jól működő nyílt forrású eszközök vannak rá.

Page 16: Syslog-NG (nem csak) fejlesztőknek

16/40

Syslog nyelvi támogatás

● PHP: natív támogatás● Python: import syslog● Perl: Sys::Syslog● C/C++: #include <syslog.h>● Java: Syslog4j● Ruby: require 'syslog'● NodeJS: dgram

Page 17: Syslog-NG (nem csak) fejlesztőknek

17/40

Syslog szabályok fejlesztőknek

● SOHA ne használd a LOG_CONS opciót, kivéve ha a rendszergazda kifejezetten kérte. (Ez ugyanis a szerver konzolra ír.)

● Mindig a megbeszélt log facilityt és program nevet használd!

● Készítsd föl a programodat, hogy development, testing / stage illetve éles környezetben más log opciókkal, program névvel és facilityvel működhessen.

● Tegyél különbséget a log levelek között!

Page 18: Syslog-NG (nem csak) fejlesztőknek

18/40

A Syslog-NG

● Magyar termék. (A Balabit IT Security fejleszti.)● Robusztus és nagy teljesítményű.● Rendkívül jól dokumentált.● Nagyon flexibilis.

Page 19: Syslog-NG (nem csak) fejlesztőknek

19/40

A Syslog-NG config file

source s_log { unix-stream("/dev/log");};

filter f_kern { facility(kern);};

destination d_kern { file("/var/log/kern.log");};

log { source(s_log); filter(f_kern); destination(d_kern);};

Page 20: Syslog-NG (nem csak) fejlesztőknek

20/40

Log source

● A teljesség igénye nélkül:● Internal● TCP/UDP● Socket● File● Named pipe (FIFO)

● Itt adjuk meg a logüzenetek forrását.

Page 21: Syslog-NG (nem csak) fejlesztőknek

21/40

Filterek

● A teljesség igénye nélkül:● Logot küldő szerver● Logot fogadó szerver● Log level● Log priority● Log facility● Log tag● Üzenet tartalom

● Ezzel szűrhetjük meg az üzeneteket.

Page 22: Syslog-NG (nem csak) fejlesztőknek

22/40

Log destination

● Megint csak a teljesség igénye nélkül:● Program● SQLdb● Network (TCP/UDP)● File● Named pipe (FIFO)

● Itt adjuk meg a lehetséges log célpontokat.

Page 23: Syslog-NG (nem csak) fejlesztőknek

23/40

Log path

● Tartalmaz:● Egy vagy több log source-t.● Egy vagy több destinationt.● Tartalmazhat filtereket.● Tartalmazhat parsereket és rewriteokat. (Ezekről

mindjárt lesz szó.)● Ez vezérli a logüzenetek útját.

Page 24: Syslog-NG (nem csak) fejlesztőknek

24/40

Miért pont Syslog-NG?

Speciális lehetőségek, amiket a Syslog-NG kínál

Page 25: Syslog-NG (nem csak) fejlesztőknek

25/40

Buffering

● Megvéd az átmeneti szolgáltatás-kimaradás okozta logveszteségtől. (Pl. újraindítjuk a logszervert.)

● A bufferben tartott logsorok számát adhatjuk meg.● Például:

destination d_tcp {tcp("1.2.3.4"); log_fifo_size(2000);

};● A Premium változatban van disk buffering is. Ezt a

log_disk_fifo_size() opcióval állíthatjuk.

Page 26: Syslog-NG (nem csak) fejlesztőknek

26/40

Regexp matching

● Megadhatunk egy reguláris kifejezést, majd a match groupok eredményét felhasználhatjuk.

● Filterezés:filter f_log {

message("^([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)$" flags("store-matches"));

};

Page 27: Syslog-NG (nem csak) fejlesztőknek

27/40

Regexp match group felhasználás

● Az előbb kapott részeket felhasználjuk, itt egy SQL táblába tesszük be:

destination d_mysql {sql(

type(mysql)host("localhost") username("syslog”) password("valamirandom")database("mylog”)table("logs")columns("logfield1 VARCHAR(24)", "logfield2 VARCHAR(24)", "logfield3 VARCHAR(24)", "logfield4 VARCHAR(24)")indexes("logfield1","logfield2","logfield3","logfield4")

values("$1", "$2", "$3", "$4"));

}

Page 28: Syslog-NG (nem csak) fejlesztőknek

28/40

Logrotálás

● Templatek alapjáni logfájlok, logtáblák.● Igen, a Syslog NG meg tudja csinálni magának az SQL

táblákat.● Például:

destination d_mysql {…

table("log_${R_YEAR}_${R_MONTH}_${R_DAY}");…

};

Page 29: Syslog-NG (nem csak) fejlesztőknek

29/40

Message rewrite

● Kicserélhetjük a logüzenet bizonyos részeit.● Például:

rewrite r_myrewrite {subst("IP", "IP-Address", value("MESSAGE"));

};

log {...rewrite(r_myrewrite);...

};

Page 30: Syslog-NG (nem csak) fejlesztőknek

30/40

Parserek● Az üzeneteket egy megadott struktúra (pl CSV) szerint

szét lehet szabdalni megadott változó nevekre.● Például:

parser p_mydataparser {csv-parser(

columns("SERVER.IP", "SERVER.NAME"));

};destination d_file {

file("/var/log/log-${SERVER.NAME}");};

Page 31: Syslog-NG (nem csak) fejlesztőknek

31/40

Kreatív konfiguráció

Avagy a Tippek és Trükkök rész

Page 32: Syslog-NG (nem csak) fejlesztőknek

32/40

PHP loglevel változtatás● A PHP hibák súlyosságtól függetlenül notice szintű üzenetként

érkeznek. Ez kevéssé praktikus, ezért célszerű ezt megváltoztatni.

● A PHP üzenetet feldolgozzuk és újra beküldjük a Syslog-NG-nek:filter f_php_error { match("PHP Fatal error" value("MESSAGE")); };

destination d_php_error { program("/usr/bin/logger -p user.err -t php -u /var/run/php-log" template("$MSGONLY\n")); };

log { source(src); filter(f_php_error); destination(d_php_error); };

source s_php {unix-stream("/var/run/php-log");};

log { source(s_php); destination(d_syslogserver); };

Page 33: Syslog-NG (nem csak) fejlesztőknek

33/40

Syslog-NG failover

● A megoldás viszonylag egyszerű: az üzeneteket két hostra küldjük, majd szükség esetén összefésüljük:destination d_syslog1 { tcp("syslog1.int.example.com"); }destination d_syslog2 { tcp("syslog2.int.example.com"); }log {

source(s_all);destination(d_syslog1);destination(d_syslog2);

};● Az összefésüléshez célszerű a forrásnál az üzeneteket

egyedi azonosítóval ellátni.

Page 34: Syslog-NG (nem csak) fejlesztőknek

34/40

Log gyűjtés és aggregálás

● A feladat egyszerű: gyűjtsünk számszerű adatokat tartalmazó logokat és aggregáljuk őket.

● A megoldáshoz használjuk a már említett tab szeparált formátumot (az adatainkat tabulátorokkal szeparáljuk), majd töltsük be SQL-be.

● A táblaformátumot adjuk meg úgy, hogy óránként más legyen a tábla neve.

● Futtassunk le óránként egy SQL lekérdezést, ami egy másik táblába aggregálja a logokat. Például BASH-ben:LASTHOUR_PARAM=$(date -d'1 hour ago' '+%Y-%m-%d %H:00:00')LASTHOUR_TABLE=$(date -d'1 hour ago' '+%Y_%m_%d_%H')mysql stat -e "INSERT INTO stat_hourly

SELECT '${LASTHOUR_PARAM}' AS hour, COUNT(*) AS entries,SUM(field1) AS field1 FROM log_${LASTHOUR_TABLE}"

Page 35: Syslog-NG (nem csak) fejlesztőknek

35/40

Záró gondolatok

Avagy amit még hasznos tudni

Page 36: Syslog-NG (nem csak) fejlesztőknek

36/40

Syslog-NG használat

● Ha saját szerveren vagy virtuális gépen lakik a szolgáltatásotok, semmi akadálya a Syslog-NG használatának! Üljetek le a rendszergazdával, beszéljétek meg, mire van szükségetek!

● Ha osztott tárhelyen vagytok, viszonylag kicsi az esélye, hogy működik az ilyen jellegű logolás, de:

● A DotRoll 2011-es fejlesztési tervében van egy fejlesztési projekt, aminek a célja, hogy a felhasználónként különálló /dev/log keletkezzen, az ebben gyűlő adatok pedig egy webes felületen elérhetőek legyenek.

Page 37: Syslog-NG (nem csak) fejlesztőknek

37/40

Mit kapunk a pénzünkért?

● Ha a fizetős változatok valamelyike mellett döntünk, kapunk az ingyenes változaton felül:● Windows log agentet.● Titkosított, külső időpecséttel ellátott logstoret.● Lemezre való bufferelési lehetőséget.● Beépített HA támogatást.● Webes felületet.● És még sok más jó dolgot.

Page 38: Syslog-NG (nem csak) fejlesztőknek

38/40

További olvasmányok

● Balabit weboldal:http://www.balabit.com/

● Syslog-NG 3.1 Administrator Guidehttp://www.balabit.com/support/documentation/syslog-ng-ose-v3.1-guide-admin-en_0.pdf

● RFC-k:● RFC 3164 - The BSD syslog protocol● RFC 5424 - The Syslog Protocol● RFC 5425 - Transport Layer Security (TLS) Transport

Mapping for Syslog● RFC 5426 - Transmission of Syslog Messages over UDP

Page 39: Syslog-NG (nem csak) fejlesztőknek

39/40

Ti jöttök...

Kérdések?

Page 40: Syslog-NG (nem csak) fejlesztőknek

40/40

Jövő héten...

2010. december 7, keddKovács Ferenc (Tyrael)

Biztonságos webalkalmazások fejlesztése