Site web : http://olivier.sessink.nl/scannedonly/
Scannedonly livre plusieurs choses :
Le module VFS est chargé par Samba si il est utilisé dans certain partage de samba. Dans la configuration du module VFS, les informations nécessaires à la connexion au daemon clamav sont données : cela peut être via une socket en local ou encore via le réseau en transport UDP.
Le daemon lui est à l'écoute et attente les demandes de scan. En cas de demande, il utilise l'API de la libclamav pour scanner le fichier. En cas de détection de virus le fichier est soit placer dans le dossier de mise en quarantaine, soit renommer dans le répertoire courant avec un nom de la forme .virus:nom original.ext et un fichier vide est créé dans le répertoire courant pour avertir l'utilisateur et porte un nom de la forme /VIRUS_found_in_nom original.ext.txt. A l'inverse, si le fichier n'est pas un virus, un fichier indiquant que ce fichier a bien été scanné est créé et se nomme sous la forme .scanned:nom original.ext. Lors d'une demande de scan, le daemon vérifie si le fichier .scanned existe déjà ou non et si il est plus récent que le fichier à scanner. Cela créé une mise en tampon du résultat du scan. Tout les fichiers .virus ou .scanned ne sont pas accessible via samba car ils sont cachés et exclu par le module VFS.
Méthode utiliser sur une Debian Lenny (5.0.3) en janvier 2010 avec : * Scannedonly version 0.15 * Samba version 3.2.5
cd /usr/src mkdir samba cd samba apt-get install dpkg-dev build-essential apt-get source samba cd samba-X.X.X/source ./configure make
Remarque : attendre 10-15 secondes de la compilation puis CTRL+C
cd /usr/src wget http://olivier.sessink.nl/scannedonly/scannedonly-X.X.tar.bz2 tar xjvf scannedonly-X.X.tar.bz2 cd scannedonly-X.X apt-get install libclamav-dev ./configure --with-samba-source=/usr/local/src/samba/samba-X.X.X/source/ --with-samba-vfs-dir=/usr/lib/samba/vfs/ make make install
Il faut ensuite rajouter quelques scripts d'admin, créer des dossiers, etc histoire d'intégrer tout çà :
mkdir /var/lib/scannedonly/ chmod 755 /var/lib/scannedonly/
# Start daemon START=yes # Bin DAEMON_BIN=/usr/local/sbin/scannedonlyd_clamav # Socket path SOCKET=/var/lib/scannedonly/scan # Port (UDP) #PORT= # Scan Root SCANROOT=/home/samba # Nb Threads NB_THREADS=4 # Log Level (0-3) LOG_LEVEL=1 # Taille minimum des fichiers considere comme gros (en Mb) BIG_FILE_SIZE=10
#! /bin/sh # /etc/init.d/scannedonlyd: start the scannedonly daemon. ### BEGIN INIT INFO # Provides: scannedonlyd # Required-Start: $syslog # Required-Stop: $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Scannedonly daemon ### END INIT INFO PATH=/bin:/usr/bin:/sbin:/usr/sbin pidfile=/var/run/scannedonlyd.pid binpath=/usr/local/sbin/scannedonlyd_clamav START=no test ! -r /etc/default/scannedonlyd || . /etc/default/scannedonlyd [ "$START" != "yes" ] && exit 0 . /lib/lsb/init-functions if [ -n "$DAEMON_BIN" ] then if [ -x "$DAEMON_BIN" ] then binpath="$DAEMON_BIN" else log_warning_msg "$DAEMON_BIN is not executable. Use default binary." fi fi test -f $binpath || exit 0 ARGS="--scanroot=$SCANROOT -t $NB_THREADS -l $LOG_LEVEL -b $BIG_FILE_SIZE -i $pidfile" if [ -n "$PORT" ] then ARGS="$ARGS -p $PORT" else ARGS="$ARGS -s $SOCKET" fi case "$1" in start) log_begin_msg "Starting scannedonly daemon" start-stop-daemon --start --quiet --pidfile $pidfile --name scannedonlyd_cl --startas $binpath -- $ARGS log_end_msg $? ;; stop) log_begin_msg "Stopping scannedonly daemon" start-stop-daemon --stop --quiet --retry 3 --exec $binpath --pidfile $pidfile log_end_msg $? ;; restart|force-reload) log_begin_msg "Reloading scannedonly daemon" start-stop-daemon --stop --quiet --retry 3 --exec $binpath --pidfile $pidfile start-stop-daemon --start --quiet --pidfile $pidfile --name scannedonlyd_cl --startas $binpath -- $ARGS log_end_msg $? ;; *) log_success_msg "Usage: $0 {start|stop|restart|force-reload}" exit 1 esac exit 0
Dans cette configuration :
Note : Il m'a été nécessaire de changer la configuration de la taille maximum du buffer des sockets gérées par le kernel (trop petite par défaut). Le problème apparaissait dans les logs sous la forme de la ligne suivante affichée lors du lancement du daemon :
scannedonlyd_clamav[32416]: Failed to increase socket buffer size. Requested 524288 bytes, got 262142 bytes
Pour régler le problème :
# Pour scannedonlyd (default : 131071) net.core.rmem_max = 524288
sysctl net.core.rmem_max=524288
Il doit donc ensuite être possible de lancer le daemon :
/etc/init.d/scannedonlyd start
Ce qui doit apparaitre dans les logs si tout se passe bien :
Jan 21 12:04:09 idesia scannedonlyd_clamav[5239]: Starting with socket /var/lib/scannedonly/scan and 4 threads Jan 21 12:04:10 idesia scannedonlyd_clamav[5239]: Finished building databases. Ready for scanning with 4 threads
Remarque : Penser également à rendre se lancement automatique au démarage du serveur (si nécessaire). Pour cela :
insserv scannedonlyd
update-rc.d scannedonlyd defaults
Exemple de déclaration d'un partage Samba :
[monpartage] comment = Repertoire de test de partage path = /home/samba/monpartage browseable = No writeable = Yes create mask = 0700 directory mask = 0700 vfs object = scannedonly scannedonly: hide_nonscanned_files = False
Remarque : Il existe d'autres paramètres de configuration. Dans ce cas, les paramètres par défaut convienne bien (utilisation d'une socket, emplacement standard, …). Pour plus d'infos aller sur le site du projet (cf. en haut de ce doc).
Il est utile de pouvoir de faire un pré-scan au moment de l'initialisation du VFS dans un partage. Pour cela, il est possible d'utiliser la commande scannedonly_prescan de la manière suivante :
scannedonly_prescan /chemin/du/dossier/du/partage
Toutes les données du partages seront parcourues et scannés si nécessaire.
Remarque : Il est bien entendu possible de programmer cette tâche durant la nuit pour ne pas charger de gros serveur contenant beaucoup de fichiers en pleine journée.