Установка и настройка файлового сервера Samba на CentOS 8

Thank you for reading this post, don't forget to subscribe!

Samba поз­во­ля­ет настро­ить фай­ло­вое хра­ни­ли­ще раз­лич­ных мас­шта­бов — от малых офи­сов для круп­ных орга­ни­за­ций. В дан­ной инструк­ции мы рас­смот­рим про­цесс настрой­ки фай­ло­во­го сер­ве­ра. Сна­ча­ла мы выпол­ним уста­нов­ку и базо­вую настрой­ку с предо­став­ле­ни­ем госте­во­го досту­па. После будет при­ве­де­ны при­ме­ры раз­гра­ни­че­ния досту­па по поль­зо­ва­те­лям, груп­пам и поль­зо­ва­те­лям Active Directory.

Подготовка сервера

1. Время

Для кор­рект­но­го отоб­ра­же­ния дат, необ­хо­ди­мо поза­бо­тить­ся о син­хро­ни­за­ции вре­ме­ни. Для это­го будем исполь­зо­вать демон chrony. Уста­но­вим его:

dnf install chrony

Раз­ре­шим авто­за­пуск и стар­та­нем сервис:

systemctl enable chronyd

systemctl start chronyd

2. Брандмауэр

По умол­ча­нию, в систе­мах CentOS бранд­мау­эр запре­ща­ет все соеди­не­ния. Необ­хо­ди­мо раз­ре­шить сер­вис samba. Выпол­ня­ем команду:

firewall-cmd --permanent --add-service=samba

При­ме­ня­ем настройки:

firewall-cmd --reload

3. SELinux

Систе­ма без­опас­но­сти SELinux будет бло­ки­ро­вать все попыт­ки под­клю­чить­ся к уда­лен­ной пап­ке. Необ­хо­ди­мо создать поли­ти­ку для ката­ло­га, в кото­ром будут нахо­дить­ся общие пап­ки. Для это­го уста­нав­ли­ва­ем паке­ты для управ­ле­ния политиками:

dnf install policycoreutils setroubleshoot

Теперь созда­ем само пра­ви­ло. Напри­мер, если мы пла­ни­ру­ем исполь­зо­вать ката­лог /data, то вво­дим команды:

mkdir /data

* на слу­чай, если ката­ло­га еще нет, созда­ем его.

semanage fcontext -a -t samba_share_t "/data(/.*)?"

restorecon -R -v /data

Или мож­но про­сто отклю­чить SELinux.

Установка и запуск Samba

Уста­нов­ка выпол­ня­ет­ся из репо­зи­то­рия одной командой:

dnf install samba

Раз­ре­ша­ем авто­старт сер­ви­са и запус­ка­ем его:

systemctl enable smb --now

И про­ве­рим, что сер­вис запустился:

systemctl status smb

Про­ве­ря­ем, что сер­вер сам­ба поз­во­ля­ет к себе под­клю­чить­ся. Для это­го мож­но с ком­пью­те­ра обра­тить­ся к сер­ве­ру по SMB, напри­мер, на ком­пью­те­ре с Windows это мож­но сде­лать из про­вод­ни­ка, про­пи­сав путь к сер­ве­ру с двух слэшей:

* в дан­ном при­ме­ре мы под­клю­ча­ем­ся к сер­ве­ру Samba с IP-адре­сом 192.168.1.15.

Если мы настро­и­ли сер­вер пра­виль­но, систе­ма долж­на запро­сить пароль на под­клю­че­ние к Samba. Отка­зы­ва­ем­ся его вво­дить. На дан­ном эта­пе про­вер­ка закончена.

Создание первой шары и предоставление к ней гостевого доступа (анонимного)

Раз­бе­рем самый про­стой при­мер предо­став­ле­ния досту­па к пап­ке — ано­ним­ный доступ всем поль­зо­ва­те­лям без запро­са пароля.

Откры­ва­ем на редак­ти­ро­ва­ние кон­фи­гу­ра­ци­он­ный файл samba:

vi /etc/samba/smb.conf

