Автор Тема: как настроены логи Samba на системе с systemd  (Прочитано 3678 раз)

Оффлайн astar

  • Участник
  • *
  • Сообщений: 2
Добрый день
не великий знаток линукс, установил Alt Linux Server 10, Samba - изучаю как все устроено

привык что все настраивается скажем так через conf файлы и можно изучить почему и как
в /etc/samba/smb.conf.example есть строки о логировании (/var/log/samba и т.п.) но в моем /etc/samba/smb.conf я не оставил об этом ни строчки, но в /var/log/samba пишутся логи
понятно что видимо это "зашито" по умолчанию и в smb.conf можно переопределить только

попробовал настроить vfs_full_audit и обнаружил что все записи от процесса smbd_audit попадают в journalctl. Допустим. Логично. Все инструкции пишут если хотите в отдельные логи, настраивайте перенаправление в rsyslog и т.п. и там обрабатывайте

но у меня на сервере не запущены ни syslog ни rsyslog ни syslog-ng
Вопрос: как Samba  ведет лог самостоятельно без всяких сервисов? или для этого не обязательно их иметь?
и тогда можно ли в smb.conf настроить чтобы и vfs_full_audit писал в отдельные файлы, или это только с поднятием rsyslog и перенаправлением в него журнала?

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 652
но у меня на сервере не запущены ни syslog ни rsyslog ни syslog-ng
Если так нужно, то кто мешает доустановить и перенаправить?

Оффлайн astar

  • Участник
  • *
  • Сообщений: 2
вопрос скорее чтобы понять: а как же оно работает?

Оффлайн Alex_arch

  • Use linux, Just Linux!
  • Участник
  • *
  • Сообщений: 13
  • Linux for all!
Расскажу как я решил данный вопрос для себя. Столкнулся с тем же что и вы.
smb.conf
[global]
        security = ads
        realm = COMPANY.LAN
        workgroup = COMPANY
        netbios name = SRVFS
        template shell = /bin/bash
        kerberos method = system keytab
        wins support = no
        winbind use default domain = yes
        winbind enum users = no
        winbind enum groups = no
        template homedir = /home/COMPANY.LAN/%U
        idmap config * : range = 200000-2000200000
        idmap config * : backend = sss

        machine password timeout = 0

printcap name = /dev/null
load printers = no
disable spoolss = yes
printing = bsd

[share]

    path = /var/data/share
    browseable = yes
    read only = no

  # Настройки аудита
    full_audit:prefix = %U|%I
    full_audit:success = mkdirat, renameat, unlinkat, pwrite, pread, sendfile, create_file
    full_audit:failure = none

    # ACL и атрибуты (оставляем как у вас)
    store dos attributes = yes
    nt acl support = yes
    map acl inherit = no
    inherit owner = yes
    inherit acls = yes
    inherit permissions = yes

Далее я написал скрипт по обработке данных получаемых через journalctl -t smbd_audit -f

/home/alexey/scrypt/smd_log.sh

#!/usr/bin/env bash
set -euo pipefail

# --- НАСТРОЙКИ ---
LOG_DIR="/var/log/samba-audit"
LOG_PREFIX="smbd_audit"
DAYS_TO_KEEP=5
# ----------------

mkdir -p "$LOG_DIR"

# Функция: получить имя файла на сегодня
get_today_file() {
    date +"${LOG_DIR}/${LOG_PREFIX}_%Y-%m-%d.log"
}

# Проверка: сегодня рабочий день (пн–пт)
WEEKDAY=$(date +%u)  # 1=пн, ..., 5=пт, 6=сб, 7=вс
if [[ "$WEEKDAY" -gt 5 ]]; then
  # В выходные ничего не пишем, но скрипт можно оставить запущенным — он просто не будет писать
  exec journalctl -t smbd_audit -f --no-pager >/dev/null 2>/dev/null &
  PID=$!
  wait "$PID"
  exit 0
fi

CURRENT_FILE="$(get_today_file)"

# Удаляем файлы старше $DAYS_TO_KEEP дней
find "$LOG_DIR" -type f -name "${LOG_PREFIX}_*.log" -mtime +"$DAYS_TO_KEEP" -delete

# Запуск journalctl и запись в файл
exec journalctl -t smbd_audit -f --no-pager | while IFS= read -r line; do
  # Пересоздаём файл, если дата изменилась (на случай, если скрипт работает несколько дней)
  NEW_FILE="$(get_today_file)"
  if [[ "$NEW_FILE" != "$CURRENT_FILE" ]]; then
    CURRENT_FILE="$NEW_FILE"
    # Если сегодня выходной — прекращаем писать
    WEEKDAY=$(date +%u)
    if [[ "$WEEKDAY" -gt 5 ]]; then
      break
    fi
  fi
  echo "$line" >> "$CURRENT_FILE"
done
И теперь описание службы /etc/systemd/system/smb_audit.service
[Unit]
Description=Samba audit log follower (smbd_audit)
After=network.target syslog.service

[Service]
Type=simple
ExecStart=/home/alexey/scrypt/smd_log.sh
Restart=on-failure
RestartSec=5s
# Важно: не используем StandardOutput=file, чтобы не конфликтовать с логикой скрипта

[Install]
WantedBy=multi-user.target


В итоге у меня есть скрипт который запускается при старте после systemctl enable --now smb_audit.service
Если служба отваливается, то система её пытается перезапустить. Службой я могу управлять через systemctl start/stop/status smb_audit.service