A sok jail hátránya, hogy mindegyik egyenként termeli a logbejegyzéseket, így célszerű egy logszervert összedobni, amelynek feladata “mindössze” annyi, hogy aggregálja és osztályozza a beérkező bejegyzéseket.
A jail létrehozása
Hozzuk létre a naplók tárolásához szükséges fájlrendszert, majd klónozzuk a template fájlrendszert s csatoljuk fel a megfelelő helyre a ports adatbázist és a naplók fájlrendszerét:
$ zfs create dpool/jails/data
$ zfs create dpool/jails/data/logserver
$ zfs clone dpool/jails/v8.1.0/template@base dpool/jails/v8.1.0/logserver
$ zfs set compression=on dpool/jails/v8.1.0/logserver
$ zfs set compression=on dpool/jails/data/logserver
$ zfs set mountpoint=/dpool/jails/v8.1.0/logserver/data dpool/jails/data/logserver
$ zfs set mountpoint=/dpool/jails/v8.1.0/logserver/usr/ports dpool/jails/v8.1.0/ports
Majd módosítsuk a /etc/rc.conf állományt, a meglévő httpd helyére vegyük fel a logserver bejegyzést, hogy ez induljon el (az IP címet ellenőrizzük, s vegyük fel ha még nem létezik):
jail_list="logserver"
jail_logserver_rootdir="/dpool/jails/v8.1.0/logserver"
jail_logserver_hostname="logserver.jails.javaforum.hu"
jail_logserver_ip="192.168.2.1"
Célszerű rendes host-nevet adni minden egyes jail-nek, mivel ez később jól jöhet, s ha a szolgáltatásokat név alapján kötjük össze, később – ha nagyobbak leszünk – kényelmesebb lehet áttenni egy-egy szolgáltatást másik gépre is.
A syslog-ng telepítése és beállítása
A létrehozott és elindított új jail még nincs megfelelően beállítva a feladatához, a feltelepített syslog-ng csomagot a kliens módból át kell konfigurálnunk szerver módra. Lépjünk be, és módosítsuk a syslog-ng.conf állományt:
options { long_hostnames(off); sync(0); create_dirs(yes); };
source src { unix-dgram("/var/run/log" max-connections(20));
unix-dgram("/var/run/logpriv" perm(0600) max-connections(20));
internal();
tcp( ip("logserver.jails.javaforum.hu") port(1999) max_connections(200)); };
destination messages { file("/data/$SOURCEIP-$YEAR-$MONTH/messages.$YEAR-$MONTH-$DAY"); };
destination security { file("/data/$SOURCEIP-$YEAR-$MONTH/security.$YEAR-$MONTH-$DAY"); };
destination authlog { file("/data/$SOURCEIP-$YEAR-$MONTH/auth.$YEAR-$MONTH-$DAY"); };
destination maillog { file("/data/$SOURCEIP-$YEAR-$MONTH/mail.$YEAR-$MONTH-$DAY"); };
destination cron { file("/data/$SOURCEIP-$YEAR-$MONTH/cron.$YEAR-$MONTH-$DAY"); };
destination debuglog { file("/data/$SOURCEIP-$YEAR-$MONTH/debug.$YEAR-$MONTH-$DAY"); };
filter f_auth { facility(auth); };
filter f_authpriv { facility(authpriv); };
filter f_not_authpriv { not facility(authpriv); };
filter f_cron { facility(cron); };
filter f_daemon { facility(daemon); };
filter f_ftp { facility(ftp); };
filter f_kern { facility(kern); };
filter f_lpr { facility(lpr); };
filter f_mail { facility(mail); };
filter f_news { facility(news); };
filter f_security { facility(security); };
filter f_user { facility(user); };
filter f_uucp { facility(uucp); };
filter f_local0 { facility(local0); };
filter f_local1 { facility(local1); };
filter f_local2 { facility(local2); };
filter f_local3 { facility(local3); };
filter f_local4 { facility(local4); };
filter f_local5 { facility(local5); };
filter f_local6 { facility(local6); };
filter f_local7 { facility(local7); };
filter f_emerg { level(emerg); };
filter f_alert { level(alert..emerg); };
filter f_crit { level(crit..emerg); };
filter f_err { level(err..emerg); };
filter f_warning { level(warning..emerg); };
filter f_notice { level(notice..emerg); };
filter f_info { level(info..emerg); };
filter f_debug { level(debug..emerg); };
filter f_is_debug { level(debug); };
log { source(src); filter(f_notice); filter(f_not_authpriv); destination(messages); };
log { source(src); filter(f_kern); filter(f_debug); destination(messages); };
log { source(src); filter(f_lpr); filter(f_info); destination(messages); };
log { source(src); filter(f_mail); filter(f_crit); destination(messages); };
log { source(src); filter(f_news); filter(f_err); destination(messages); };
log { source(src); filter(f_security); destination(security); };
log { source(src); filter(f_auth); filter(f_info); destination(authlog); };
log { source(src); filter(f_authpriv); filter(f_info); destination(authlog); };
log { source(src); filter(f_mail); filter(f_info); destination(maillog); };
log { source(src); filter(f_cron); destination(cron); };
log { source(src); filter(f_is_debug); destination(debuglog); };
A lényeg annyi, hogy a syslog-ng a /data könyvtár alá fogja írni a bejegyzéseit, ahol létrehozza a forrásIP-év-hónap könyvtárakat, s szétválogatja a bele érkező naplókat a megadott paraméterek szerint, s bónuszként naponta új fájlt kezd. A fájl módosítása után lépjünk ki a jail-ből, és indítsuk újra:
$ /etc/rc.d/jail restart logserver
Stopping jails: logserver.jails.javaforum.hu.
Configuring jails:.
Starting jails: logserver.jails.javaforum.hu.
$ ls -l /dpool/jails/v8.1.0/logserver/data/
total 2
drwx------ 2 root wheel 6 Jan 17 16:33 127.0.0.1-2009-01
$ ls -l /dpool/jails/v8.1.0/logserver/data/127.0.0.1-2009-01/
total 4
-rw------- 1 root wheel 372 Jan 17 16:34 auth.2009-01-17
-rw------- 1 root wheel 92 Jan 17 16:33 cron.2009-01-17
-rw------- 1 root wheel 543 Jan 17 16:34 mail.2009-01-17
-rw------- 1 root wheel 1580 Jan 17 16:34 messages.2009-01-17
$ tail /dpool/jails/v8.1.0/logserver/data/127.0.0.1-2009-01/messages.2009-01-17
Jan 17 16:32:00 logserver net_server[61477]: 2009/01/17-16:32:00 MyPackage (type Net::Server::Fork) starting! pid(61477)
Jan 17 16:32:00 logserver net_server[61477]: Binding to TCP port 4949 on host *
Jan 17 16:32:00 logserver net_server[61477]: Setting gid to "0 0"
Jan 17 16:34:02 logserver net_server[61477]: 2009/01/17-16:34:02 Server closing!
Jan 17 16:34:02 logserver syslog-ng[61437]: syslog-ng shutting down; version='2.0.9'
Jan 17 16:34:04 logserver syslog-ng[61970]: syslog-ng starting up; version='2.0.9'
Jan 17 16:34:05 logserver net_server[62010]: Process Backgrounded
Jan 17 16:34:05 logserver net_server[62010]: 2009/01/17-16:34:05 MyPackage (type Net::Server::Fork) starting! pid(62010)
Jan 17 16:34:05 logserver net_server[62010]: Binding to TCP port 4949 on host *
Jan 17 16:34:05 logserver net_server[62010]: Setting gid to "0 0"
Láthatjuk, hogy a naplófájlok létrejöttek a megfelelő helyen, hiszen a syslog-ng szerint önmaga IP címe a 127.0.0.1 – a valóságban egy jail-ben nincs localhost vagy 127.0.0.1, de néhány program úgy csinál, mintha lenne .
A syslog-ng mint logszerver
A syslog-ng lényege, hogy atombiztosan tud logszerverként működni, és logokat aggregálni, s a távoli naplóbejegyzések fogadásához egyszerűen csak egy sor felel a konfigurációs állományában::
tcp( ip("logserver.jails.javaforum.hu") port(1999) max_connections(200));
E szerint a logserver.jails.javaforum.hu domén név alapján meghatározott IP cím 1999/tcp portján várja a távoli kliensek által küldött üzeneteket. A max_connection annyit határoz meg, hogy egy időben maximum 200 kliens kapcsolódhat a logszerverhez. Emlékezzünk, hogy a template jail úgy készült el, hogy a klónozott jail a logserver.jails.javaforum.hu felé küldi a logokat, tehát új jail létrehozásakor semmi dolgunk nem lesz, a logszerver fogadja majd az új jail által küldött naplóbejegyzéseket.
Utolsó simítások
Mivel a logszerver saját logjai egy külön fájlrendszerbe kerülnek, illetve a távoli kliensek által küldött bejegyzések is ebbe a külön fájlrendszerbe kerülnek, ezért érdemes megnézni, hogy mennyi helyet foglal el a logserver fájlrendszere, ugyanis erre be tudunk állítani egy kvótát. A munin éberen figyeli a jail által elfoglalt helyet és 90% felett küld majd egy értesítést (warning), illetve 95% felett egy újabbat (error). Mivel semmi sem indokolja, hogy a logserver fájlrendszer növekedjen, ezért a fájlrendszerben a szabad hely fogyása meghibásodást jelez.
A kvóta méretét úgy kell meghatároznunk, hogy a df a ZFS fájlrendszer látszólagos méretét ismeri, ahhoz képest kell egy olyan kvótát beállítani, hogy 90% alá essen az elfoglalt hely:
$ df -h /dpool/jails/v8.1.0/logserver/
Filesystem Size Used Avail Capacity Mounted on
dpool/jails/v8.1.0/logserver 3.7G 268M 3.4G 7% /dpool/jails/v8.1.0/logserver
[root@freebsd:/home/backups/log]$ zfs set quota=64M dpool/jails/v8.1.0/logserver
[root@freebsd:/home/backups/log]$ df -h /dpool/jails/v8.1.0/logserver/
Filesystem Size Used Avail Capacity Mounted on
dpool/jails/v8.1.0/logserver 315M 268M 47M 85% /dpool/jails/v8.1.0/logserver