В сек­цию [global] добавляем:


map to guest = Bad Password

И добав­ля­ем настрой­ку для общей папки:

[Общая пап­ка]
comment = Public Folder
path = /data/public
public = yes
writable = yes
read only = no
guest ok = yes
create mask = 0777
directory mask = 0777
force create mode = 0777
force directory mode = 0777

* где: 

  • [Общая пап­ка] — имя общей пап­ки, кото­рое уви­дят поль­зо­ва­те­ли, под­клю­чив­шись к серверу.
  • comment — свой ком­мен­та­рий для удобства.
  • path — путь на сер­ве­ре, где будут хра­нить­ся данные.
  • public — для обще­го досту­па. Уста­но­ви­те в yes, если хоти­те, что­бы все мог­ли рабо­тать с ресурсом.
  • writable — раз­ре­ша­ет запись в сете­вую папку.
  • read only — толь­ко для чте­ния. Уста­но­ви­те no, если у поль­зо­ва­те­лей долж­на быть воз­мож­ность созда­вать пап­ки и файлы.
  • guest ok — раз­ре­ша­ет доступ к пап­ке госте­вой учет­ной записи.
  • create mask, directory mask, force create mode, force directory mode — при созда­нии новой пап­ки или фай­ла назна­ча­ют­ся ука­зан­ные пра­ва. В нашем при­ме­ре пра­ва будут полные.

Созда­ем ката­лог на сер­ве­ре и назна­чим права:

mkdir -p /data/public

chmod 777 /data/public

При­ме­ня­ем настрой­ки samba, пере­за­гру­зив сервис:

systemctl restart smb

Про­бу­ем под­клю­чить­ся к пап­ке. Мы долж­ны зай­ти в нее без необ­хо­ди­мо­сти вво­да логи­на и пароля.

Доступ к папке по логину и паролю

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

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

vi /etc/samba/smb.conf

Добав­ля­ем настрой­ку для новой папки:

[Пап­ка сотрудников]
comment = Staff Folder
path = /data/staff
public = no
writable = yes
read only = no
guest ok = no
create mask = 0777
directory mask = 0777
force create mode = 0777
force directory mode = 0777

* эти настрой­ки, во мно­гом, похо­жи на те, что исполь­зо­ва­лись в при­ме­ре выше. Вот основ­ные различия:

  • path = /data/staff — исполь­зу­ем новый путь до папки.
  • public = no — запре­ща­ем пуб­лич­ный доступ.
  • guest ok = no — не раз­ре­ша­ем госте­вое подключение.

Созда­ем ката­лог для новой папки:

mkdir /data/staff

Зада­ем пра­ва на создан­ный каталог:

chmod 777 /data/staff

Созда­ем поль­зо­ва­те­ля в систе­ме Linux:

useradd staff1

* где staff1 — имя пользователя.

Зада­ем пароль для пользователя:

passwd staff1

Теперь созда­дим поль­зо­ва­те­ля в samba:

smbpasswd -a staff1

Пере­за­пус­ка­ем samba:

systemctl restart smb

Про­бу­ем зай­ти на сер­вер — общую пап­ку мы долж­ны открыть без авто­ри­за­ции, а при попыт­ке открыть пап­ку сотруд­ни­ков долж­но появить­ся окно вво­да логи­на и пароля.

Если мы авто­ри­зо­ва­ны на ком­пью­те­ре, с кото­ро­го пыта­ем­ся под­клю­чить­ся к сер­ве­ру, под той же учет­ной запи­сью, что созда­ли для досту­па к пап­ке, samba может и не потре­бо­вать аутентификации.

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

Теперь созда­дим пап­ку, доступ к кото­рой будут иметь огра­ни­чен­ное коли­че­ство пользователей.

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

vi /etc/samba/smb.conf

Добав­ля­ем настрой­ку для новой папки:

[При­ват­ная папка]
comment = Private Folder
path = /data/private
public = no
writable = no
read only = yes
guest ok = no
valid users = admin, staff2, staff3, @privateusers
write list = admin, staff2
create mask = 0777
directory mask = 0777
force create mode = 0777
force directory mode = 0777
inherit owner = yes

