logo rss

Loguer l'activité des utilisateurs Windows sur un partage Samba

samba linux logo

Intro

Par défaut un serveur Samba ne logue pas l'activité des utilisateurs comme la création ou la suppression de fichiers ou dossiers. Or il peut être utile de disposer de ces informations sur un serveur en production.

Nous allons donc voir comment loguer les noms d'utilisateur, les addresses ip, les noms de machines, les fichiers et le type d'opérations associé. Tout cela grace au module vfs.

Configuration

  • OS : Debian GNU/Linux 10 (buster)
  • samba : 4.9.5

/etc/samba/smb.conf

  • Nous devons ajouter ces lignes de configuration :
    • prefix : qui permet de formater les logs
    • success : ce que l'on veut loguer
    • facilty : pour la configuration de syslog
[global]
   workgroup = WORKGROUP
   server string = serv
   bind interfaces only = yes
   vfs objects = full_audit
   full_audit:prefix = %u|%I|%m|%S
   full_audit:success = mkdir rename unkink rmdir pwrite
   full_audit:failure = none
   full_audit:facility = local7
   full_audit:priority = NOTICE

Configuration check and Reload services

root@host:~# testparm
root@host:~# smbcontrol all reload-config

Rsyslog

  • Nous allons éditer le fichier /etc/rsyslog.conf afin de configurer le facility7 dans notre fichier de configuration de rsyslog. Ici notre fichier de log se trouvera dans /var/log/samba_vfs.log.
###############
#### RULES ####
###############

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
#*.*;auth,authpriv.none          -/var/log/syslog
#Nous supprimons les logs samba de /var/log/syslog
*.*;auth,authpriv.none;local7.none -/var/log/syslog 
#cron.*                         /var/log/cron.log
daemon.*                        -/var/log/daemon.log
kern.*                          -/var/log/kern.log
lpr.*                           -/var/log/lpr.log
mail.*                          -/var/log/mail.log
user.*                          -/var/log/user.log
#les logs samba s'enregistreront dans /var/log/samba_vfs.log
local7.*                        /var/log/samba_vfs.log

[…]

#Nous supprimons les logs samba de /var/log/messages
*.=info;*.=notice;*.=warn;\
        auth,authpriv.none;\
        cron,daemon.none;\
        mail.none;local7.none               -/var/log/messages
  • Nous redémarrons notre service.
root@host:~# systemctl restart rsyslog
  • Et on vérifie nos logs
root@host:~# tail -f /var/log/samba_vfs.log

Traitement du fichier de logs

Le mode Full audit est excrément verbeux, donc ce dernier va rapidement être très volumineux. Afin de réduire l'espace occupé par ce dernier j'ai développé un script qui va se charger de créer des archives .gz avec un système de roulement. L'associer à une tache cron afin de rendre tout ça autonome.

⚠️ Le script ne fonctionne que pour un système de fichiers ext4.

  • /usr/local/sbin/log_samba.sh
#! /bin/bash
SDE=$(/bin/date --date='2 days ago' +%s) #two days epoch
INO=$(stat -c %i /var/log/samba_vfs.log) #get inode number of /var/log/samba_vfs.log file
DEV=/dev/sda1 #device where /var has been mounted
CRE=$(/bin/date --date="$(/sbin/debugfs -R 'stat <"'"$INO"'">' $DEV 2>/dev/null | grep 'crtime:' | sed 's/.*-- //')" +%s) #get epoch time of last /var/log/samba_vfs.log modification

A=6
B=7

if [ "$SDE" -gt "$CRE" ]; then
        while [ "$A" -ge 1 ]; do
                mv /var/log/samba_vfs."$A".gz /var/log/samba_vfs."$B".gz
                ((A-=1)) #ou A=$((A-1))
                ((B-=1))
        done

        gzip -c /var/log/samba_vfs.log > /var/log/samba_vfs.1.gz
        rm /var/log/samba_vfs.log
	systemctl restart rsyslog
fi

Création de la tache cron

  • /etc/cron.d/samba_logs
0 3 * * * root /usr/local/sbin/log_samba.sh

References

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

adresse mail de contact