FAM – File Alteration Monitoring

Wenn man (sofort) wissen möchte welche Dateien sich auf einem System verändern (z.B. als eine Art Intrusion Detection oder zum Debugging oder aus reiner Neugierde oder zur Replikation von Dateien) kann man „fam“ und dessen client „fileschanged“ ganz gut brauchen.

 

HP: http://oss.sgi.com/projects/fam/ und http://sourceforge.net/project/showfiles.php?group_id=63377

Derzeit aktuell ist 2.7.0 für fam und 0.6.5 für fileschanged

Per Paketmanager (SuSe: yast) braucht man die Pakete „fam“ und „fam-server“.
Bei FreeBSD liegt es unter /usr/ports/devel/fam und /usr/ports/sysutils/fileschanged in den Ports.

 

Wenn man es (lieber) händisch installieren möchte:
Als Dependencies sollten automake, autoconf und m4 für fam und help2man für fileschanged (oder man macht beim configure ein beherztes „–disable-man“, dann braucht mans nicht) vorhanden sein.

/usr/local/src # wget ftp://oss.sgi.com/projects/fam/download/fam-latest.tar.gz
/usr/local/src # wget http://switch.dl.sourceforge.net/sourceforge/fileschanged/fileschanged-0.6.5.tar.gz
/usr/local/src # gunzip fam-latest.tar.gz && tar xf fam-latest.tar
/usr/local/src # gunzip fileschanged-0.6.5.tar.gz && tar xf fileschanged-0.6.5.tar
/usr/local/src/fam-2.7.0 # ./configure && make install
/usr/local/src/fam-2.7.0 # cd ../fileschanged-0.6.5
/usr/local/src/fileschanged-0.6.5 # ./configure && make && make check && make install

Achtung: unter FreeBSD braucht man für fam unbedingt noch den mntent patch! Zu bekommen unter:
ftp://oss.sgi.com/projects/fam/download/patches/freebsd-mntent.patch

 

Konfig:
Die fam.conf ist entweder unter /etc (beim SuSe-Package) oder /usr/local/etc zu finden. Die Defaults sind aber meist völlig ausreichend. Sodas man da nicht unbedingt dran schrauben muss.

In /etc/rpc sollte bereits eine Zeile mit „sgi_fam“ drin setehen. Wenn nicht, folgendes nachtragen:

sgi_fam 391002 fam

 

Starten:
# famd -t 4 -T 0 -L
oder
#fam -t 4 -T 0 -L

Der (RPC-)Portmapper muss ebenfalls laufen. Verifizierbar mit:
# rpcinfo -p | grep fam

 

Monitoring:
Die Ausgabe von fileschanged erfolgt leider nur nach Standard-Out!
1. Möglichkeit, fileschanged als script:
$ vi file_mon

#!/usr/bin/fileschanged -l
~/mbox
/var/spool/mail
/tmp/

$ chmod +x file_mon
$ ./file_mon

2. Möglichkeit, fileschanged im xterm:
$ fileschanged -a -r -f ~/ /var/spool/mail /etc/

3. Möglichkeit, fileschanged in Syslog:
Endweder man nutzt logger („a shell command interface to the syslog system log module“) vom syslog:
# fileschanged -a r -f /bin/ /sbin/ /usr/bin/ /usr/sbin/ /usr/local/bin/ /usr/local/sbin/ /etc/ /usr/local/etc/ /var/spool/ | /bin/logger -t fileschanged &

Oder aber mittels Perl und das „Sys::Syslog“ Modul.
Im syslog muss dann aber noch localhost für udp einkonfiguriert sein.
Bei Syslog-NG:

udp(ip(„127.0.0.1“) port(514));

Im „source src“ scope.

Passendes Perlscript:
# vi /usr/local/sbin/syslog_fileschanged.pl

#!/usr/bin/env perl
use strict;
use Sys::Syslog qw(:DEFAULT setlogsock);
setlogsock('udp');
openlog("fileschanged", "ndelay,pid", "local1");
while (<STDIN>) {
syslog("info", $_);
}
closelog();


# chmod +x /usr/local/sbin/syslog_fileschanged.pl
# fileschanged -a r -f /bin/ /sbin/ /usr/bin/ /usr/sbin/ /usr/local/bin/ /usr/local/sbin/ /etc/ /usr/local/etc/ /var/spool/ | /usr/local/sbin/syslog_fileschanged.pl &
[1] 29656
#

Als Ausgabe sollte dann in /var/log/messages z.B. sowas kommen:

Jul 25 19:25:48 localhost fileschanged[29478]: A /var/spool/tmp/foofile
Jul 25 19:25:48 localhost fileschanged[29478]: R /var/spool/tmp/foofile
Jul 25 19:25:48 localhost fileschanged[29478]: R /var/spool/tmp/foofile
Jul 25 19:25:48 localhost fileschanged[29478]: M /var/spool/postfix/public/pickup
Jul 25 19:25:50 localhost fileschanged[29478]: M /var/spool/postfix/public/qmgr

Syslog kann man nun ggf. noch auf einen externen Server loggen oder alarmieren (per Mail/SMS) lassen oder andere „Schweinereien“ damit veranstalten. Oder man benutzt statt des Syslog-Perlscriptes was völlig anderes.

 

Die weiteren Anwendungsgebiete sind nahezu unbegrenzt und von der eigenen schmutzigen Phantasie abhängig. 😉

Noch als Hinweis: Man sieht natürlich nur die Änderungen an den Dateien die man sonst auch sehen darf (Stichworte: filemods und owner).