* сто­ит обра­тить вни­ма­ние на сле­ду­ю­щие настройки:

  • path = /data/private — исполь­зу­ем новый путь до папки.
  • writable = no и read only = yes — в дан­ном при­ме­ре мы раз­ре­шим запись в ката­лог толь­ко неко­то­рым поль­зо­ва­те­лям. Поэто­му общие настрой­ки, раз­ре­ша­ю­щие запись в пап­ку, долж­ны быть запрещены.
  • valid users — спи­сок поль­зо­ва­те­лей, кото­рым раз­ре­ше­но под­клю­чать­ся к ката­ло­гу. В дан­ном при­ме­ре раз­ре­ше­ния рабо­та­ют для поль­зо­ва­те­лей adminstaff2 и staff3, а так­же для всех, кто вхо­дим в груп­пу privateusers.
  • write list — спи­сок поль­зо­ва­те­лей, кото­рые име­ют доступ к пап­ке на чте­ние и запись. В дан­ном при­ме­ре мы раз­ре­ша­ем это толь­ко для поль­зо­ва­те­лей admin и staff2.
  • inherit owner — опция поз­во­ля­ем вклю­чить насле­до­ва­ние вла­дель­ца при созда­нии папок и файлов.

* если мы хотим, что­бы доступ к ката­ло­гу был пол­ный у опре­де­лен­ных поль­зо­ва­те­лей (без раз­де­ле­ния на тех, кто может толь­ко читать и тех, кто может так­же писать в пап­ку), то опцию write list мож­но не ука­зы­вать, а опции writable и read only оста­вить как в при­ме­рах выше.

Созда­ем ката­лог для новой папки:

mkdir /data/private

Зада­ем пра­ва на создан­ный каталог:

chmod 777 /data/private

Для при­ме­не­ния настро­ек пере­за­пус­ка­ем samba:

systemctl restart smb

Про­ве­ря­ем воз­мож­ность рабо­ты с новым каталогом.

Авторизация с Active Directory

Раз­бе­рем при­мер кон­фи­гу­ри­ро­ва­ния фай­ло­во­го сер­ве­ра samba в домене Windows и настро­им авто­ри­за­цию поль­зо­ва­те­лей на базе LDAP Active Directory.

Подключение к Active Directory

Вве­дем наш сер­вер в домен. Сна­ча­ла необ­хо­ди­мо убе­дить­ся, что сер­вер досту­пен по сво­е­му домен­но­му име­ни. Если сер­ве­ру так и не было зада­но вме­ня­е­мо­го име­ни, вво­дим команду:

hostnamectl set-hostname samba.test.local

* где samba — имя сер­ве­ра; test.local — домен.

После добав­ля­ем в DNS наш сер­вер samba. Ждем минут 15, если у нас исполь­зу­ет­ся домен­ная инфра­струк­ту­ра с несколь­ки­ми сайтами.

Уста­нав­ли­ва­ем необ­хо­ди­мые компоненты:

dnf install samba-client samba-winbind samba-winbind-clients krb5-workstation

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

vi /etc/samba/smb.conf

В раз­де­ле [global] редак­ти­ру­ем сле­ду­ю­щие опции:

workgroup = TEST
security = ads

* где TESTNETBIOS имя доме­на; ads — ука­зы­ва­ет, что для samba будет исполь­зо­вать­ся модель без­опас­но­сти LDAP Active Directory.

Так­же в [global] доба­вим сле­ду­ю­щие строки:

kerberos method = secrets and keytab
realm = TEST.LOCAL
winbind enum groups = Yes
winbind enum users = Yes
idmap config * : rangesize = 1000000
idmap config * : range = 1000000-19999999
idmap config * : backend = autorid

