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.
[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
root@host:~# testparm
root@host:~# smbcontrol all reload-config
###############
#### 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
root@host:~# systemctl restart rsyslog
root@host:~# tail -f /var/log/samba_vfs.log
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.
#! /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
0 3 * * * root /usr/local/sbin/log_samba.sh
Contact :