# Создание файлового сервера при помощи Samba на Ubuntu

Создание файлообменника — одна из базовых задач при администрировании внутренних сетей предприятия. Частично эту задачу можно решить при помощи открытия доступа пользователям к каким-либо отдельным папкам на сервере, но лучше и правильнее создавать отдельный сервер, предназначенный для хранения и обмена файлами.

В этой инструкции мы установим Samba — стандартный сервис для создания файлообменника в Linux — на подготовленный к работе сервер под управлением Ubuntu, создадим нескольких пользователей, которым будет открыт доступ к файлообменнику, и добавим администратора с правами доступа во все папки.

# Установка Samba

Устанавливать Samba будем из стандартных репозиториев apt:

sudo apt update

sudo apt install samba

Сразу после установки автоматически запускается не только Samba (smbd), но и идущий в комплекте установки Samba NetBIOS server (nmbd). Он нужен для организации связи с Windows-машинами, поэтому на данном этапе нам не нужен — отключим его:

sudo systemctl stop nmbd.service

sudo systemctl disable nmbd.service

Проверим статус Samba:

sudo systemctl status smbd

# Output

 smbd.service - Samba SMB Daemon
     Loaded: loaded (/lib/systemd/system/smbd.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-04-19 11:51:11 +05; 4h 1min ago
       Docs: man:smbd(8)
             man:samba(7)
             man:smb.conf(5)

Samba установлена и запущена. Можем переходить к настройке и запуску сервиса!

# Настройка Samba

Создадим его резервную копию основного файла настроек:

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.orig

После этого можем переходить непосредственно к настройке файлового сервера. Сначала проверим, какие для нашего сервера доступны сетевые интерфейсы:

ip list

# Output

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default
    link/void
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
    link/ether 02:42:a2:78:1c:13 brd ff:ff:ff:ff:ff:ff

В нашем случае три сетевых интерфейса:

  1. Стандартный lo, отвечающий за обратную связь с внутренней сетью.

  2. venet0 — основной интерфейс для подключения к внешней сети.

  3. docker0 — интерфейс, используемый Docker, в данном случае он нам не интересен.

Откроем конфигурационный файл Samba:

sudo vim /etc/samba/smb.conf

В основной части конфигурационного файла — в разделе [global] — много настроек и закомментированных строк, поясняющих их назначение. Нам нужно проконтролировать значения в следующих строках:

[global]
        server string = samba.example.com
        server role = standalone server
        interfaces = lo venet0
        bind interfaces only = yes
        disable netbios = yes
        smb ports = 445
        log file = /var/log/samba/smb.log
        max log size = 10000

Здесь указаны следующие значения:

  • server_string — имя сервера, которое будет ему присвоено. Здесь мы выбрали такое же, как у нашего домена example.com, на котором мы будем его запускать;
  • server role — роль сервера в сети, в данном случае параметр standalone server означает, что это файловый сервер;
  • interfaces — в этой строке указываем оба сетевых интерфейса (интерфейс обратной связи и основной сетевой);
  • bind interfaces only — параметр, запрещающий подключаться к нашему серверу через другие сетевые интерфейсы;
  • disable netbios — отключает все интерфейсы NetBIOS;
  • smb ports — в этой строке можно указать порт, на котором будет работать Samba, по умолчанию это порт 445 (Samba будет работать на нём, даже если его не указывать здесь);
  • log file — адрес к логу Samba;
  • max log size — максимальный размер лога в байтах.

После сохранения сделанных изменений проверим, что конфигурация нашего файла правильная:

testparm

# Output

Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Weak crypto is allowed
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

…

После этого можно будет нажать Enter, чтобы посмотреть заданные параметры сервера:

#Output

# Global parameters
[global]
        bind interfaces only = Yes
        interfaces = venet0 lo
        log file = /var/log/samba/smb.log %n
        logging = file

Добавим Samba в список исключений фаервола, если он у вас включён:

sudo ufw allow 445

Теперь файловый сервер готов к старту, осталось только добавить пользователей.

# Добавление пользователей на сервер

Мы добавим на сервер двух новых пользователей, для простоты назовём их user1 и user2, и пользователя admin. Для пользователей user1 и user2 создадим отдельные папки на сервере, к которым они будут иметь доступ, и одну общую папку для них. Пользователь admin будет иметь доступ ко всем трём папкам.

Сначала создадим отдельную папку, где у нас будет файлообменник, и обозначим её как папку файлообменника:

sudo mkdir /samba/

sudo chown :sambashare /samba/

Теперь создадим папку для первого пользователя:

sudo mkdir /samba/user1

После этого добавим пользователя user1 в качестве системного пользователя, но запретим ему подключение к серверу по SSH и не будем создавать для него домашнюю директорию — он будет пользоваться исключительно только что созданной папкой:

sudo adduser --home /samba/user1 --no-create-home --shell /usr/sbin/nologin --ingroup sambashare user1

После создания пользователя передадим ему все права на его папку:

sudo chown user1:sambashare /samba/user1/
sudo chmod 2770 /samba/user1/

Значение прав 2770 означает, что создаваемые внутри папки файлы будут получать те же права, что и сама папка.

Теперь осталось добавить пользователя user1 в базу данных Samba и активировать его. В Samba есть своя база данных с пользователями и паролями, куда мы и будем добавлять нашего нового пользователя:

sudo smbpasswd -a user1
sudo smbpasswd -e user1

Флаг -a добавляет пользователя к базе данных Samba, а флаг -e активирует его.

После этого нужно проделать такие же операции для пользователя user2.

Когда оба пользователя будут добавлены к серверу Samba, можно переходить к добавлению администратора сервера. Для администратора нужно будет проделать те же операции — основные различия в правах мы зададим чуть позже, на стадии описания папок:

sudo mkdir /samba/everyone
sudo adduser --home /samba/everyone --no-create-home --shell /usr/sbin/nologin --ingroup sambashare admin
sudo chown admin:sambashare /samba/everyone/
sudo chmod 2770 /samba/everyone/
sudo smbpasswd -a admin
sudo smbpasswd -e admin

Также создадим группу пользователей администраторы, у которых будет доступ ко всем файлам и папкам на сервере — группой и её членами управлять гораздо проще, чем прописывать каждому новому администратору доступ к каждой из папок вручную:.

sudo groupadd admins
sudo usermod -G admins admin

Первой командой мы создали группу admins, второй — добавили в неё нашего пользователя admin.

# Настройка доступа к папкам

Права на доступ к папкам настраиваются в основном конфигурационном файле Samba:

sudo vim /etc/samba/smb.conf

В открывшийся текстовый файл в самом конце нужно добавить описание директорий и пользователей, у которых есть право доступа к ним:

[user1]
        path = /samba/user1
        browseable = no
        read only = no
        force create mode = 0660
        force directory mode = 2770
        valid users = user1 @admins

Здесь:

  • [user1] — общее имя описываемой файловой шары;
  • path — путь к директории, куда открывается доступ;
  • browseable — разрешение другим пользователям видеть содержимое этой папки (параметр no означает, что другие пользователи смогут видеть только само наличие этой папки, но не будут видеть, что находится внутри);
  • read only — указание на то, могут ли пользователи, у которых есть доступ к этой папке, только читать файлы, находящиеся здесь, или могут создавать здесь новые;
  • force create mode — какие права устанавливаются создаваемым файлам;
  • force directory mode — какие права устанавливаются создаваемым вложенным папкам;
  • valid users — имена пользователей, имеющих доступ к папке (в нашем случае это сам пользователь user1 и все пользователи из группы admins).

Делаем то же самое для директории для пользователя user2 и переходим к настройке общей папки:

[everyone]
        path = /samba/everyone
        browseable = yes
        read only = no
        force create mode = 0660
        force directory mode = 2770
        valid users = @sambashare @admins

Единственным отличием помимо параметра path в данном случае будет группа пользователей, имеющих доступ к папке. В строке valid users мы указываем всех пользователей из группы sambashare и группы admins. Это общая папка, куда сможет зайти каждый, имеющий доступ к серверу.

После сохранения конфигурационного файла снова запустим тест настроек:

testparm

# Output

Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Weak crypto is allowed
Server role: ROLE_STANDALONE
…

Всё в порядке, в конфигурационном файле нет ошибок — можно пробовать подключение к серверу.

# Samba-клиент

Чтобы подключиться к серверу с файлообменником, нам нужен будет клиент. Скачаем его — он стандартный:

sudo apt install samba-client

После установки клиента можно сразу же попробовать подключиться к нашему файловому серверу:

smbclient //samba.example.com/user1 -U user1

Нас попросят указать пароль для доступа, и после этого значок в командной строке сменится на smb: \>. Это будет означать, что мы находимся в интерфейсе управления файлами и папками нашей файловой шары.

Проверим, как она работает — создадим папку и посмотрим список доступных:

mkdir first
ls

# Output
 .                                   D        0  Tue Apr  19 11:21:37 2022
  ..                                  D        0  Tue Apr  19 11:31:51 2022
 first                                D        0  Wed Apr  20 10:44:14 2022

Мы успешно создали папку на нашем файлообменнике.