* где:

  • kerberos method — метод про­вер­ки kerberos. В дан­ном при­ме­ре сна­ча­ла исполь­зу­ет­ся secretts.tdb, а затем систем­ная таб­ли­ца ключей.
  • realm — сер­вер Active Directory. В нашем при­ме­ре про­пи­сан домен, так как по нему мож­но обра­тить­ся к любо­му из сер­ве­ров AD.
  • winbind enum groups — зада­ет пре­де­лы пере­чис­ле­ния групп через setgrent(), getgrent() и endgrent().
  • winbind enum users — зада­ет пре­де­лы пере­чис­ле­ния поль­зо­ва­те­лей через setpwent(), getpwent()и endpwent().
  • idmap config * : rangesize — опре­де­ля­ет коли­че­ство доступ­ных uids и gids в каж­дом домен­ном диапазоне.
  • idmap config * : range — опре­де­ля­ет доступ­ные сов­па­да­ю­щие диа­па­зо­ны uid и gid, для кото­рых сер­вер­ная часть явля­ет­ся авторитетной.
  • idmap config * : backend — зада­ет idmap пла­гин для исполь­зо­ва­ния в каче­стве SID/uid/gid подсистемы

Вво­дим сер­вер в домен:

net ads join -U Administrator@test.local

* где Administrator — учет­ная запись поль­зо­ва­те­ля AD с пра­ва­ми на ввод ком­пью­те­ров в домен; test.local — наш домен.

Мы долж­ны уви­деть, при­мер­но, следующее:

Using short domain name -- TEST
Joined 'SAMBA' to dns domain 'test.local'

Раз­ре­ша­ем авто­за­пуск winbind и стар­ту­ем его:

systemctl enable winbind --now

Выби­ра­ем про­филь для аутентификации:

authselect select winbind --force

Про­ве­ря­ем, что наш сер­вер может полу­чить спи­сок поль­зо­ва­те­лей Active Directory:

wbinfo -u

… и групп:

wbinfo -g

Если мы уви­де­ли спи­сок поль­зо­ва­те­лей и групп, то при­со­еди­не­ние сер­ве­ра к доме­ну завершено.

Настройка шары

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

vi /etc/samba/smb.conf

Созда­ем шару:

[AD]
comment = Folder for AD users
path = /data/ad
public = no
writable = yes
read only = no
guest ok = no
valid users = "@TEST\Domain Users" "@TEST\Domain Admins"
create mask = 0777
directory mask = 0777
force create mode = 0777
force directory mode = 0777
inherit owner = yes

* в дан­ном при­ме­ре мы будем шарить пап­ку на сер­ве­ре /data/ad; мы предо­ста­вим доступ всем поль­зо­ва­те­лям групп Domain Users и Domain Admins доме­на TEST.

Созда­ем ката­лог и зада­ем права:

mkdir /data/ad

chmod 777 /data/ad

Теперь мож­но пере­за­пу­стить самбу:

systemctl restart smb

Про­бу­ем под­клю­чить­ся к сер­ве­ру. У нас долж­на появить­ся еще одна пап­ка ad.

Права ACL

И в про­дол­же­ние раз­го­во­ра о инте­гра­ции с AD, попро­бу­ем настро­ить ACL для более тон­ко­го предо­став­ле­ния прав доступа.

Для это­го сно­ва откры­ва­ем кон­фи­гу­ра­ци­он­ный файл samba:

vi /etc/samba/smb.conf

В раз­дел [global] добавим:

acl compatibility = auto

… и созда­дим новую шару:

[AD ACL]
comment = Folder for AD ACL
path = /data/adacl
public = no
writable = yes
read only = no
guest ok = no
admin users = "@TEST\Domain Admins"
inherit acls = yes
inherit owner = yes
inherit permissions = yes
map acl inherit = yes

* где admin users — поль­зо­ва­те­ли, кото­рые могут менять пра­ва пап­ки; inherit acls — насле­до­ва­ние acl прав; inherit permissions — насле­до­ва­ние прав от пап­ки роди­те­ля; map acl inherit — исполь­зо­вать ли схе­му кон­тро­ля досту­па, хра­ни­мую в Windows ACL.

Созда­ем ката­лог и зада­ем права:

mkdir /data/adacl

chmod 777 /data/adacl

