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 12 (bookworm)
  • samba : 4.17

/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 unlink rmdir pwrite #For samba version < 4.17 full_audit:success = mkdirat renameat unlinkat pwrite #For samba version < 4.17 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 # local7.none prevent to have local7 facility log inside syslog file *.*;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 #samba log will be sent to /var/log/samba_vfs.log file local7.* /var/log/samba_vfs.log […] #we disable local7 logs to /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