В этой статье я покажу процесс установки и настройки простого файлового сервера Samba на сервере Debian 12.
Что такое samba
Samba — пакет программ с открытым исходным кодом, реализующий клиент-серверный доступ к файлам и принтерам по протоколу SMB/CIFS в системах Unix. Он позволяет обслуживать межплатформенные запросы клиентов Microsoft Windows, OS X и других систем Unix.
Помимо автономного сервера Samba может выполнять функции контроллера домена или интегрироваться в качестве сервера в домены NT4 и области Active Directory. Для использования в домене NT4 или области Active Directory вам также потребуется пакет winbind.
Клиенту на Linux для подключения к серверу samba может понадобится пакет smbclient. А для монтирования удаленных файловых систем пакет cifs-utils.
Samba — является свободным программным обеспечением выпущенным под лицензией GPL. А проект Samba является участником организации Software Freedom Conservancy.
Установка samba
Выполним установку samba из стандартных репозиториев:
# apt install -y samba
Создадим два каталога, которые в дальнейшем будем использовать как общие ресурсы Samba:
- /shares/private — каталог с доступом по паролю;
- /shares/share — каталог с гостевым досупом.
# mkdir -p /shares/private # mkdir -p /shares/share # adduser smb-admin # chown smb-admin:smb-admin /shares/private/ # chmod 770 /shares/private/ # chown smb-admin:smb-admin /shares/share/ # chmod 777 /shares/share/
В моём случае установилась samba версии 4.17.12:
# smbstatus -V Version 4.17.12-Debian
Настройка samba
Создадим резервную копию конфига:
# mv /etc/samba/smb.conf /etc/samba/smb.conf.orig
И создадим новый конфиг:
# nano /etc/samba/smb.conf [global] log file = /var/log/samba/log.%m map to guest = Bad User max log size = 1000 security = USER server role = standalone server [share] comment = Общая папка create mask = 0666 directory mask = 0777 force directory mode = 0777 guest ok = Yes path = /shares/share read only = No [private] comment = Приватная папка create mask = 0600 directory mask = 0700 path = /shares/private read only = No valid users = smb-admin
Разбираем конфиг
Разберём приведённый выше конфиг, который состоит из нескольких секций.
Первая и основная секция это — [global]. В ней находятся параметры влияющие на весть сервер и на все общедоступные ресурсы.
Секции [share] и [private] — это секции для общедоступных каталогов. При этом в каталог share я реализовал гостевой вход, а в каталог private — доступ по паролю.
Секция [global]
Разберём параметры из секции [global]:
- log file — указываем путь к лог-файлу. В примере выше, с помощью переменной %m, я для каждого клиента создаю свой лог-файл. Переменная %m означает имя NetBIOS клиента.
- map to guest — указываем когда пользователю будет предоставляться гостевой доступ. Возможные варианты: never — никогда, bad user — когда такого пользователя не существует, bad password — когда пароль введен неверно.
- max log size — максимальное количество строк в лог-файлах.
- security — клиенты, основываясь на этом параметре, определяют нужно ли (и если да то как) передавать серверу имя пользователя и пароль. Возможные варианты:
- auto — параметр настраивается автоматически в зависимости от роли сервера;
- user — клиент должен сначала произвести вход, с существующим именем пользователя и паролем;
- domain — переданные логин и пароль будут проверятся на контроллере домена;
- ads — в этом режиме сервер Samba будет действовать как член домена. Для работы в этом режиме нужно использовать Kerberos.
- server role — указываем роль сервера. Возможные варианты: standalone server — автономный сервер (сервер рабочих групп), member server — участник домена, domain controller — контроллер домена.
Секции [share] и [private]
Разберём параметры общедоступных ресурсов:
- comment — комментарий который будет виден при наведении мышкой в windows на общем каталоге.
- create mask — максимальные права при создании файла, но с некоторыми ограничениями. Выполнять файлы может только владелец. Поэтому здесь нельзя указать например такие права: 777, 776, 711. То есть указать можно, но в любом случае группа и все остальные будут урезаться чтобы не получить доступ на исполнение. Здесь я урезаю владельца в правах, чтобы он тоже не мог запускать исполняемые файлы. Но если нам всё же нужно назначить группе и владельцу право на исполнение, то это делается с помощью дополнительного параметра:
- create mask = 0776 — максимальные права;
- force create mode = 0776 — увеличиваем права группы до максимальных.
- Если вы не помните как задаются права к файлам и каталогам, то об это я писал здесь.
- directory mask — максимальные права для каталога. Но писать может только владелец, то есть 755.
Если мы хотим группе и всем остальным разрешить запись в этот каталог, то это делается с помощью дополнительного параметра:- directory mask = 0777;
- force directory mode = 0777.
- guest ok — разрешаем гостевой доступ. Для ресурса [share] этот параметр равен Yes. А для ресурса [private] мы не задаём этот параметр, так как по умолчанию гостевой доступ выключен.
- path — задаём путь к каталогу.
- read only — по умолчанию наши ресурсы будут доступны только для чтения. Чтобы это изменить указываем здесь No.
- valid users — перечисляем пользователей у которых будет доступ к ресурсу. Пользователей можно перечислить через запятую: valid users = smb-admin, user1, user2. В нашем примере этот параметр есть только в ресурсе [private].
Дополнительные действия
Проверим конфигурацию с помощью команды testparm.
- Если команда выдаст что-то вроде такого, значит конфигурация в порядке:
# testparm Load smb config files from /etc/samba/smb.conf Loaded services file OK. Weak crypto is allowed by GnuTLS (e.g. NTLM as a compatibility fallback) Server role: ROLE_STANDALONE Press enter to see a dump of your service definitions ...
- А если вывод команды testparm подобный этому, значит в конфиге есть ошибки:
# testparm Load smb config files from /etc/samba/smb.conf set_variable_helper(udh): value is not boolean! Error loading services.
Если конфиг верный, то перезапускаем службу samba:
# systemctl restart smb
И проверим статус службы:
# systemctl status smb ● smbd.service - Samba SMB Daemon Loaded: loaded (/lib/systemd/system/smbd.service; enabled; preset: enabled) Active: active (running) since Mon 2023-12-18 10:42:16 MSK; 10s ago Docs: man:smbd(8) man:samba(7) man:smb.conf(5) Process: 1971 ExecCondition=/usr/share/samba/is-configured smb (code=exited, status=0/SUCCESS) Process: 1973 ExecStartPre=/usr/share/samba/update-apparmor-samba-profile (code=exited, status=0/SUCCESS) Main PID: 1982 (smbd) Status: "smbd: ready to serve connections..." Tasks: 3 (limit: 2306) Memory: 5.3M CPU: 133ms CGroup: /system.slice/smbd.service ├─1982 /usr/sbin/smbd --foreground --no-process-group ├─1984 /usr/sbin/smbd --foreground --no-process-group └─1985 /usr/sbin/smbd --foreground --no-process-group
Теперь нужно привязать пользователя smb-admin к samba:
# smbpasswd -a smb-admin New SMB password: Retype new SMB password: Added user smb-admin.
Проверяем работу
Пробуем получить доступ к общим ресурсам сервера Samba с компьютера под управлением ОС Windows:
- В каталог share должно пускать, не требуя логин или пароль. Здесь используется гостевая учётка.
- Для доступа к private придётся ввести логин (smb-admin) и его пароль:
Дополнительные параметры
- available = No / Yes. Выключить или включить общий ресурс. По умолчанию применяется значение Yes.
- browsable = No / Yes. Сделать общий ресурс невидимым, то есть он не будет отображаться в файловых менеджерах. Но этот ресурс будет доступен, и войти в него можно будет по полному пути. По умолчанию применяется значение Yes.
- comment = «строка». Комментарий для общего ресурса. Windows проводник показывает этот комментарий при наведении мышкой на общий каталог.
- hide dot files = No / Yes. Скрывать файлы начинающиеся с точки. Файлы, начинающиеся с точки, остаются доступными, но становятся скрытыми. По умолчанию применяется значение Yes.
- hide files = «строка». Вы можете задать, с помощью регулярного выражения, шаблон файлов, которые должны стать скрытыми. Например hide files = ./*.so — файлы с расширением .so станут скрытыми.
- hide special files = No / Yes. Скрыть специальные файлы, такие как сокеты или устройства. По умолчанию применяется значение No.
- hide unreadable = No / Yes. Скрыть те файлы, к которым у клиента нет доступа на чтение. По умолчанию применяется значение No.
- hosts allow = 192.168.0.0/24, 192.168.1.0/24. Вы можете указать список подсетей или отдельных ip-адресов, которым можно подключаться к серверу.
- hosts deny = 192.168.0.100. Противоположный параметр hosts allow. При этом hosts allow имеет больший приоритет. То есть вы можете запретить все соединения hosts deny = 0.0.0.0/0, и разрешить некоторые.
- max connections = число. Указать максимальное число подключений к серверу. По умолчанию max connections = 0, что означает без ограничения.
- force user = имя_пользователя. Задать пользователя, под которым фактически будет вестись запись. Например вы авторизованы как «alex», что позволяет вам писать в каталог средствами Samba. А при записи будет использоваться пользователь «max». При этом пользователь «max» должен иметь права на файловой системе для записи файла.
VFS объекты
Функциональность сервера Samba можно расширять специальными модулями, их называют VFS объектами. Посмотреть список таких модулей и что они делают можете здесь.
Ниже я покажу настройку двух модулей:
- full_audit — записывает выполняемые операции клиента. То есть позволяет выполнять логирование, кто какие операции с файлами производит на сервере. Поможет вам найти виновника, который удалил какой-нибудь нужный файл.
- recycle — перемещает удаляемые файлы во временную директорию, а не удаляет их немедленно.
Настройка аудита
Чтобы добавить какой-нибудь VFS объект к samba, его нужно прописать в конфигурационном файле /etc/samba/smb.conf в параметре vfs objects в следующем виде:
vfs objects = <1-объект> <2-объект> ...
Так как я делаю аудит для всех общих ресурсов, то я добавляю этот параметр в секцию [global]. А ниже пропишем какие операции следует логировать:
vfs objects = full_audit full_audit:success = connect, unlinkat, write, connectpath, renameat full_audit:failure = connect, unlinkat, write, connectpath, renameat
Я перечислил следующие операции:
- connect — подключение (например открыли общий каталог);
- unlinkat — удаление файлов или каталогов;
- write — редактирование файлов или каталогов (по факту не видел появление этой операции, поэтому можно не использовать);
- connectpath — подключение к определённому ресурсу (так как write у меня не работал, я стал ловить любые коннекты к файлам, чтобы видеть кто этот файл открывал);
- renameat — переименовывание файлов или каталогов.
После редактирования конфига перезапустим службу:
# systemctl restart smbd.service
События о любые перечисленных операциях будут идти в журнал. Посмотреть его вы можете с помощью утилиты journalctl. Я ниже приведу две команды. Первая выводит все события к текущему моменту. Вторая выводит 10 последних событий и ждёт появления следующих (как tail -f):
# journalctl -t smbd_audit # journalctl -t smbd_audit -f
Посмотреть список всех возможных операций можно здесь. Но описания по каждой операции я не нашёл. Если всё же у кого-нибудь есть такое описание, поделитесь ссылкой в комментариях здесь или в VK. Кстати большинство инструкций используют старое написание операций, и на современной Samba они работать не будут.
Создание корзины
Вы уже знаете как добавлять vfs объекты, поэтому сразу в конфиг добавим ещё один объект — recycle (напоминаю, я добавляю их в секцию [global]):
# nano /etc/samba/smb.conf vfs objects = full_audit recycle
Ниже, в этом же файле, и в этой же секции, добавим ещё два параметра относящиеся к корзине:
recycle:versions = Yes recycle:keeptree = Yes
- recycle:versions — отвечает за версионность, это полезно если вы удаляете файл, а в корзине уже есть файл с этим именем;
- recycle:keeptree — если вы удаляете каталог, а в нём есть ещё каталоги, то этот параметр сохранит в корзине верное дерево каталогов.
Затем в этом же файле, но уже в секциях для общих ресурсов нужно прописать путь к корзине:
[share] *** Другие параметры*** recycle:repository = /shares/share/.trash [private] *** Другие параметры*** recycle:repository = /shares/private/.trash
После проделанного перезапустите сервис smbd и можете проверять работу корзины:
# systemctl restart smbd.service
Итог
Samba — достаточно сложный продукт, но им можно научиться пользоваться. В статье я продемонстрировал как создать приватный и общий ресурс. Показал различные опции, которые дополнительно можно применять для настройки общих каталогов. А также познакомил вас с VFS объектами, настроил с их помощью аудит и корзину.