Файловый сервер Samba для Windows-клиентов
Windows-клиенты в офисе почти всегда ожидают привычные сетевые папки: зашёл в \\сервер\ресурс, ввёл логин-пароль, увидел файлы. На Linux эту роль берёт на себя Samba — реализация протокола SMB/CIFS, которая для клиента выглядит неотличимо от обычного файлового сервера Windows, хотя под капотом работает демон smbd. В этой статье поднимем файловый сервер на узле srv-fs01 (192.168.10.20, домен itpages.lab.local) и настроим общие папки с разными уровнями доступа для сотрудников.
Задача типовая для малого и среднего офиса: есть общая папка для всех сотрудников, есть папка бухгалтерии, куда должны попадать только избранные пользователи, и есть личные домашние каталоги, куда заходит только сам пользователь. Разберём всё по шагам — от установки до тонкой настройки прав и решения частых проблем с правами доступа между Linux и Windows.
Установка Samba
sudo apt update
sudo apt install -y samba
Проверь версию и статус демонов — Samba запускает два сервиса: smbd отвечает за файловый и принтерный доступ, nmbd — за старое имя-разрешение NetBIOS, которое в современных сетях чаще не нужно, но полезно для совместимости со старыми Windows-клиентами:
smbd --version
sudo systemctl status smbd nmbd
Создание системных пользователей и групп
Samba использует отдельную базу учётных записей, но каждому пользователю Samba обязательно должен соответствовать системный пользователь Linux. Создадим группу бухгалтерии и пользователей:
sudo groupadd accounting
sudo useradd -M -s /usr/sbin/nologin -G accounting anna
sudo useradd -M -s /usr/sbin/nologin -G accounting oleg
sudo useradd -M -s /usr/sbin/nologin ivan
Флаг -M не создаёт домашнюю директорию в /home — она не нужна, доступ ведь идёт только по сети, а -s /usr/sbin/nologin запрещает вход по SSH или локально под этой учётной записью: пользователю нужен только доступ к сетевой папке, а не полноценная оболочка на сервере.
Теперь добавь пользователей в базу Samba и задай пароли отдельно от системных — это самостоятельная база, независимая от /etc/shadow:
sudo smbpasswd -a anna
sudo smbpasswd -a oleg
sudo smbpasswd -a ivan
Создание общих каталогов
sudo mkdir -p /srv/samba/public
sudo mkdir -p /srv/samba/accounting
sudo mkdir -p /srv/samba/homes
sudo chown -R root:root /srv/samba/public
sudo chmod -R 0775 /srv/samba/public
sudo chown -R root:accounting /srv/samba/accounting
sudo chmod -R 0770 /srv/samba/accounting
Общая папка public доступна всем на чтение и запись, папка accounting — только участникам одноимённой группы. Права на уровне файловой системы Linux — это первый, а не единственный слой защиты: сама Samba дальше добавит собственные правила поверх них.
Настройка smb.conf
Основной конфигурационный файл — /etc/samba/smb.conf. Раздел [global] задаёт общие параметры сервера:
sudo nano /etc/samba/smb.conf
[global]
workgroup = ITPAGES
server string = srv-fs01 file server
netbios name = SRV-FS01
security = user
map to guest = never
server min protocol = SMB2
client min protocol = SMB2
log file = /var/log/samba/log.%m
max log size = 1000
[public]
path = /srv/samba/public
browseable = yes
read only = no
guest ok = no
valid users = @accounting, anna, oleg, ivan
[accounting]
path = /srv/samba/accounting
browseable = no
read only = no
guest ok = no
valid users = @accounting
force group = accounting
create mask = 0660
directory mask = 0770
security = user требует аутентификацию по логину и паролю для любого доступа — гостевой доступ отключён явно параметром map to guest = never, что критично: без этой строки Samba в некоторых версиях по умолчанию может пускать неопознанных пользователей под гостевой учёткой. server min protocol = SMB2 отключает древний и небезопасный протокол SMB1, который до сих пор включён по умолчанию в некоторых дистрибутивах ради совместимости с Windows XP — современным сетям он не нужен и представляет собой известную поверхность атаки (тот самый протокол, через который распространялся шифровальщик WannaCry).
browseable = no у ресурса accounting означает, что папка не будет отображаться в списке сетевых ресурсов при простом просмотре \\srv-fs01\ — подключиться к ней всё ещё можно напрямую по полному пути, но она не бросается в глаза случайному пользователю без прав.
Личные домашние каталоги
Samba умеет автоматически создавать личный ресурс для каждого пользователя через специальную секцию [homes] — не нужно прописывать отдельный блок на каждого сотрудника:
[homes]
comment = Home Directories
path = /srv/samba/homes/%S
browseable = no
read only = no
valid users = %S
create mask = 0600
directory mask = 0700
Переменная %S подставляет имя текущего подключившегося пользователя, поэтому при заходе под anna Samba автоматически покажет ей ресурс \\srv-fs01\anna, указывающий на /srv/samba/homes/anna, и никто другой этот путь не увидит в списке ресурсов и не сможет к нему подключиться благодаря valid users = %S. Директории для каждого пользователя нужно создать заранее:
sudo mkdir -p /srv/samba/homes/anna /srv/samba/homes/oleg /srv/samba/homes/ivan
sudo chown anna:anna /srv/samba/homes/anna
sudo chown oleg:oleg /srv/samba/homes/oleg
sudo chown ivan:ivan /srv/samba/homes/ivan
Проверка конфигурации и перезапуск
Перед перезапуском обязательно проверь синтаксис — testparm разберёт файл и укажет на ошибки, а заодно покажет итоговую эффективную конфигурацию:
testparm
sudo systemctl restart smbd nmbd
sudo systemctl enable smbd nmbd
Открытие портов в брандмауэре
Samba использует несколько портов: 445 для основного SMB-трафика, 139 для устаревшего NetBIOS session service, и UDP 137-138 для NetBIOS name resolution. Открой доступ только из локальной сети 192.168.10.0/24:
sudo ufw allow from 192.168.10.0/24 to any port 445 proto tcp
sudo ufw allow from 192.168.10.0/24 to any port 139 proto tcp
sudo ufw allow from 192.168.10.0/24 to any port 137:138 proto udp
Подключение с Windows-клиента
На рабочей станции Windows открой проводник и введи путь до сервера: \\192.168.10.20\public или \\srv-fs01\public, если разрешение имён по DNS или NetBIOS настроено. Система запросит логин и пароль — используй учётные данные, заданные через smbpasswd, а не пароль от системной учётной записи Linux.
Если подключение не проходит, первым делом проверь версию протокола SMB на стороне Windows — начиная с определённых сборок Windows 10/11 клиент по умолчанию блокирует SMB1, что не проблема при уже настроенном server min protocol = SMB2, но может дать ошибку, если конфигурация Samba собрана из старого шаблона с более низким минимальным протоколом.
Корзина для случайно удалённых файлов
Пользователи Windows привыкли к корзине, а Samba по умолчанию удаляет файлы безвозвратно. Модуль recycle решает эту проблему на уровне общего ресурса:
[public]
path = /srv/samba/public
vfs objects = recycle
recycle:repository = .recycle/%U
recycle:keeptree = yes
recycle:versions = yes
recycle:touch = yes
recycle:maxsize = 0
recycle:repository = .recycle/%U создаёт отдельную скрытую подпапку корзины для каждого пользователя внутри самого ресурса — так проще понять, кто и что удалил. recycle:keeptree = yes сохраняет структуру вложенных папок внутри корзины, а не сваливает все файлы в одну кучу. Это не заменяет полноценное резервное копирование, но спасает от типичной ситуации «случайно удалил не ту папку» без обращения к бэкапам.
Мониторинг активных подключений
Полезно periodически смотреть, кто сейчас подключён к серверу и какие файлы держит открытыми — это пригодится, например, перед плановым обслуживанием, чтобы не оборвать чью-то незавершённую работу:
sudo smbstatus
Команда покажет список активных сессий с именами пользователей и IP-адресами, а также список заблокированных (открытых на запись) файлов — если нужно освободить файл перед обслуживанием, можно попросить конкретного пользователя закрыть документ или, в крайнем случае, принудительно завершить его сессию.
Ограничение доступа по IP-адресам
Если сервер физически доступен не только из офисной сети, но и, например, через VPN с гостевым доступом, стоит ограничить, откуда вообще можно подключаться к конкретному ресурсу, не полагаясь только на брандмауэр операционной системы. Samba умеет фильтровать подключения на уровне самого ресурса:
[accounting]
path = /srv/samba/accounting
hosts allow = 192.168.10.0/24
hosts deny = 0.0.0.0/0
hosts allow перечисляет разрешённые сети или адреса, а hosts deny = 0.0.0.0/0 закрывает всё остальное по умолчанию. Такая настройка дублирует защиту брандмауэра, но именно дублирование и снижает риск: если кто-то по ошибке откроет порт 445 наружу на уровне UFW, ограничение внутри smb.conf всё равно не пустит подключение с постороннего адреса.
Квоты на дисковое пространство
Без ограничений один пользователь, который решит скопировать на сервер архив с личными видео, способен забить весь диск и остановить работу остальных сотрудников. Квоты настраиваются на уровне файловой системы, а не самой Samba — для ext4 нужен пакет quota:
sudo apt install -y quota
sudo nano /etc/fstab
/dev/sdb1 /srv/samba ext4 defaults,usrquota,grpquota 0 2
После правки fstab перемонтируй раздел и включи квоты:
sudo mount -o remount /srv/samba
sudo quotacheck -cug /srv/samba
sudo quotaon /srv/samba
Задать лимит конкретному пользователю, например 20 ГБ мягкого ограничения и 25 ГБ жёсткого:
sudo setquota -u anna 20G 25G 0 0 /srv/samba
При мягком лимите пользователь получает предупреждение и льготный период, при жёстком — запись прекращается немедленно. Это особенно полезно на общем ресурсе public, куда пишут все сотрудники сразу и где без квот сложно быстро понять, кто именно занял всё свободное место.
Резервное копирование конфигурации и данных
Сама база пользователей Samba и конфигурация smb.conf — это то, что легко забыть включить в план бэкапов, сосредоточившись только на пользовательских файлах. Минимальный скрипт для регулярного архивирования конфигурации:
sudo tar czf /backup/samba-config_$(date +%F).tar.gz /etc/samba /var/lib/samba/private
Директория /var/lib/samba/private содержит базу учётных записей и связанные секреты — без неё после переустановки сервера пришлось бы заново создавать всех пользователей и заново раздавать им пароли, что при десятках сотрудников превращается в отдельный проект. Сами данные из /srv/samba копируются отдельным заданием, обычно с более частым расписанием, чем конфигурация, которая меняется редко.
Частые ошибки и как их избежать
- Пользователь создан в базе Samba, но забыт как системный пользователь Linux (или наоборот). Samba не может аутентифицировать учётную запись, если ей не соответствует системный пользователь — подключение будет падать с ошибкой доступа без внятного объяснения причины. Всегда создавай пару: сначала useradd, потом smbpasswd -a для того же имени.
- Права на уровне файловой системы конфликтуют с параметрами smb.conf. Даже при верных create mask и directory mask в smb.conf, если сама директория на диске имеет слишком узкие права или неверного владельца, доступ будет запрещён. Проверяй оба уровня разом: ls -la на сервере и фактическое поведение с клиента, не полагайся только на конфигурацию.
- Оставлен включённым устаревший протокол SMB1. Помимо уязвимостей, SMB1 ощутимо медленнее SMB2/SMB3 и не поддерживает многие современные функции вроде подписи трафика и шифрования на лету. Всегда явно указывай server min protocol = SMB2 в новых развёртываниях, даже если текущие клиенты вроде бы работают и без этого.
Что дальше
Эта настройка почти всегда идёт в связке с соседними задачами администрирования Linux: