OpenBSD pf logok feldogozása Syslog-ng 3.0-val

Az OpenBSD csomagszűrője bináris logformátumot (tcpdump link-type PFLOG ) használ, de legtöbbször szükség van a logüzenetek syslog formátumban történő tárolására és/vagy továbbküldésére (valós időben akár) egy központi logszervernek/logfeldolgozónak.

Az alábbiakban egy lehetséges megoldást prezentálok, nem mellesleg kipróbálom a 3.0-ás syslog-ng parser és rewrite opcióit is.

Az OpenBSD-ben jelenleg csomagban/ports fában 2.1-es syslog-ng van, úgyhogy a 3.0-át kézzel fordítottam. A hogyanra most nem térek ki.

Egy pf log üzenet pl. így néz ki:


# tcpdump -eni pflog0
tcpdump: listening on pflog0, link-type PFLOG
10:49:50.153511 rule 2/(match) pass in on re0: 10.0.0.1 > 10.0.0.2: icmp: echo request

Ezzel a sorral syslog szempontból több probléma van. Pl nincs benne a hosztnév ($HOST), ki küldte az üzenetet($PROGRAM), ill. nem jó az időpecsét ($ISODATE).

Ezt kell valahogy bejuttatni a syslog-ng-nek és feldolgoztatni vele.

A syslog-ng konfig(csak a vonatkozó részek):


source s_pflog {
pipe("/var/log/pflog.pipe" flags(no-parse));
};
parser p_pflog {
csv-parser(columns("PFLOG.TS","PFLOG.MSG") delimiters(" ") flags(escape-none,greedy) template("${MSG}"));
};
rewrite r_set_macro_program {
set("pflog:",value(PROGRAM));
};
template t_pflog {
template("$ISODATE $HOST $PROGRAM ${PFLOG.MSG}\n");
template-escape(no);
};
destination d_pflog {
file("/var/log/pflog.log" template(t_pflog));
};
log {
source(s_pflog);
rewrite(r_set_macro_program);
parser(p_pflog);
destination(d_pflog);
};

Tehát a /var/log/pflog.pipe-on keresztül várjuk a logsorokat, majd a parser -el leválasztjuk róla a timestamp-et, gyakorlatilag az első space karakterig vágunk, a greedy opció pedig azért kell mert változó a mezők száma. A $PFLOG.TS makrót később nem használjuk fel, nekünk gyakorlatilag csak a maradék kell. (Igen tudom, hogy a tcpdump-nak is meg lehet adni, hogy ne legyen timestamp, de akkor nem tudtam volna kipróbálni a parsert.) Ezután beállítjuk a $PROGRAM makró értékét "pflog:" -ra , a template-ben összerakjuk a logsort újra és már csak ki kell írnunk a /var/log/pflog.log file-ba, vagy el is küldhetjük egy távoli loghost-nak.

Ahhoz, hogy a tcpdump elinduljon bootoláskor és beletegye a pipe-ba az üzeneteket a következőt kell hozzáadni a /etc/hostname.pflog0 file-hoz.


!tcpdump -leni >/var/log/pflog.pipe &

És akkor a végén a syslog-ban letárolt logsor így néz ki:

2009-08-18T10:49:50+02:00 openbsd pflog: rule 2/(match) pass in on re0: 10.0.0.1 > 10.0.0.2: icmp: echo request

A legvégére pedig az egysoros megoldás :)


tcpdump -lteni pflog0 | logger -t pflog

Jó szórakozást!

Üdv
Godot

Hozzászólások

Kis segítség a syslog-ng fordításhoz:

OPENSSL_CFLAGS="-I/usr/include/openssl" OPENSSL_LIBS="-L/usr/lib -lcrypto -lssl" ./configure --enable-dynamic-linking --disable-glibtest

szép. a code tag nincs vhol lezárva rendesen?

Aha, a kolléga ügyelet helyett gyártja a referenciákat a jövendő CV-jéhez, közben meg anyázik, ha bejövő munka "megzavarja". :))

--
Wir sind erfaßt, sind infiziert,
Jedes Gespräch wird kontrolliert.