Пере­за­пус­ка­ем самбу:

systemctl restart smb

Под­клю­ча­ем­ся к нашей создан­ной общей пап­ке. Кли­ка­ем по ней пра­вой кноп­кой мыши - выби­ра­ем свой­ства. На вклад­ке «Без­опас­ность» мы можем менять права:

Сетевая корзина

При уда­ле­нии фай­лов из общей пап­ки, дан­ные уда­ля­ют­ся навсе­гда. Но мы можем настро­ить сете­вую кор­зи­ну — скры­тый ката­лог, в кото­рый будут пере­ме­щать­ся уда­ля­е­мые с сам­бы объекты.

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

vi /etc/samba/smb.conf

Созда­ем шару:

[Recycle]
comment = Snap Directories
path = /data/recycle
public = yes
browseable = yes
writable = yes
vfs objects = recycle
recycle:repository = .recycle/%U
recycle:keeptree = Yes
recycle:touch = Yes
recycle:versions = Yes
recycle:maxsize = 0
recycle:exclude = *.tmp, ~$*
recycle:exclude_dir = /tmp

* где:

  • vfs objects = recycle — исполь­зо­вать под­си­сте­му recycle.
  • recycle:repository — где хра­нить уда­лен­ные объ­ек­ты. В дан­ном при­ме­ре уда­лен­ные фай­лы попа­дут в скры­тый ката­лог .recycle к кото­ром создаст­ся ката­лог с име­нем поль­зо­ва­те­ля, уда­лив­ше­го файл или папку.
  • recycle:keeptree — уда­лять объ­ек­ты с сохра­не­ние дере­ва каталогов.
  • recycle:touch — изме­нить ли дату изме­не­ния фай­ла при его пере­ме­ще­нии в корзину.
  • recycle:versions — при уда­ле­нии фай­лов с сов­па­да­ю­щи­ми име­на­ми, добав­лять номер версии.
  • recycle:maxsize — не поме­щать в кор­зи­ну фай­лы, раз­мер кото­рых боль­ше задан­но­го пара­мет­ра (в бай­тах). В дан­ном при­ме­ре, поме­щать фай­лы любо­го размера.
  • recycle:exclude — исклю­чить файлы.
  • recycle:exclude_dir — исклю­чить каталог.

Созда­ем ката­лог и зада­ем права:

mkdir /data/recycle

chmod 777 /data/recycle

Пере­за­пус­ка­ем самбу:

systemctl restart smb

Про­бу­ем зай­ти в сете­вой ката­лог Recycle и создать, а после уда­лить файл. Он дол­жен ока­зать­ся к скры­той пап­ке .recycle.

Для авто­ма­ти­че­ской чист­ки сете­вой кор­зи­ны мож­но создать скрипт:

mkdir /scripts

vi /scripts/cleanrecycle.sh

#!/bin/bash

recyclePath="/data/recycle/.recycle"
maxStoreDays="30"

/usr/bin/find $recyclePath -name "*" -ctime +$maxStoreDays -exec rm {} \;

* в дан­ном скрип­те мы ищем все фай­лы в ката­ло­ге /data/recycle/.recycle, кото­рые стар­ше 30 дней и уда­ля­ем их.

Раз­ре­ша­ем запуск скрипта:

chmod +x /scripts/cleanrecycle.sh

Созда­ем зада­ние в планировщике:

crontab -e

0 5 * * * /scripts/cleanrecycle.sh

* в дан­ном при­ме­ре мы будем запус­кать скрипт по очист­ке сете­вой кор­зи­ны каж­дый день в 05:00.

Подключение к шаре

Теперь раз­бе­рем при­ме­ры под­клю­че­ния к нашим шарам из раз­ных систем.

Windows

Для разо­во­го под­клю­че­ния мож­но исполь­зо­вать про­вод­ник, про­пи­сав в нем адрес сер­ве­ра через косые линии:

Для под­клю­че­ния сете­во­го дис­ка, кото­рый будет авто­ма­ти­че­ски созда­вать­ся при запус­ке систе­мы, в про­вод­ни­ке свер­ху нажи­ма­ем Про­стой доступ - Под­клю­чить как диск:

