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: