Настройка Samba сервера TurnKey File Server, подключение сетевой директории и монтирование в unprivileged LXC.

Комьюнити, привет.
Решил оставить данную записку на форуме в качестве инструкции для новичков, поэтому местами будет избыточно подробно.
К написанию текста сподвигла потребность в организации домашнего NAS на базе Samba сервера от TurnKey File Server.
Изначально всё было настроено по видео от товарища Stilicho2011, но хотелось чего-то большего, чем просто гостевая файловая шара без разгарничения доступов.

Краткое содержание:

  1. Настройка директории в Proxmox и монтирование в LXC с TurnKey File Server
  2. Настройка Turnkey FileServer
  3. Настройка подключения сетевой директории к клиентской машине на базе Proxmox c возможностью монтирования в unprivileged LXC контейнер

Версии ПО:
PVE 9.0.10
TurnKey File Server 18.0-1

Общая схема того, что будем реализовывать

→ Настройка директории в Proxmox и монтирование в LXC с TurnKey File Server
Исходим из того, что у вас уже подключен диск к гипервизору PVE и создан storage. В моём случае это жёсткий HDD_USB_1Tb смонтированный в качестве Directory, который я полностью отдал под нужды сетевого хранилища (NAS)

  1. Изменить владельца для директории в Proxmox
    chown 101000:101000 /mnt/HDD_USB_1Tb/
    где 101000:101000 - uid и gid соответствующий будущему пользователю samba 1000:1000 в LXC (uid_proxmox=uid_lxc+100000, gid_proxmox=gid_lxc+100000)

  2. Изменить права директории
    chmod 775 /mnt/HDD_USB_1Tb/
    где 775 - полный доступ для владельца и группы и режим чтения для всех остальных пользователей.

  3. Проверить
    ls -lh
    Пример вывода:

drwxrwxr-x 6 101000 101000 4.0K Oct 25 23:32 HDD_USB_1Tb
  1. Смонтировать директорию в LXC с NAS (выполнить в Proxmox)
    pct set ID_LXC -mp0 /mnt/HDD_USB_1Tb/,mp=/mnt/datasets/
    где:
    ID_LXC - ID вашего LXC TurnKey File Server
    -mp0 - точка монтирования (если к LXC уже примонтированы другие директории, то указывается любой свободный номер точки монтирования -mp1, -mp2, …)

→ Настройка Turnkey FileServer

  1. Создать группы gid в TurnKey File Server через интерфейс Webmin
    5.1 System → Users and Groups → Local Groups → Create a new group

    5.1.1 Group name → smb_write
    5.1.2 Group ID → 1000
    5.1.3 Create group in other modules → Yes
    5.1.4 Create

    5.2 Sysytem → Users and Groups → Local Groups → Create a new group
    5.2.1 Group name → smb_read
    5.2.2 Group ID → 1001
    5.2.3 Create group in other modules → Yes
    5.2.4 Create