В открыв­шем­ся окне про­пи­сы­ва­ем путь до сете­вой пап­ки и выби­ра­ем имя диска:

Сете­вой диск настроен.

Но мы может сде­лать те же дей­ствия из команд­ной строки:

net use x: \\samba.test.local\AD ACL /persistent:yes

* где x: — имя сете­во­го дис­ка; \\samba.test.local\AD ACL — путь до сете­во­го ката­ло­га; persistent:yes — ука­зы­ва­ет на то, что нуж­но вос­ста­нав­ли­вать дан­ный диск каж­дый раз при вхо­де в систему.

Linux

Монтирование

В Linux мы можем мон­ти­ро­вать уда­лен­ный ката­лог с помо­щью коман­ды mount, например:

mount -t cifs "//192.168.1.15/ad" /mnt -o user=test

* где 192.168.1.15 — IP-адрес сер­ве­ра; mnt — ката­лог, куда мон­ти­ру­ем сете­вую шару; test— поль­зо­ва­тель, под кото­рым выпол­ня­ем под­клю­че­ние к сете­во­му каталогу.
** в систе­му дол­жен быть уста­нов­лен пакет cifs-utils.

SMB Browser

Так­же мы можем уви­деть содер­жи­мое уда­лен­ных папок на samba при помо­щи кли­ен­та smb. Для нача­ла уста­но­вим дан­но­го клиента:

а) на Red Hat / CentOS / Fedora:

yum install samba-client

б) на Debian / Ubuntu / Mint:

apt-get install samba-client

После вво­дим команду:

smbclient -L 192.168.1.15 -U staff@test.local

* где 192.168.1.15 — сер­вер samba, к кото­ро­му мы пыта­ем­ся под­клю­чить­ся; staff@test.local — учет­ная запись, под кото­рой выпол­ня­ет­ся подключение.

… мы полу­чим спи­сок ката­ло­гов, кото­рые рас­ша­ре­ны на сервере.

Так­же мы можем под­клю­чить­ся к кон­крет­ной пап­ке, например:

smbclient \\\\192.168.1.15\\ad -U staff@test.local

Мы под­клю­чим­ся кли­ен­том samba — мож­но выпол­нить запрос на показ содержимого:

smb: \> ls

Или пол­ный спи­сок воз­мож­ных команд:

smb: \> help

Некоторые опции Samba

Рас­смот­рим неко­то­рые полез­ные опции, кото­рые могут при­го­дит­ся при настрой­ке Samba.

1. hosts allow

Пара­метр зада­ет спи­сок раз­ре­шен­ных хостов или сетей, с кото­рых мож­но под­клю­чать­ся к сер­ве­ру. Если его про­пи­сать в сек­цию с настрой­кой шары, то он будет дей­ство­вать толь­ко для нее, если про­пи­сать в [global], то для всех общих папок.

При­мер исполь­зо­ва­ния параметра.

hosts allow = comp1, 192.168.1., 192.168.160.0/255.255.252.0

* в нашем при­ме­ре мы раз­ре­шим доступ толь­ко для ком­пью­те­ра comp1, ком­пью­те­ров из сетей 192.168.1.0/24 и 192.168.160.0/22.

2. hosts deny

Пара­метр ана­ло­гич­ный hosts allow, толь­ко он наобо­рот — запре­ща­ет доступ для хостов и сетей. Например:

hosts deny = comp2, 192.168.2., 192.168.164.0/255.255.252.0

hosts deny = ALL EXCEPT 192.168.3.

3. interfaces

По умол­ча­нию samba исполь­зу­ет все сете­вые интер­фей­сы, кро­ме локаль­ной пет­ли (127.0.0.1). Пара­метр interfaces поз­во­лит ука­зать, на каком сете­вом адап­те­ре фай­ло­вый сер­вер дол­жен при­ни­мать запро­сы. Пример:

interfaces = ens32 192.168.1.15/24 192.168.2.15/255.255.255.0