Мои заметки по настройке журналирования (аудита) определённых действий пользователей на файловом сервере на примере Ubuntu 24.04 и Samba 4.19. Обычно такая задача возникает в ситуациях когда пользователь стёр некий файл/папку и необходимо впредь знать кто и когда именно. Права доступа и резервное копирование никто не отменял, но всё же бывает ситуация что пользователь должен иметь права записи и вот произошло разрушительное событие, которое нужно расследовать.
Конкретная последовательность шагов, приводящая к нужному:
#===== Global Settings ======== [global] ... log level = 1 auth_audit:3 vfs:1 log file = /var/log/samba/log.%I full_audit:prefix = %u|%U|%I|%a|%S full_audit:success = connect mkdirat renameat unlinkat pwrite full_audit:failure = none full_audit:facility = local5 full_audit:priority = notice vfs objects = full_audit ...
Где
Все актуальные переменные найдёте в документации man 5 smb.conf
в разделе VARIABLE SUBSTITUTIONS.
%S - Имя текущей службы.
%P - Корневой каталог текущей службы.
%u - Пользователь текущей службы.
%g - Основная группа %u.
%U - Имя пользователя для сеанса (может отличаться от имени, запрошенного клиентом).
%G - Основная группа %U.
%H - Домашний каталог пользователя.
%v - Версия Samba.
%h - Имя хоста, на котором работает Samba.
%m - NetBIOS имя компьютера клиента.
%L - NetBIOS имя сервера. Эта переменная может оказаться полезной в том случае, если вы на одном Samba сервере запускаете несколько NetBIOS серверов.
%M - Имя хоста для компьютера клиента.
%N - Имя NIS (Network Information System) сервера домашних каталогов. Значение определяется при помощи настройки системы NIS auto.map.
%p - Путь к домашнему каталогу службы. Значение определяется при помощи файла настройки системы NIS auto.map. Запись в этом файле представляется как %N:%p.
%R - Выбранный после установления соединения уровень протокола.
%d - Номер текущего серверного процесса.
%a - Операционная система клиента (значение может быть неверным!).
%I - IP адрес клиентской машины.
%T - Текущие дата и время.
Строки а что собственно журналировать в успешном (success) или в неудачном (failure) вызове? Актуальные системные вызовы нужно брать в документации проекта Samba man 8 vfs_full_audit
. По каждому непонятному вызову с самоговорящим названием на английском языке для дополнительной информации можно запросить справку, например man pwrite
.
В моей практике, хоть и один раз, но было серьёзное изменение в именах вызовов. В результате я получил полное журналирование всех операций. Это привело к огромной нагрузке на дисковую систему по каждому чиху множества пользователей. В дни серьёзных обновлений всего сервера и версий Samba контролируйте файл аудита!
В примере, мы журналируем сам факт соединения (connect), создание (mkdirat) и переименовка (renameat) файлов/каталогов, удаление (unlinkat), запись (pwrite).
Так же доступны для указания зарезервированные слова all и none. Различные примеры вы найдёте так же в документации в разделе EXAMPLES. Например, журналировать все неудачные вызовы, кроме открытия файлов - full_audit:failure = all !open
В итоге вся строка будет иметь вид smbd_audit: PREFIX|OPERATION |RESULT|FILE
Где:
Примерно так, smbd_audit: user1|user1|192.168.1.111|OSX|share| unlinkat|ok|/share/Бюджет/2025
OSX - Это MS Windows 10, а Vista - это MS Windows 7. Очень полезная и правдивая информация
Указываем категорию (facility) как local5 и приоритет (priority) как notice. Если 5 занято на вашем сервере под другие задачи, то берите любую от 0 до 7, но запомните цифру, так как дальше она будет использоваться.
local5.notice /var/log/samba/audit.log
*.*;auth,authpriv.none,local5.none -/var/log/syslog
sudo touch /var/log/samba/audit.log
sudo chown root:syslog /var/log/samba/audit.log
sudo chmod 660 /var/log/samba/audit.log
/var/log/samba/audit.log { weekly missingok rotate 60 compress delaycompress notifempty create 660 root syslog }
sudo testparm -s && sudo systemctl restart smbd && sudo systemctl status smbd
sudo systemctl restart rsyslog && sudo systemctl status rsyslog
sudo systemctl restart logrotate && sudo systemctl status logrotate
sudo grep -vE "(~\\$|~lock)" /var/log/samba/audit.log
Дополнительная информация