На этом шаге мы создали две группы для последующего разграничения доступа: smb_write - здесь будут пользователи, которые смогут читать/писать, а smb_read соответстенно для пользователей, которые смогут только читать контент.

  1. Создать пользователей в LXC c TurnkeyFileserver через интерфейс Webmin
    >>Владелец директории (опционально)
    6.1 System → Users and Groups → Local Groups → Create a new user


    6.1.1 Username → samba
    6.1.2 User ID → 1000
    6.1.3 Shell → /usr/bin/nologin (отключение возможности авторизации под данным пользователем в LXC)
    6.1.4 Password → Normal password → ввести пароль для пользователя

    6.1.5 Primary group → smb_write
    6.1.6 Create home directory → No
    6.1.7 Copy template files to home directory → No
    6.1.8 Create user in other modules → Yes
    6.1.9 Create

    >>Пользователь с полномочиями на запись
    6.2 Sysytem → Users and Groups → Local Groups → Create a new user
    6.2.1 Username → user_write
    6.2.2 User ID → 1001
    6.2.3 Shell → /usr/bin/nologin (отключение возможности авторизации под данным пользователем в LXC)
    6.2.4 Password → Normal password → ввести пароль для пользователя

    6.2.5 Primary group → smb_write
    6.2.6 Create home directory → No
    6.2.7 Copy template files to home directory → No
    6.2.8 Create user in other modules → Yes
    6.2.9 Create

    >>Пользователь с полномочиями на чтение
    6.3 Sysytem → Users and Groups → Local Groups → Create a new user
    6.3.1 Username → user_read
    6.3.2 User ID → 1002
    6.3.3 Shell → /usr/bin/nologin (отключение возможности авторизации под данным пользователем в LXC)
    6.3.4 Password → Normal password → ввести пароль для пользователя

    6.3.5 Primary group → smb_read
    6.3.6 Create home directory → No
    6.3.7 Copy template files to home directory → No
    6.3.8 Create user in other modules → Yes
    6.3.9 Create

    Здесь мы создали технического пользователя samba, который будет владельцем сетевой папки, просто для красоты, можно обойтесь и без этого и назначить владельцем любого подходящего вам пользователя.
    Так же добавили двух пользователей и поместили их в группы, которым будут предоставлены разные права: пользователь user_write, состоящий в группе smb_write сможет читать/писать, а user_read, состоящий в группе smb_read сможет только читать контент.

  2. Создать директорию для сетевого доступа через интерфейс Webmin
    7.1 Tools → File Manager → перейти в /mnt/datasets → File → Create new directory


    7.2 New directory name → share

    7.3 Изменить владелца
    7.3.1 Правый клик по директории → Properties → Change ownership

    7.3.2 User name → samba
    7.3.3 Group name → smb_write
    7.3.4 Change

    7.4 Изменить разрешения
    7.4.1 Правый клик на директорию → Properties → Change permissions

    7.4.2 Mode → 2775

    где
    2 - это setgid, все новые файлы и подкаталоги, созданные внутри такого каталога, наследуют группу родительского каталога (для порядка и предупреждения возможных проблем)
    775 - полный доступ владельца samba (первый бит 7) и группы smb_write (второй бит 7), а для всех остальных пользователей только чтение (последний бит 5).

    Таким образом была создана директория с разрешениями 2775 для последующего предоставления к ней сетевого доступа.

  3. Настройка сетевого доступа через интерфейс Webmin
    8.1 Создание сетевого доступа для дирекории
    8.1.1 Servers → Samba Windows File Sharing → Create a new file share


    8.1.2 Share name → share
    8.1.3 Directory to share → /mnt/datasets/share
    8.1.4 Create with permissions → 775 (ни на что не влияет, т.к. разрешения на дирекотрию заданы на уровне файловой системы - п.7.3.2)
    8.1.5 Available? → Yes
    8.1.6 Browseable? → Yes
    8.1.7 Create

    8.2 Настройка доступа
    8.2.1 Servers → Samba Windows File Sharing → share → Other Share Options → Security and Access Control


    8.2.2 Writable? → No
    8.2.3 Guest Access? → No
    8.2.4 Valid groups → smb_write, smb_read
    8.2.5 Read/write groups → smb_write
    8.2.6 Save

    8.3 Настройка разрешений
    8.3.1 Servers → Samba Windows File Sharing → share → Other Share Options → File Permissions

    8.3.2 New Unix file mode → 666
    8.3.3 New Unix directory mode → 777
    8.3.4 Save

    8.4 Применение настроек
    8.4.1 Servers → Samba Windows File Sharing → Restart Samba Servers (внизу страницы)

Разбираемся, что здесь произошло.
Для директории share был настроен сетевой доступ:

  1. Только для зарегистрированных пользователей (samba, user_write, user_read).
  2. Только для пользователей из разрешённых групп (Valid groups → smb_write и smb_read)
  3. Чтение и запись только для пользователей, состоящих в группе smb_write → user_write, samba.
  4. Только чтение для всех остальных пользователей, состоящих в группе smb_read → user_read.
  5. Создаваемые в директории share файлы будут иметь разрешения 666, а папки 777.

Важно отметить, что существует вариативность методов разграничения доступов.
К примеру можно модифицировать настройки выше таким образом чтобы директории share были присовены права 2777, где последний бит 7 означает полный доступ для всех остальных пользователей (в нашем случае для user_read) и ограничение доступа происходит уже на уровне настроек samba сервера, а не файловой системы (как в случае с правами 2775).

