##################################################### # logmail quickdox ##################################################### $Revision: 1.1 $ by Steffen Dettmer (steffen@dett.de) You may use this stuff under the terms of the Gnu Public License English: The english part is a very short version of the following german doc. Logmail helps you to watch system's logfile. It's developed for Linux (RedHat and SuSE), you may modify things for other systems. Logmails scans (via cron) the syslog-files. You should do this at least once an hour. The logfiles used by syslog (and logmail) should end with ".new". Logmail scans them against the configuration /etc/logmail.conf. Then logmail appends the (complete) content to the same filename without ".new", i.e. /var/log/messages.new --> /var/log/messages. At least under linux you don't need a killall -HUP syslogd. For testing you should run logmail in debug mode. The output comes in a file, no mail in sent. To start in debugmode, specify one or more -D to the commandline. In logmail.conf you have to specify the logfilenames in the "files:" clause from now, not longer in logmail.pl itself! Don't append the extension ".new", this is done automatically. One and only one "files:" clause have to be in the configuration file. For each mail target logmail scans all files. A mailtarget starts with the token "to:". In logmail.conf there are positive and negativ rules. A positive rule must match a line to keep it for the mail, negatives rules removes lines from mail. You need at least one positive and one negative rule for each target. Positive rules are processed first. Useful is "all", specified ad "+.*" (positive rule: match any char, multiple times, man perlre) See the example file at the end of this document. -------------------------------------------------------------- Deutsch: LogMail dient dazu, in regelmaessigen Abstanden die Logfiles zu analysieren, um wichtige Informationen wie Zugriffsverletzungen per eMail zu versenden. Es wird vorrausgesetzt, das die Logfiles die Endung .new haben. Nach dem Filtern werden diese .new Files an die mit demselben Namen angehaengt, und das File /dev/null auf das .new File kopiert. Das .new File ist damit "geloescht", es ist aber nicht erforderlich, ein "killall -HUP syslogd" durchzufuehren, da durch den "copy-trick" die Dateinummer gleich bleibt. Die "langen" Syslogfiles (also die ohne .new) koennen dann z.B. mit logrotate archiviert/ueberprueft werden. Zum Testen kann das Script im Debug-Modus gefahren werden: es wird keine Mail versendet, die Ausgaben kommen in eine Datei. Um so hoeher der Debuglevel ist, um so mehr Verlaufsinformationen erscheinen auf STDOUT. In der hoechsten Stufe wird die Ueberpruefung jeder einzelnen Regel und deren Ergebnis fuer jede Logfilezeile angezeigt (nicht empfohlen ;) ). Um im Debugmodus zu starten, gibt man dem Script ein oder mehrere -D Parameter mit. logmail ist ein Perl 5 Script. Einige der dortigen globalen Konstanten dienen der Konfiguration: $CONF = "NAME_DER_KONFIGURATIONSDATEI" $OUT = "NAME_DER_DATEI_DIE_DEBUG_OUTPUT_BEKOMMT" Die Files werden ab jetzt (Revision 1.3) im Configfile spezifiziert (z.B.: "files: LOGFILE1 LOGFILE2"). Logmail geht dann fuer jedes "eMail-Ziel" alle diese Files durch, wendet die Filterregeln an, und sendet gegebenenfalls eine Mail. Es ist zu beachten, das nicht ein File mit einem Namen aus $LOGS gesucht wird, sondern vorher ".new" angehaengt wird. Hier z.B. sucht LogMail nach: LOGFILE1.new LOGFILE2.new ... Das File wird Zeilenweise bearbeitet. Passt keine Positiv-Regel, so wird die Zeile verworfen (und landet nie in der Mail). Passt eine, so werden die Negativen Regeln probiert. Passt eine Negative-Regel, so wird die Zeile verworfen, Passt keine, so landet sie in der Mail. Format der Konfigdatei: Im gesammten Configfile gibt es genau eine "files:" Klausel, die die Namen der zu prüfenden Logfiles enthält. Diesen Files wird dann ein ".new" angehängt. genau ein Mailziel, dazu (fast) beliebig viele Positive Regeln, letztens Negative, beliebig viele. Es muss aber immer mindestens eine Positive und mindestens eine Negative Regel definiert werden (und wenns "^$", die Leerzeile ist). Es muessen (je Mailziel) erst alle Positiven, und dann alle Negativen Regeln kommen. Kommentarzeilen beginnen mit "#" und werden ueberlesen, Leerzeilen natuerlich auch. Das Mailziel ist das Schluesselwort (clause) "to:" gefolgt von einer eMail-Addresse. Eine Positive Regel beginnt mit dem Token "+", eine Negative mit "-". Diese muessen am Anfang der Zeile stehen. Nach "+" und "-" folgt dann ein Regulaerer Ausdruck (man perlre). Beispiel: Chef soll alle gaaanz wichtigen Meldungen kriegen, Postman alles wichtige ueber Mails, und WebAdmin alles wichtige vom Webserver. Zu den Regel: fuer Chef machen wir Postives Match auf "denied", "fatal", "emerg" und "panic", wir brauchen keine Skip-Regel, da nichts ausgelassen wird (keine Negative Regel). fuer Postman machen wir positives Match auf "mail". Da dann auch kommt, wer wann gesentet hat, wird das ausgelassen. Webadmin ist aehnlich. ----------------------------------------------------------------------- Example / Beispiel: ----------config-file--------------- files: /var/log/messages /var/log/secure /var/log/httpd to: chef@domain +denied +fatal +emerg +panic #No negative rule, but we need one, so we say: all empty lines # ("-xxxxxxxxx" wouldn't match never too, it would be the same) #Leerzeilen gibts im Logfile nie, nur wegen der Syntax, man kann auch #"-xxxxxxxx" schreiben oder so ;) -^$ to: postman@domain +mail -sendmail\[\d+\]: .* stat=Sent -sendmail\[\d+\]: .* relay= to: webadmin@www.domain +http(s)?d #happends often, but it's no error, so ignore #Kommt oft und ist kein Fehler, um den man sich kuemmern muss (ignorieren): -^\[.*\] send body lost connection to client #not our problem --> ignore #Erst recht nicht unser Problem... -^\[.*\] \[error\] File does not exist: #root get's all interessting #postive: all, but some exceptions (negative rules) #in praxis the negative list gets longer by the time ;) #Root kriegt alles, was von Intresse sein koennte, um z.B. auch #die Regeln zu ueberwachen #d.h. Pos: Alles, Neg: genau spezifiziert, ergibt sich im Laufe der zeit, #Wenn man die Mails kriegt, und die Regeln staenig erweitert, bis fast nichts #mehr kommt. +.* -PAM_pwdb\[\d+\]: \(login\) session opened for user \w+ by \(uid=0\) -PAM_pwdb\[\d+\]: \(su\) session (opened|closed) for user (nobody|news) -PAM_pwdb\[\d+\]: \w+ LOGIN ON tty -identd\[\d+\]: Successful lookup: -identd\[\d+\]: from: \d+\.\d+\.\d+\.\d+ ( .* ) for: \d+, (21|25|80) -identd\[\d+\]: from: 1\.2\.(3\.5|3\.6|3\.7|3\.8) \( (hosta|hostb)(\.domain\.de)? \) for: -sshd\[\d+\]: log: Closing connection to -sshd\[\d+\]: fatal: Connection closed by remote host. -sshd\[\d+\]: log: Connection from -sshd\[\d+\]: log: Password authentication for .*accepted -sshd\[\d+\]: log: Generating new 768 bit RSA key -sshd\[\d+\]: log: RSA key generation complete -sshd\[\d+\]: log: RSA authentication for root accepted. -last message repeated \d+ times -lingering close lost connection to client -kernel: (VFS|end_request): .* (dev|device) 02:00(, .*)? -kernel: Socket destroy delayed -ftpd\[\d+\]: -named\[\d+\]:( done| finished)? (dumping nameserver) (stats|data) -named\[\d+\]: Lame server on -sendmail\[\d+\]: .* stat=Sent -sendmail\[\d+\]: .* relay= -in\.(ftpd|identd)\[\d+\]: connect from .* # and so on........... # und so weiter............. -----------end file--------------------