Fra.nkSteidl.de

MySQL Logging

syslog und firewall in MySQL loggen und Webfrontend

Inhalt:

Datenbank erstellen
MySQL-User erstellen und Berechtigungen setzen
syslog durch msyslog ersetzen
Firewall in MySQL loggen
Webfrontend
Download


Bemerkungen

Wieder eine Quick-and-Dirty Anleitung...
Alle meine Maschinen loggen ihr syslog in eine zentrale Datenbank. Diese Anleitung gibt ziemlich viel vor, meine Datenbank heißt logger und die Tabellen heissen syslogTB und firewall. Mit etwas MySQL-Wissen können diese Benennungen natürlich verändert werden. Diese Anleitung geht nicht auf Fehler ein, die auftreten können, sondern soll nur ein Leitfaden sein.

Die verwendeten Programme:
  • MySQL (als Datenbank)
  • msyslog (um syslog in eine Datenbank zu schreiben)
  • iptables (als Linux-Firewall)
  • fwbuilder (als Firewall-GUI. Es werden die Bemerkungen der einzelnen Regeln aus dem fwbuilder-Script gelesen)
  • logwatcher2.pl (Dieses Script gibt es auf der fwbuilder-Seite zum Herunterladen. Ich habe es erweitert, um in eine Datenbank loggen zu können
  • Perl (meine Programmiersprache ;-)




Datenbank erstellen:

echo "create database logger;" | mysql -u root -p -h localhost
Tabelle für syslog anlegen:
mysql -u root -p localhost logger

CREATE TABLE `syslogTB` (
  `facility` varchar(10) default NULL,
  `priority` varchar(10) default NULL,
  `date` date default NULL,
  `time` time default NULL,
  `host` varchar(128) default NULL,
  `message` text,
  `seq` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`seq`)
) TYPE=MyISAM; 


MySQL-User erstellen und Berechtigungen setzen:

Am Besten mit MySQL Administrator einen User sqluser@localhost erstellen, und dem nur auf die Datenbank logger INSERT-Rechte geben.



syslog durch msyslog ersetzen

msyslog ist kein debian-Paket und ersetzt den von Debian installierten syslogd ! Es kann passieren, daß ein Automatismus im Debian unseren msyslog mit einem neuen Debian-syslog überschreibt... werden wir sehen...

Wir wollen in eine MySQL-Datenbank loggen, also brauchen wir die libraries des mysql-client:
apt-get install libmysqlclient-dev
msyslog in der aktuellen version herunterladen und in /usr/src auspacken und compilieren. (./configure && make && make install )
 **********************************************************
 **       A new syslog daemon was installed !!           **
 **   Please read the INSTALL and README files           **
 **   to get your syslog configuration ready             **
 **********************************************************
Das ist wichtig !

Der neue syslogd ist im Verzeichnis /usr/local/sbin, der originale syslogd im Verzeichnis /sbin/. Damit beim Systemstart auch der neue gestartet wird, muß die Startdatei /etc/init.d/sysklogd verändert werden:

### binpath=/sbin/syslogd
binpath=/usr/local/sbin/syslogd

### SYSLOGD=""
SYSLOGD="-i linux -i unix"
Der Rest der Datei passt, somit kann man das auch schnell wieder rückgängig machen.

Wenn man zusätzlich noch auf UDP 514 hören möchte, um andere Syslog-Meldungen anzunehmen, muß zusätzlich der Parameter -i udp angegeben werden.

Danach den alten syslog beenden:
killall -TERM syslogd
und mit ps -ef | grep syslog prüfen Jetzt kann der neue gestartet werden:
/etc/init.d/sysklogd start
und mit ps -ef | grep syslog prüfen

Falls ein ssh-Tunnel zum Datenbank-Rechner aufgebaut werden soll, durch den das MySQL getunnelt wird, muss in die Startdatei unterhalb von

case "$1" in
start)