Настройки для варианта с разрешениями 2777
  1. Создать директорию для сетевого доступа через интерфейс Webmin
    7.1 Tools → File Manager → перейти в /mnt/datasets → File → Create new directory
    7.2 New directory name → share
    7.3 Изменить разрешения
    7.3.1 Правый клик на директорию → Properties → Change permissions
    7.3.2 Mode → 2777
    где
    2 - это setgid, все новые файлы и подкаталоги, созданные внутри такого каталога, наследуют группу родительского каталога (для порядка и предупреждения возможных проблем)
    777 - полный доступ. Это важно для дальнейшей настройки разгарничения доступа (аналогично п.2 выше по тексту).
    7.3.3 Change
    7.4 Изменить владелца
    7.4.1 Правый клик на директорию → Properties → Change ownership
    7.4.2 User name → samba
    7.4.3 Group name → smb_write
    7.4.4 Change
    Была создана директория с разрешениями 2777 для последующего предоставления к ней сетевого доступа.

  2. Настройка сетевого доступа через интерфейс Webmin
    8.1 Создание сетевого доступа для дирекории
    8.1.1 Servers → Samba Windows File Sharing → Create a new file share
    8.1.2 Share name → share
    8.1.3 Directory to share → /mnt/datasets/share
    8.1.4 Create with permissions → 755 (ни на что не влияет, т.к. разрешения на дирекотрию заданы на уровне файловой системы - п.7.3.2, а права на чтение/запись разграничены между пользователями группами - п.8.2.5, 8.2.6)
    8.1.5 Available? → Yes
    8.1.6 Browseable? → Yes
    8.1.7 Create
    8.2 Настройка доступа
    8.2.1 Servers → Samba Windows File Sharing → share → Other Share Options → Security and Access Control
    8.2.2 Writable? → No
    8.2.3 Guest Access? → No
    8.2.4 Valid groups → smb_write, smb_read
    8.2.5 Read only groups → smb_read
    8.2.6 Read/write groups → smb_write
    8.2.7 Save
    8.3 Настройка разрешений
    8.3.1 Servers → Samba Windows File Sharing → share → Other Share Options → File Permissions
    8.3.2 New Unix file mode → 666
    8.3.3 New Unix directory mode → 777
    8.3.4 Save
    8.4 Применение настроек
    8.4.1 Servers → Samba Windows File Sharing → Restart Samba Servers (внизу страницы)

→ Настройка подключения сетевой директории к клиентской машине на базе Proxmox c возможностью монтирования в unprivileged LXC контейнер
Здесь приведу несколько модифицированный вариант моего комментария в соседней ветке
Справка:
Описанные действия предполагают:

  1. Доступ к сетевой папке share выполняется под пользователями user_write 1001 и user_read 1002.
  2. Команды монтирования к хосту Proxmox содержат uid=101001/101002 и gid=101000 с целью последующего корректного монтирования в непривилегированный LXC контейнер в Proxmox (uid_proxmox=uid_lxc+100000, gid_proxmox=gid_lxc+100000)
  3. Уточнение к параметрам file_mode (666) и dir_mode (777) в команде монтирования сетевого каталога к хосту Proxmox:
    При монтировании сетевой папки (cifs) через /etc/fstab, Linux не может “узнать” реальные права доступа (chmod) на удалённой стороне (т.е. на SAMBA-сервере), потому что протокол SMB не передаёт эту информацию напрямую. Поэтому ты указываешь вручную, какие права доступа отображать локально при монтировании файлов и каталогов, при этом реальные права на samba сервере могут отличаться и будут приоритетными.
  4. Выполнено монтирование для двух пользователей user_write и user_read с целью демонстриации разграничения прав доступа.

Команды:

  1. Создать директории на хосте:
    mkdir -p /mnt/pve/{share_write,share_read}

  2. Cоздать скрытый файл с авторизационными данными:
    2.1 nano /root/.smbcredentials_write:
    username=user_write
    password=user_write
    2.2 nano /root/.smbcredentials_read:
    username=user_read
    password=user_read

  3. Выставить строгие права:
    chmod 600 /root/.smbcredentials_write
    chmod 600 /root/.smbcredentials_read

  4. Добавить запись в /etc/fstab
    nano /etc/fstab
    Строки для добавления:

//IP_Samba_server/share /mnt/pve/share_write cifs credentials=/root/.smbcredentials_write,uid=101001,gid=101000,file_mode=0666,dir_mode=0777,nounix,noserverino 0 0
//IP_Samba_server/share /mnt/pve/share_read cifs credentials=/root/.smbcredentials_read,uid=101002,gid=101000,file_mode=0666,dir_mode=0777,nounix,noserverino 0 0

