Upload
janos-pasztor
View
1.498
Download
3
Embed Size (px)
Citation preview
1/40
Syslog-NG (nem csak) fejlesztőknek
Molnár István (Kayapo)Pásztor János (janoszen)
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.
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.
4/40
A logolásról általában
Avagy amit a témáról tudni érdemes
5/40
Miért logolunk?
● Működés monitorozása● Anomáliák felfedezése● Statisztikai adatgyűjtés
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 ...”
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 ......
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
9/40
Hibás megoldások
Hogyan ne logoljunk?
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.
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.
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.
13/40
Hogyan logoljunk?
Jó megoldások
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!
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á.
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
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!
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.
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);};
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.
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.
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.
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.
24/40
Miért pont Syslog-NG?
Speciális lehetőségek, amiket a Syslog-NG kínál
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.
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"));
};
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"));
}
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}");…
};
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);...
};
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}");};
31/40
Kreatív konfiguráció
Avagy a Tippek és Trükkök rész
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); };
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.
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}"
35/40
Záró gondolatok
Avagy amit még hasznos tudni
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.
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.
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
39/40
Ti jöttök...
Kérdések?
40/40
Jövő héten...
2010. december 7, keddKovács Ferenc (Tyrael)
Biztonságos webalkalmazások fejlesztése