Собираем Samba NAS в Proxmox LXC. Часть 3: Защищённая шара с SMB encryption
Добавляем защищённую Samba-шару Secure в Proxmox LXC: SMB encryption, права 770, SMB3, проверка подключения и bash-скрипт.
Задача
В прошлой части мы создали основную рабочую шару:
1
\\nas\share
Теперь добавим отдельную защищённую шару:
1
\\nas\secure
Эта шара нужна для файлов, к которым нужно относиться внимательнее:
- личные документы;
- бухгалтерия;
- сканы;
- служебные файлы;
- данные, где важны аудит и контроль доступа.
Для [secure] включим SMB encryption.
[share]остаётся обычной рабочей шарой.[secure]будет отдельной зоной с повышенными требованиями.
Что такое SMB encryption
SMB encryption — это шифрование на уровне протокола SMB3.
Это не TLS поверх HTTP и не VPN. Шифрование встроено в SMB3 и защищает SMB-трафик между клиентом и сервером.
Практически это означает:
1
2
клиент ↔ Samba server
SMB3 encrypted traffic
В Samba за это отвечает параметр:
1
smb encrypt = required
или более мягкий вариант:
1
smb encrypt = desired
В этой статье я сделаю режим по умолчанию:
1
smb encrypt = desired
Почему не сразу required?
Потому что в реальной сети могут быть клиенты, которые не смогут подключиться к mandatory encryption. Лучше сначала проверить совместимость, а затем поднять уровень до required.
Secure vs Share
| Шара | Назначение | Encryption | Audit |
|---|---|---|---|
[share] | рабочие файлы | нет / обычный SMB3 | нет |
[secure] | чувствительные файлы | desired или required | будет в части 4 |
Так мы не ломаем обычную работу и включаем усиленную защиту там, где она действительно нужна.
Скрипт add-secure-smb-share.sh
Скрипт:
- не перезатирает весь
/etc/samba/smb.conf; - создаёт каталог
/srv/samba/secure; - добавляет блок
[secure]; - делает backup конфига;
- проверяет
testparm; - перезапускает Samba.
Создай файл:
1
nano add-secure-smb-share.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
#!/usr/bin/env bash
set -Eeuo pipefail
# ============================================================
# SMB на bash. Часть 3. Secure
# Добавление защищённой шары [secure] с SMB encryption
# ============================================================
SAMBA_USER="${SAMBA_USER:-samba}"
SHARE_NAME="${SHARE_NAME:-secure}"
SECURE_DIR="${SECURE_DIR:-/srv/samba/secure}"
SMB_CONF="${SMB_CONF:-/etc/samba/smb.conf}"
# desired — шифровать, если клиент поддерживает.
# required — требовать шифрование всегда.
SMB_ENCRYPT="${SMB_ENCRYPT:-desired}"
require_root() {
if [[ "${EUID}" -ne 0 ]]; then
echo "Ошибка: запусти скрипт от root"
exit 1
fi
}
check_requirements() {
if [[ ! -f "${SMB_CONF}" ]]; then
echo "Ошибка: не найден ${SMB_CONF}"
echo "Сначала выполни часть 2 и создай базовую Samba-конфигурацию."
exit 1
fi
if ! id "${SAMBA_USER}" &>/dev/null; then
echo "Ошибка: Unix-пользователь ${SAMBA_USER} не найден"
exit 1
fi
}
prepare_dir() {
echo "==> Создаём каталог ${SECURE_DIR}"
mkdir -p "${SECURE_DIR}"
chown "${SAMBA_USER}:${SAMBA_USER}" "${SECURE_DIR}"
chmod 0770 "${SECURE_DIR}"
}
backup_config() {
local backup="${SMB_CONF}.bak.secure.$(date +%F_%H-%M-%S)"
echo "==> Делаем backup ${backup}"
cp "${SMB_CONF}" "${backup}"
}
ensure_share_not_exists() {
if grep -qE "^\[${SHARE_NAME}\]" "${SMB_CONF}"; then
echo "Шара [${SHARE_NAME}] уже существует в ${SMB_CONF}"
exit 0
fi
}
append_share() {
echo "==> Добавляем шару [${SHARE_NAME}]"
cat >> "${SMB_CONF}" <<EOF
[${SHARE_NAME}]
path = ${SECURE_DIR}
valid users = ${SAMBA_USER}
read only = no
writable = yes
browseable = yes
force user = ${SAMBA_USER}
force group = ${SAMBA_USER}
create mask = 0660
directory mask = 0770
smb encrypt = ${SMB_ENCRYPT}
EOF
}
validate_config() {
echo "==> Проверяем Samba config"
testparm -s "${SMB_CONF}" >/dev/null
}
restart_samba() {
echo "==> Перезапускаем Samba"
systemctl restart smbd
}
print_summary() {
local host
host="$(hostname -f 2>/dev/null || hostname)"
echo
echo "Готово."
echo "Шара: //${host}/${SHARE_NAME}"
echo "Каталог: ${SECURE_DIR}"
echo "SMB encryption: ${SMB_ENCRYPT}"
echo
echo "Проверка:"
echo " testparm -s | grep -A20 '\\[${SHARE_NAME}\\]'"
echo " smbclient //SERVER_IP/${SHARE_NAME} -U ${SAMBA_USER} -m SMB3"
echo " smbstatus"
}
main() {
require_root
check_requirements
prepare_dir
backup_config
ensure_share_not_exists
append_share
validate_config
restart_samba
print_summary
}
main "$@"
Запуск
Мягкий вариант, совместимый с большим количеством клиентов:
1
2
chmod +x add-secure-smb-share.sh
sudo ./add-secure-smb-share.sh
Строгий вариант:
1
sudo SMB_ENCRYPT="required" ./add-secure-smb-share.sh
Сначала проверь клиентов с
desired, а уже потом переходи наrequired.
Проверка конфигурации
1
testparm -s | grep -A25 '\[secure\]'
Ожидаем увидеть:
1
2
3
4
5
[secure]
path = /srv/samba/secure
valid users = samba
read only = No
smb encrypt = desired
Проверка подключения
С Linux-клиента:
1
smbclient //SERVER_IP/secure -U samba -m SMB3
На сервере после подключения:
1
smbstatus
Нас интересует колонка с протоколом и шифрованием. Если шифрование активно, в статусе будет видно, что соединение использует SMB3 и encryption.
Как переключить desired на required
Открой конфиг:
1
sudo nano /etc/samba/smb.conf
Найди блок:
1
[secure]
Замени:
1
smb encrypt = desired
на:
1
smb encrypt = required
Проверь и перезапусти:
1
2
testparm -s
systemctl restart smbd
Возможные ошибки
Клиент не подключается после required
Причина:
- клиент не поддерживает SMB encryption;
- старый SMB-клиент;
- старый мобильный SMB-клиент.
Решение:
1
smb encrypt = desired
Или обновить клиент.
Encryption = - в smbstatus
Причина:
- клиент подключился без encryption;
- используется
desired, но клиент не запросил шифрование; - нужно включить
required.
Решение:
1
smb encrypt = required
NT_STATUS_ACCESS_DENIED
Проверить права:
1
2
ls -ld /srv/samba/secure
id samba
Исправить:
1
2
sudo chown samba:samba /srv/samba/secure
sudo chmod 0770 /srv/samba/secure
Почему audit не включаем сразу
Audit полезен, но он создаёт нагрузку и много логов.
Поэтому я не включаю его на все шары и не включаю его в момент создания [secure].
Логика такая:
1
2
часть 3 → создаём secure и проверяем доступ
часть 4 → добавляем audit только для secure
Итог
Мы добавили отдельную шару:
1
\\nas\secure
Она:
- живёт в отдельном каталоге
/srv/samba/secure; - доступна только пользователю
samba; - имеет права
0770; - использует SMB encryption в режиме
desiredилиrequired; - готова к подключению audit-логирования.
В следующей части включим логирование действий пользователей только для [secure].
