====== Scannedonly ====== **Site web :** http://olivier.sessink.nl/scannedonly/ ===== Fonctionnement ===== {{informatique:reseau:samba:20100121-scannedonly-archi.png|}} **//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 L'argument //--with-samba-source=/usr/local/src/samba/samba-X.X.X/source/// n'est plus nécéssaire dixit //Tattoo//. 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.