informatique:reseau:samba:scannedonly

Scannedonly

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.

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

  • 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).

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.

  • informatique/reseau/samba/scannedonly.txt
  • Dernière modification : 2012/02/03 14:50
  • de bn8