где:
//IP_Samba_server5/share - адрес сетевой директории на samba сервере
/mnt/pve/share_write - точка монтирования на хосте Proxmox под пользователем user_write
/mnt/pve/share_read - точка монтирования на хосте Proxmox под пользователем user_read
file_mode=0666 - все файлы на хосте Proxmox будут отображаться с правами rw-rw-rw-
dir_mode=0777 - все каталоги на хосте Proxmox будут отображаться с правами rwxrwxrwx

  1. Смонтировать
    mount -a

  2. Перезупустить службу (при необходимости):
    systemctl daemon-reload

  3. Предположим, что писать в сетевую папку будет какое-нибудь приложение, установленное в unprivileged LXC контейнер (например FileBrowser, qBittorrent, …).
    7.1 Для этого предварительно создадим в LXC деректории для монтирования по аналогии с хостом PVE:
    mkdir -p /mnt/pve/{share_write,share_read}
    7.2 Смонтируем сетевую папку с хоста в этот LXC контейнер:
    pct set ID_LXC -mp1 /mnt/pve/share_write,mp=/mnt/pve/share_write
    pct set ID_LXC -mp2 /mnt/pve/share_read,mp=/mnt/pve/share_read
    где:
    ID_LXC - ID вашего LXC с приложением
    -mp1, -mp2 - точки монтирования (если к LXC уже примонтированы другие директории, то указывается любой свободный номер точки монтирования -mp3, -mp4, …)

Теперь проверим возможность чтения и записи в примонтированных директориях share_write и share_read из LXC контейнера (в моём случае это приложение File Browser):

root@FileBrowser:~# touch /mnt/pve/share_write/write_lxc.txt
root@FileBrowser:~# mkdir /mnt/pve/share_write/write_lxc
root@FileBrowser:~# ls -lh /mnt/pve/share_write/
total 0
drwxrwxrwx 2 1001 1000 0 Oct 26 10:48 write_lxc
-rw-rw-rw- 1 1001 1000 0 Oct 26 10:48 write_lxc.txt
root@FileBrowser:~# touch /mnt/pve/share_read/read_lxc.txt
touch: cannot touch '/mnt/pve/share_read/read_lxc.txt': Permission denied
root@FileBrowser:~# ls -lh /mnt/pve/share_read/
total 0
drwxrwxrwx 2 1002 1001 0 Oct 26 10:48 write_lxc
-rw-rw-rw- 1 1002 1001 0 Oct 26 10:48 write_lxc.txt


Как и ожидалось, user_write смог создать директорию и файл, а user_read может только читать.

Аналогичные действия из веб-интерфейса File Browser



Итоговый результат можно посмотреть в панеле Webmin на samba сервере:

Описанный выше пример может быть адаптирован под ваши задачи и иметь иной набор пользователей, групп, их идентификаторов (uid, gid), разрешений, струкуры директорий.
В качестве рекомендации не пренебрегайте перезагрузкой samba сервера после внесения изменений в конфигурацию.
Надеюсь мой опыт поможет сэкономить время таким же первопроходцам.

8 лайков

В контексте статьи предлагаю улучшенную команду для монтирования через /etc/fstab:

IP_Samba_server/share /mnt/pve/share_write cifs credentials=/root/.smbcredentials,uid=101000,gid=101000,file_mode=0664,dir_mode=0775,vers=3.1.1,nounix,noserverino,_netdev,x-systemd.automount 0 0

где:
//IP_Samba_server/share - адрес сетевой директории на samba сервере
/mnt/pve/share - точка монтирования на хосте Proxmox
file_mode=0664 - все файлы на хосте Proxmox будут отображаться с правами rw-rw-r–
dir_mode=0775 - все каталоги на хосте Proxmox будут отображаться с правами rwxrwxr-x
vers=3.1.1 - используется самая актуальная версии SMB протокола 3.1.1
nounix - отключение поддержки UNIX-расширений SMB (chmod, chown, chgrp,uid/gid/mode, и т.д.), клиент работает как обычный Windows-клиент.
noserverino - отключение использования inode-номеров (клиент генерирует собственные inode-номера локально). Нужно для предотвращения ошибок при работе с файлами.
_netdev - Systemd подождёт поднятия сети перед монтированием
x-systemd.automount - Точка монтируется по первому обращению, не блокируя загрузку системы
0 0 - не проверять fsck, не включать в dump

1 лайк