Пост

Собираем Samba NAS в Proxmox LXC. Часть 4: Логирование действий пользователей

Включаем аудит действий пользователей в Samba Secure: vfs_full_audit, syslog-ng, отдельный лог, logrotate и проверка событий.

Собираем Samba NAS в Proxmox LXC. Часть 4: Логирование действий пользователей

Задача

В третьей части мы добавили защищённую шару:

1
\\nas\secure

Теперь включим аудит действий пользователей именно для неё.

Нужно видеть:

  • кто подключался;
  • с какого IP;
  • к какой шаре;
  • какие операции выполнял;
  • какие файлы открывал, создавал, изменял или удалял.

Для этого используем Samba VFS-модуль:

1
vfs objects = full_audit

Audit включаем только для [secure], а не для всех шар. Иначе можно получить много шума, лишнюю нагрузку и огромные логи.


Что будем логировать

Базовый набор операций:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
connect
disconnect
mkdir
rmdir
open
close
rename
unlink
write
pwrite
chmod
fchmod
chown
fchown

Можно сделать логирование шире, но для начала лучше не превращать audit в поток мусора.


Где будут логи

Сделаем отдельный файл:

1
/var/log/samba/audit-secure.log

Формат будет примерно такой:

1
samba_audit: samba|192.168.1.42|secure|unlink|ok|secret.docx

То есть:

1
user | ip | share | operation | result | file

Скрипт add-secure-audit-logging.sh

Скрипт:

  • проверяет наличие шары [secure];
  • устанавливает syslog-ng, если его нет;
  • делает backup smb.conf;
  • добавляет audit-блок в [secure];
  • настраивает отдельный syslog-ng destination;
  • создаёт лог-файл;
  • проверяет конфиг Samba;
  • перезапускает сервисы.

Создай файл:

1
nano add-secure-audit-logging.sh

Вставь:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#!/usr/bin/env bash
set -Eeuo pipefail

# ============================================================
# SMB на bash. Часть 4. Logging
# Audit-логирование действий в шаре [secure]
# ============================================================

SHARE_NAME="${SHARE_NAME:-secure}"
SMB_CONF="${SMB_CONF:-/etc/samba/smb.conf}"
AUDIT_LOG="${AUDIT_LOG:-/var/log/samba/audit-secure.log}"
SYSLOG_NG_CONF="${SYSLOG_NG_CONF:-/etc/syslog-ng/conf.d/samba-audit-secure.conf}"

require_root() {
  if [[ "${EUID}" -ne 0 ]]; then
    echo "Ошибка: запусти скрипт от root"
    exit 1
  fi
}

check_share_exists() {
  if ! grep -qE "^\[${SHARE_NAME}\]" "${SMB_CONF}"; then
    echo "Ошибка: шара [${SHARE_NAME}] не найдена в ${SMB_CONF}"
    echo "Сначала выполни часть 3."
    exit 1
  fi
}

install_syslog_ng() {
  if ! command -v syslog-ng >/dev/null 2>&1; then
    echo "==> Устанавливаем syslog-ng"
    apt update
    apt install -y syslog-ng
  else
    echo "==> syslog-ng уже установлен"
  fi
}

backup_config() {
  local backup="${SMB_CONF}.bak.audit.$(date +%F_%H-%M-%S)"
  echo "==> Делаем backup ${backup}"
  cp "${SMB_CONF}" "${backup}"
}

ensure_not_already_enabled() {
  if grep -A40 -E "^\[${SHARE_NAME}\]" "${SMB_CONF}" | grep -q "vfs objects = full_audit"; then
    echo "Audit для [${SHARE_NAME}] уже включён — пропускаем изменение smb.conf"
    return 0
  fi

  return 1
}

