Scannedonly
Site web : http://olivier.sessink.nl/scannedonly/
Fonctionnement
Scannedonly livre plusieurs choses :
- Un module VFS pour samba nommé scannedonly (fichier scannedonly.so)
- Un daemon de scan de fichier avec clamav : scannedonlyd_clamav
- Un outil de scan manuel : commande scannedonly_prescan
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.
Installation
Méthode utiliser sur une Debian Lenny (5.0.3) en janvier 2010 avec : * Scannedonly version 0.15 * Samba version 3.2.5
Pré-requis : les sources samba
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
Compilation/installation scannedonly
- Téléchargement, compilation et installation :
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 çà :
- Créer le dossier pour la socket :
mkdir /var/lib/scannedonly/ chmod 755 /var/lib/scannedonly/
- Ajouter le fichier de configuration du lancement du daemon : /etc/default/scannedonlyd
# 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
- Ajouter le script de lancement dans /etc/init.d : /etc/init.d/scannedonlyd
#! /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 :
- Pid file : /var/run/scannedonly.pid
- Socket : /var/lib/scannedonly/scan
- Log : via syslog, dans /var/log/daemon.log
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 :
- Ajouter les lignes suivantes dans /etc/sysctl.conf
# Pour scannedonlyd (default : 131071) net.core.rmem_max = 524288
- Pour que se soit pris en compte immédiatement, lancer la commande :
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 :
- Si vous avez insserv (apt-get install insserv au besoin) vous pouvez l'utiliser :
insserv scannedonlyd
- Sinon utiliser la commande update-rc.d
update-rc.d scannedonlyd defaults
Configuration d'un partage samba
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).
Préscan
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.