noch folgendes rein:
ssh -L 3306:localhost:3306  -i /root/.ssh/id_rsa -N &
aus ssh und automatische Logins mit Keys wird hier nicht eingegangen. -N öffnet keine shell, sondern macht nur die Portforwardings

Folgende Zeile für sql-Logging in die Datei /etc/syslog.conf eintragen:
*.*   %mysql -s 127.0.0.1 -u sqluser -p password     \
                                     -d logger       \
                                     -t syslogTB     \
                                     -F -P
(hier MÜSSEN Tabs rein, keine Leerzeichen)

ACHTUNG: Hier steht das Passwort des Datenbank Users im Klartext drin! Deswegen darf der User auch nur Einfügen in die Datenbank. Sonst nix. Und auch nicht von woanders.

In der Logdatei /var/log/mysql.log werden alle Datenbankzugriffe mitgeschrieben. Hier kann man sehen, ob syslog schon auf die Datenbank zugreift. Syslog-Einträge generieren kann man mit logger:
logger -p  test bla bla


Firewall in MySQL loggen

erstmal ausm normalen syslog raus. /etc/syslog.conf anpassen:
# put all into database

kern.debug        -/var/log/kern.log
*.*;kern.!=debug  %mysql -s 127.0.0.1 -u sqluser -p password -d logger    \
                                                    -t syslogTB -F -P
Im fwbuilder muß noch im Objekt der Firewall, Reiter Firewall der LogLevel auf 7: debug gesetzt werden.

Dann landen alle Logeinträge in der Datei /var/log/kern.log

Diese Datei lesen wir ein und fieseln uns die wichtigen Informationen raus. Das macht das Script logwatcher2.pl, welches man bei fwbuilder.org bekommt. Die erweiterte Version mit Datanbank Logging bekommt man bei https://fra.nksteidl.de/download/

Im fwbuilder habe ich mir inzwischen abgewöhnt, Regel-Nummern zu benutzen. Jedesmal, wenn ich eine Regel hinzufüge oder rausnehme, stimmen diese nicht mehr. In meiner Datenbank gibt es inzwischen 3 verschiedene Cleanup-Regeln und 3 verschiedene Stealth-Regeln. Natürlich dumm, wenn man über einen größeren Zeitraum danach suchen möchte.

Mein Log-Prefix im fwbuilder sieht jetzt überall so aus:
RULE name-der-regel - %A 
Wichtig ist hier das Leerzeichen hinter %A. Der name-der-regel taucht im Feld rule der Datenbank auf, danach kann jetzt gesucht werden. Es dürfen auch mehrere Regeln den selben Namen haben. Das Wort RULE muss noch drin bleiben, damit filtert das Script logwatcher2.pl die Firewall-Einträge aus der Logdatei.

Datenbank anlegen:

mysql -u root -p logger < logwatcher2.sql
logwatcher2.pl anpassen und starten:
logwatcher2.pl --database
Der Prozess muss immer im Hintergrund laufen.

Mit tail -f /var/log/mysql.log kann beobachtet werden, ob packete in die Datenbank geschrieben werden.



Webfrontend

Für das Webforntend legen wir einen neuen User an, der nur von localhost lesend (SELECT) auf die Datenbank zugreifen darf. Auch sein Passwort wird im Klartext im Script gespeichert.

Die beiden Scripte firewall.cgi und syslog.cgi müssen irgendwo ins DocumentRoot des Apache kopiert werden.
Die Anpassung der Scripte erfolt in den ersten Zeilen. Die Darstellung ist leider fest codiert, bei Anpassungsfragen, könnt Ihr mir gerne eine Nachricht zukommen lassen.



Download

Durch Klicken auf die Links wird ein neues Browserfenster mit dem Source-Code geöffnet

firewall.cgi
logwatcher2.pl
logwatcher2.sql
syslog.cgi

© by Frank Steidl • eMail: Fr @nkSteidl.de • Homepage: Fra .nkSteidl.de