Spätestens seit Kernel 2.4 sind Linux-Firewalls [1] mindestens gleichwertig zu kommerziellen Produkten. Sie loggen vergleichbar ausführlich und exakt, oft sogar besser. Nur ist der einfache Syslog mit dieser Aufgabe schnell überfordert und manuell die »/var/log/messages« durchsuchen verschwendet Zeit (siehe den Artikel zur Log-Auswertung in diesem Heft). Netfilter-Projektleiter Harald Welte hat mit seinem Ulogd [2] daher einen leistungsfähigen und flexiblen, datenbankgestützten Syslog-Ersatz geschaffen, mit dem Linux auch beim Logging zur Spitzengruppe aufschließt.
Neues IPtables-Target
Statt Meldungen an das »LOG«-Target zu senden (Syslog) setzt der Admin in seinen »iptables«-Aufrufen »-j ULOG« ein. Der Kernel sendet die Logs dann über Netlink-Multicast-Sockets an das Userspace-Gegenstück namens Ulogd. Dieser flotte Daemon schreibt die Einträge zum Beispiel in Syslog-ähnliche Protokolldateien oder in eine Datenbank. Letzteres ist vor allem bei größeren Log-Mengen zu empfehlen. Außerdem ist das ULOG-Target mit Parametern einstellbar, um das Datenvolumen an die Leistung der Hardware anzupassen. Die Anleitung in [3] beschreibt diese Parameter.
Doch das Gespann funktioniert nur, wenn im Kernel der »ULOG target support« aktiviert ist. Die Option heißt in der Konfigurationsdatei »IP_NF_TARGET_ULOG«, in der grafischen »make xconfig«-Konfiguration versteckt sie sich recht gut im IPtables-Support (Abbildung 1). Zudem ist der Userspace-Daemon Ulogd [2] nötig. Er lässt sich schnell installieren:
./configure --with-mysql=/usr/lib/mysql
make
make install
Treten Probleme beim Übersetzen auf, fehlt meist das MySQL-Devel-Paket (also Header und Bibliotheken).
Nach der Installation liegt die Konfigurationsdatei in »/usr/local/etc/ulogd.conf« (Listing 1). Die meisten Einstellungen sind sinnvoll vorbelegt. Wichtig ist, die Plugins für die gewünschten Speichermethoden zu aktivieren. Das Beispiel schreibt Syslog-ähnliche Protokolldateien (»LOGEMU«, Zeile 2), Datenbankeinträge (»MYSQL«, Zeile 3) und Traceroute-ähnliche Dumps (»PCAP«, Zeile 4).
Jedes Plugin erhält eine eigene Konfigurationssektion. Während »[LOGEMU]« und »[PCAP]« nur einen Dateinamen brauchen sowie die Angabe, ob jeder Eintrag ohne Zwischenspeichern auf der Platte landen soll (»sync=1«), verlangt der Datenbank-Connect mehr Informationen (Zeilen 10 bis 15).
Für den ersten Start mit »/usr/local/sbin/ulogd -c /usr/local/etc/ulogd.conf« empfiehlt es sich, das MySQL-Plugin (Zeile 3) auszukommentieren, da Ulogd schnell mit einem Speicherzugriffsfehler abstürzt, wenn die MySQL-Konfiguration nicht passt. Folgender IPtables-Eintrag sendet erste Daten an Ulogd:
iptables --dst www.linux-magazin.de -A OUTPUT -j ULOG
Als Test genügt ein Ping-Aufruf: »ping -c3 www.linux-magazin.de«. Im Log sollten unverzüglich die ersten Einträge landen. Listing 2 zeigt, wie das beim Syslog-Emulationsmodus von Ulogd aussieht: Die Einträge in »/var/log/ulogd.syslogemu« protokollieren mit Datum, Uhrzeit und Hostnamen alle erforderlichen Infos. Zu sehen ist dort, dass der Host mit der IP-Adresse 10.1.1.2 das Ziel 62.245.157.216 über das Interface »wlan0« mittels ICMP-Typ 8 erreicht hat. Eleganter als diese Syslog-Nachahmung ist es allerdings, die Meldungen in einer MySQL-Datenbank zu protokollieren.
Integration mit MySQL
Um die Ulogd-Einträge aufzunehmen, braucht der MySQL-Server eine separate Datenbank und einen separaten User. Die Datenbank heißt laut Zeile 14 von Listing 1 »ulogd« und der User »ulog« (Zeile 13), das Passwort lautet »geheim« (Zeile 12). Die erforderlichen Tabellen erzeugt ein Skript, das dem Ulog-Analysetool Nulog [4] beiliegt. Es erzeugt nebenbei ein paar zusätzliche Tabellen und Indizes, um performanter zu arbeiten.
Abbildung 1: Im Kernel (hier 2.6.13) muss das ULOG-Target aktiviert sein. Die Option versteckt sich unter »Networking | Network Options | Network packet filtering | IP: Netfilter Configuration | IP tables support | ULOG target support«.