add_audit_block() {
  echo "==> Добавляем audit-блок в [${SHARE_NAME}]"

  awk -v share="[${SHARE_NAME}]" '
    BEGIN {
      in_share = 0
      added = 0
    }

    {
      if ($0 == share) {
        in_share = 1
        print
        next
      }

      if (in_share && $0 ~ /^\[/ && added == 0) {
        print ""
        print "   # Audit logging"
        print "   vfs objects = full_audit"
        print "   full_audit:prefix = %u|%I|%S"
        print "   full_audit:success = connect disconnect mkdir rmdir open close rename unlink write pwrite chmod fchmod chown fchown"
        print "   full_audit:failure = none"
        print "   full_audit:facility = local5"
        print "   full_audit:priority = notice"
        added = 1
        in_share = 0
      }

      print
    }

    END {
      if (in_share && added == 0) {
        print ""
        print "   # Audit logging"
        print "   vfs objects = full_audit"
        print "   full_audit:prefix = %u|%I|%S"
        print "   full_audit:success = connect disconnect mkdir rmdir open close rename unlink write pwrite chmod fchmod chown fchown"
        print "   full_audit:failure = none"
        print "   full_audit:facility = local5"
        print "   full_audit:priority = notice"
      }
    }
  ' "${SMB_CONF}" > /tmp/smb.conf.audit

  mv /tmp/smb.conf.audit "${SMB_CONF}"
}

configure_syslog_ng() {
  echo "==> Настраиваем syslog-ng"

  mkdir -p "$(dirname "${SYSLOG_NG_CONF}")"
  mkdir -p "$(dirname "${AUDIT_LOG}")"

  cat > "${SYSLOG_NG_CONF}" <<EOF
destination d_samba_audit_secure {
    file("${AUDIT_LOG}" owner("root") group("adm") perm(0640));
};

filter f_samba_audit_secure {
    facility(local5) and level(notice);
};

log {
    source(s_src);
    filter(f_samba_audit_secure);
    destination(d_samba_audit_secure);
};
EOF

  touch "${AUDIT_LOG}"
  chown root:adm "${AUDIT_LOG}" 2>/dev/null || chown root:root "${AUDIT_LOG}"
  chmod 0640 "${AUDIT_LOG}"
}

validate_config() {
  echo "==> Проверяем Samba config"
  testparm -s "${SMB_CONF}" >/dev/null

  echo "==> Проверяем syslog-ng config"
  syslog-ng --syntax-only
}

restart_services() {
  echo "==> Перезапускаем syslog-ng и Samba"
  systemctl restart syslog-ng
  systemctl restart smbd
}

print_summary() {
  echo
  echo "Audit-логирование включено."
  echo "Шара: [${SHARE_NAME}]"
  echo "Лог: ${AUDIT_LOG}"
  echo
  echo "Просмотр:"
  echo "  tail -f ${AUDIT_LOG}"
  echo
  echo "Проверка Samba:"
  echo "  testparm -s | grep -A40 '\\[${SHARE_NAME}\\]'"
}

main() {
  require_root
  check_share_exists
  install_syslog_ng
  backup_config

  if ! ensure_not_already_enabled; then
    add_audit_block
  fi

  configure_syslog_ng
  validate_config
  restart_services
  print_summary
}

main "$@"

Запуск

1
2
chmod +x add-secure-audit-logging.sh
sudo ./add-secure-audit-logging.sh

Проверка audit-блока

1
testparm -s | grep -A40 '\[secure\]'

Должны появиться параметры:

1
2
3
4
vfs objects = full_audit
full_audit:prefix = %u|%I|%S
full_audit:facility = local5
full_audit:priority = notice

Проверка логов

Открой лог на сервере:

1
tail -f /var/log/samba/audit-secure.log

С клиента подключись к шаре:

1
smbclient //SERVER_IP/secure -U samba -m SMB3

Создай файл:

1
2
3
4
smb: \> put test.txt
smb: \> rename test.txt renamed.txt
smb: \> del renamed.txt
smb: \> quit

В логе должны появиться записи с пользователем, IP, шарой и операцией.


Logrotate

Audit-лог может быстро расти. Добавим ротацию.

Создай файл:

1
sudo nano /etc/logrotate.d/samba-audit-secure

Содержимое:

1
2
3
4
5
6
7
8
9
/var/log/samba/audit-secure.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root adm
}

Проверка:

1
sudo logrotate -d /etc/logrotate.d/samba-audit-secure

Что логировать, а что нет

Если логов слишком много, можно уменьшить набор операций.

Например оставить только изменения:

1
full_audit:success = mkdir rmdir rename unlink write pwrite chmod fchmod chown fchown

Если нужна полная картина, можно добавить open и close, но они создают много записей.


Возможные ошибки

syslog-ng --syntax-only падает

Проверь конфиг:

1
2
cat /etc/syslog-ng/conf.d/samba-audit-secure.conf
journalctl -u syslog-ng -n 100 --no-pager

Лог-файл пустой

Проверь:

1
2
3
testparm -s | grep -A40 '\[secure\]'
systemctl status syslog-ng --no-pager
systemctl status smbd --no-pager

Затем сделай реальную операцию в шаре: создать, удалить или переименовать файл.

Логи слишком шумные

Убери open и close:

1
full_audit:success = mkdir rmdir rename unlink write pwrite chmod fchmod chown fchown

Почему audit важен

Backup отвечает на вопрос:

1
можем ли мы восстановиться?

Audit отвечает на другой вопрос:

1
что именно произошло?

Если файл пропал или был изменён, audit помогает понять:

  • кто это сделал;
  • с какого IP;
  • когда;
  • в какой шаре;
  • какая операция была выполнена.

Итог

Мы включили audit для [secure].

Теперь защищённая шара не просто хранит файлы, но и оставляет следы важных операций. В следующей части добавим публичную read-only шару [public].

Авторский пост защищен лицензией CC BY 4.0 .

Популярные теги