SlideShare a Scribd company logo
1 of 40
Download to read offline
Syslog-NG (nem csak) fejlesztőknek




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




                                 1/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.




                                                              2/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.




                                                        3/40
A logolásról általában




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




                                     4/40
Miért logolunk?



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




                                                 5/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 ...”




                                                         6/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.nlwwwrooth
        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 ......

                                                                            7/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

                                                            8/40
Hogyan ne logoljunk?




Hibás megoldások




                          9/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.

                                                                    10/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.




                                                           11/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.




                                                          12/40
Hogyan logoljunk?




Jó megoldások




                       13/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!




                                                  14/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á.




                                                          15/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




                                                  16/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!




                                                         17/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.




                                                        18/40
A Syslog-NG config file
source s_log {                  destination d_kern {
     unix-stream("/dev/log");        file("/var/log/kern.log");
};                              };


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

                                                                  19/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.




                                              20/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.


                                            21/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.




                                                  22/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.




                                                           23/40
Miért pont Syslog-NG?




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




                                              24/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.



                                                         25/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"));
      };




                                                                              26/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")
          );
      }
                                                                           27/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}");
           …
      };

                                                     28/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);
           ...
      };
                                                          29/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}");
      };

                                                            30/40
Kreatív konfiguráció




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




                                  31/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("$MSGONLYn")); };
    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); };
                                                                           32/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.
                                                          33/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}"

                                                                  34/40
Záró gondolatok




Avagy amit még hasznos tudni




                               35/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.


                                                          36/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.


                                                              37/40
További olvasmányok
●   Balabit weboldal:
    http://www.balabit.com/
●   Syslog-NG 3.1 Administrator Guide
    http://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

                                                              38/40
Ti jöttök...




Kérdések?




                     39/40
Jövő héten...




        2010. december 7, kedd
         Kovács Ferenc (Tyrael)
Biztonságos webalkalmazások fejlesztése




                                          40/40

More Related Content

Similar to Syslog-NG (nem csak) fejlesztőknek

Webalkalmazások teljesítményoptimalizálása
Webalkalmazások teljesítményoptimalizálásaWebalkalmazások teljesítményoptimalizálása
Webalkalmazások teljesítményoptimalizálásaFerenc Kovács
 
A ClusterGrid rendszer - avagy hogyan üzemeltessünk, több mint 1000 csomópont...
A ClusterGrid rendszer - avagy hogyan üzemeltessünk, több mint 1000 csomópont...A ClusterGrid rendszer - avagy hogyan üzemeltessünk, több mint 1000 csomópont...
A ClusterGrid rendszer - avagy hogyan üzemeltessünk, több mint 1000 csomópont...Ferenc Szalai
 
Grid és adattárolás
Grid és adattárolásGrid és adattárolás
Grid és adattárolásFerenc Szalai
 
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?Open Academy
 
Netfilter elméleti alapok
Netfilter elméleti alapokNetfilter elméleti alapok
Netfilter elméleti alapokBenedek Rakovics
 
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezniAmit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezniFerenc Szalai
 
Linux Kernel - Bevezetes
Linux Kernel - BevezetesLinux Kernel - Bevezetes
Linux Kernel - BevezetesLevente Kurusa
 
Szerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelvenSzerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelvenKrisztián Gyula Tóth
 
Objektum-orinetált mérések a gyakorlatban
Objektum-orinetált mérések a gyakorlatbanObjektum-orinetált mérések a gyakorlatban
Objektum-orinetált mérések a gyakorlatbanAntal Orcsik
 
Windows Szerver kiadások.
Windows Szerver kiadások.Windows Szerver kiadások.
Windows Szerver kiadások.Attila Nagy
 
Devops meetup - Automatizált tesztek
Devops meetup - Automatizált tesztekDevops meetup - Automatizált tesztek
Devops meetup - Automatizált tesztekZsolt Takács
 
SUSE Linux Enterprise 11 admin 2
SUSE Linux Enterprise 11 admin 2SUSE Linux Enterprise 11 admin 2
SUSE Linux Enterprise 11 admin 2Kálmán Kéménczy
 
Cross Platform mobil app fejlesztés HTML5 JavaScript alapokon
Cross Platform mobil app fejlesztés HTML5 JavaScript alapokonCross Platform mobil app fejlesztés HTML5 JavaScript alapokon
Cross Platform mobil app fejlesztés HTML5 JavaScript alapokoneRise
 
Nyílt forráskód a Fővárosi Bíróságon
Nyílt forráskód a Fővárosi BíróságonNyílt forráskód a Fővárosi Bíróságon
Nyílt forráskód a Fővárosi BíróságonNorbert Laky
 

Similar to Syslog-NG (nem csak) fejlesztőknek (20)

Webalkalmazások teljesítményoptimalizálása
Webalkalmazások teljesítményoptimalizálásaWebalkalmazások teljesítményoptimalizálása
Webalkalmazások teljesítményoptimalizálása
 
A ClusterGrid rendszer - avagy hogyan üzemeltessünk, több mint 1000 csomópont...
A ClusterGrid rendszer - avagy hogyan üzemeltessünk, több mint 1000 csomópont...A ClusterGrid rendszer - avagy hogyan üzemeltessünk, több mint 1000 csomópont...
A ClusterGrid rendszer - avagy hogyan üzemeltessünk, több mint 1000 csomópont...
 
Iptables gyorstalpaló
Iptables gyorstalpalóIptables gyorstalpaló
Iptables gyorstalpaló
 
Magvas gondolatok
Magvas gondolatokMagvas gondolatok
Magvas gondolatok
 
Grid és adattárolás
Grid és adattárolásGrid és adattárolás
Grid és adattárolás
 
Diagram és barcode
Diagram és barcodeDiagram és barcode
Diagram és barcode
 
Linux alapok
Linux alapokLinux alapok
Linux alapok
 
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
 
Ci
CiCi
Ci
 
Netfilter elméleti alapok
Netfilter elméleti alapokNetfilter elméleti alapok
Netfilter elméleti alapok
 
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezniAmit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
 
Linux Kernel - Bevezetes
Linux Kernel - BevezetesLinux Kernel - Bevezetes
Linux Kernel - Bevezetes
 
Szerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelvenSzerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelven
 
Objektum-orinetált mérések a gyakorlatban
Objektum-orinetált mérések a gyakorlatbanObjektum-orinetált mérések a gyakorlatban
Objektum-orinetált mérések a gyakorlatban
 
Windows Szerver kiadások.
Windows Szerver kiadások.Windows Szerver kiadások.
Windows Szerver kiadások.
 
Devops meetup - Automatizált tesztek
Devops meetup - Automatizált tesztekDevops meetup - Automatizált tesztek
Devops meetup - Automatizált tesztek
 
SUSE Linux Enterprise 11 admin 2
SUSE Linux Enterprise 11 admin 2SUSE Linux Enterprise 11 admin 2
SUSE Linux Enterprise 11 admin 2
 
Webkonf 2013
Webkonf 2013Webkonf 2013
Webkonf 2013
 
Cross Platform mobil app fejlesztés HTML5 JavaScript alapokon
Cross Platform mobil app fejlesztés HTML5 JavaScript alapokonCross Platform mobil app fejlesztés HTML5 JavaScript alapokon
Cross Platform mobil app fejlesztés HTML5 JavaScript alapokon
 
Nyílt forráskód a Fővárosi Bíróságon
Nyílt forráskód a Fővárosi BíróságonNyílt forráskód a Fővárosi Bíróságon
Nyílt forráskód a Fővárosi Bíróságon
 

More from János Pásztor

A Virtualizáció esete a Puppettal
A Virtualizáció esete a PuppettalA Virtualizáció esete a Puppettal
A Virtualizáció esete a PuppettalJános Pásztor
 
Hogyan tervezzünk API-t? - Magyarországi Web Konferencia 2013
Hogyan tervezzünk API-t? - Magyarországi Web Konferencia 2013Hogyan tervezzünk API-t? - Magyarországi Web Konferencia 2013
Hogyan tervezzünk API-t? - Magyarországi Web Konferencia 2013János Pásztor
 
IPv6 tartalomszolgáltatóknak
IPv6 tartalomszolgáltatóknakIPv6 tartalomszolgáltatóknak
IPv6 tartalomszolgáltatóknakJános Pásztor
 
Az E-mail, a Hírlevél és a Spamszűrők
Az E-mail, a Hírlevél és a SpamszűrőkAz E-mail, a Hírlevél és a Spamszűrők
Az E-mail, a Hírlevél és a SpamszűrőkJános Pásztor
 
Nagy terhelésű webes rendszerek fejlesztése
Nagy terhelésű webes rendszerek fejlesztéseNagy terhelésű webes rendszerek fejlesztése
Nagy terhelésű webes rendszerek fejlesztéseJános Pásztor
 
Az SVN használata a csapatfejlesztésben
Az SVN használata a csapatfejlesztésbenAz SVN használata a csapatfejlesztésben
Az SVN használata a csapatfejlesztésbenJános Pásztor
 

More from János Pásztor (8)

How (not) to document
How (not) to documentHow (not) to document
How (not) to document
 
A Virtualizáció esete a Puppettal
A Virtualizáció esete a PuppettalA Virtualizáció esete a Puppettal
A Virtualizáció esete a Puppettal
 
Hogyan tervezzünk API-t? - Magyarországi Web Konferencia 2013
Hogyan tervezzünk API-t? - Magyarországi Web Konferencia 2013Hogyan tervezzünk API-t? - Magyarországi Web Konferencia 2013
Hogyan tervezzünk API-t? - Magyarországi Web Konferencia 2013
 
IPv6 tartalomszolgáltatóknak
IPv6 tartalomszolgáltatóknakIPv6 tartalomszolgáltatóknak
IPv6 tartalomszolgáltatóknak
 
Web applications
Web applicationsWeb applications
Web applications
 
Az E-mail, a Hírlevél és a Spamszűrők
Az E-mail, a Hírlevél és a SpamszűrőkAz E-mail, a Hírlevél és a Spamszűrők
Az E-mail, a Hírlevél és a Spamszűrők
 
Nagy terhelésű webes rendszerek fejlesztése
Nagy terhelésű webes rendszerek fejlesztéseNagy terhelésű webes rendszerek fejlesztése
Nagy terhelésű webes rendszerek fejlesztése
 
Az SVN használata a csapatfejlesztésben
Az SVN használata a csapatfejlesztésbenAz SVN használata a csapatfejlesztésben
Az SVN használata a csapatfejlesztésben
 

Syslog-NG (nem csak) fejlesztőknek

  • 1. Syslog-NG (nem csak) fejlesztőknek Molnár István (Kayapo) Pásztor János (janoszen) 1/40
  • 2. 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. 2/40
  • 3. 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. 3/40
  • 4. A logolásról általában Avagy amit a témáról tudni érdemes 4/40
  • 5. Miért logolunk? ● Működés monitorozása ● Anomáliák felfedezése ● Statisztikai adatgyűjtés 5/40
  • 6. 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 ...” 6/40
  • 7. 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.nlwwwrooth 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 ...... 7/40
  • 8. 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 8/40
  • 9. Hogyan ne logoljunk? Hibás megoldások 9/40
  • 10. 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. 10/40
  • 11. 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. 11/40
  • 12. 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. 12/40
  • 14. 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! 14/40
  • 15. 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á. 15/40
  • 16. 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 16/40
  • 17. 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! 17/40
  • 18. 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. 18/40
  • 19. A Syslog-NG config file source s_log { destination d_kern { unix-stream("/dev/log"); file("/var/log/kern.log"); }; }; filter f_kern { log { facility(kern); source(s_log); }; filter(f_kern); destination(d_kern); }; 19/40
  • 20. 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. 20/40
  • 21. 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. 21/40
  • 22. 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. 22/40
  • 23. 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. 23/40
  • 24. Miért pont Syslog-NG? Speciális lehetőségek, amiket a Syslog-NG kínál 24/40
  • 25. 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. 25/40
  • 26. 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")); }; 26/40
  • 27. 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") ); } 27/40
  • 28. 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}"); … }; 28/40
  • 29. 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); ... }; 29/40
  • 30. 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}"); }; 30/40
  • 31. Kreatív konfiguráció Avagy a Tippek és Trükkök rész 31/40
  • 32. 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("$MSGONLYn")); }; 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); }; 32/40
  • 33. 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. 33/40
  • 34. 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}" 34/40
  • 35. Záró gondolatok Avagy amit még hasznos tudni 35/40
  • 36. 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. 36/40
  • 37. 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. 37/40
  • 38. További olvasmányok ● Balabit weboldal: http://www.balabit.com/ ● Syslog-NG 3.1 Administrator Guide http://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 38/40
  • 40. Jövő héten... 2010. december 7, kedd Kovács Ferenc (Tyrael) Biztonságos webalkalmazások fejlesztése 40/40