Сервер в кармане, или просто о сложном!

главная - Статьи - Linux, FreeBSD



Установка и настройка Samba на CentOS 7

Дата обновления: 23.09.2020

Теги: Система Linux Настройка сервера Samba

В статье приведен пример установки файлового сервера Samba в рабочей группе (не в домене) на CentOS 7. Доступ к ресурсам как публичный, так и по логину/паролю. Последнее обновление: 06.09.2017.

Ставим Samba:

# yum install samba samba-client samba-common

Подготовка

# cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

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

# nano /etc/samba/smb.conf

[global]
workgroup = WORKGROUP
server string = My Samba Server %v
netbios name = centos

security = user
map to guest = bad user
passdb backend = tdbsam
guest account = samba_guest
min protocol = SMB2
ntlm auth = ntlmv2-only

dns proxy = no

log file = /var/log/samba/log.%m
max log size = 50

; а вот это мы добавляем в конец конфига:
[Common]
comment = Common share
path = /samba/share
browsable =yes
writable = yes
guest ok = yes
read only = no

WORKGROUP должно совпадать с названием рабочей группы компьютеров у вас дома;

netbios name = centos - имя вашего сервера в сети. У меня это имя прописано в dns на роутере mikrotik, вы же при желании можете прописать centos в файл hosts на рабочих станциях в вашей сети. Главное, чтобы ваш сервер был доступен по имени centos (в этом примере). Если вы еще не заблокировали icmp, выполните команду `ping centos` с рабочей станции. Если разрешение имени не работает, у вас будет вариант использовать такую запись <ip-вашего-сервера> вместо centos.

guest account = samba_guest - определяем имя пользователя (должен быть добавлен в систему), от имени которого будет осуществляться доступ к общим папкам. Этого пользователя мы создадим чуть позже.

map to guest = bad user - означает, что если был указан логин/пароль и такого логина не существует, то будет произведена попытка войти под учеткой гостя.

ntlm auth = ntlmv2-only (то же, что и ntlm auth = no) - не разрешать NTLMv1, использовать NTLMv2. С версии Samba 4.5 это дефолт.

Если вы сомневаетесь в значении любого параметра из тех, которые я привел выше, лучше ознакомьтесь с их смыслом на этом этапе, т.к. если что-то пойдет не так, лучше вам заранее понимать, что вы сделали. Тем более, что не так и много сделали. И вообще, я могу опечататься, вы можете что-то не скопировать и др.

Да, и еще, я сразу удалил в этом файле дефолтные группы [homes], [printers], [netlogon], [Profiles] и [public]. Особенно я не хотел бы расшаривать домашние директории пользователей системы.

Несмотря на то, что файл настройки samba один, сами шары могут быть раскиданы по дискам и директориям, при просмотре сетевые пользователи не смогут понять, что шара upload указывает в /var/www/htdocs/upload, а шара docs - на /samba/common_docs. Т.е. ваша фантазия в этом плане вам на руку. Вы можете настроить все так, что файлы, которые вы загрузили по локальной сети, будут доступны посетителям вашего сайта. Ну или что угодно еще можете придумать. Главное, обращайте внимание на права доступа к файлам и директориям, которые вы создаете!

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

# testparm

Public share

Ранее в конфиге smb.conf мы указали имя пользователя (guest account = samba_guest), от имени которого будет производиться доступ к общедоступным шарам. Т.е. если мы в описании соответствующей группы укажем guest ok = yes, то независимо от ваших текущих привилегий доступ к файлам в соотв. шаре будет произведен от имени samba_guest. Давайте подготовим такого пользователя и директорию с соотв. правами.

# mkdir /samba/share

# ls -ldZ /samba/share
# chcon -t samba_share_t /samba/share
# ls -ldZ /samba/share
drwxr-xr-x. root root unconfined_u:object_r:samba_share_t:s0 /samba/share

# groupadd smbgrp
# useradd -c 'Samba member' -G smbgrp -M -s /sbin/nologin samba_guest
# chmod 775 /samba/share
# chown samba_guest:smbgrp /samba/share

опция -M указывает не создавать домашнюю директорию;
группа smbgrp будет объединять создаваемых в системе пользователей для Samba.

Здесь небольшая ремарка: часто в интернете в мануалах права на публичные шары предлагается давать 755 (т.е. запись только для пользователя, для группы и остальных - чтение и выполнение). И все здорово, до тех пор, пока вы не авторизуетесь для входа в другую папку, на которую установлен пароль (см. ниже). При этом вы будете уже не samba_guest:smbgrp, а, скажем, user1:smbgrp и вы сможете войти в свою директорию, но не сможете войти в общедоступную share (или войти сможете, но создать ничего не получиться - прав на запись у вас не будет)! Скажу честно, я не совсем понял, это я не так что-то понимаю или все так и есть. Но в моем случае именно права 775 на паблики выправили ситуацию (и я выше дал этому объяснение. Если я ошибаюсь - прошу прощения, что ввел вас в заблуждение. Но я честно вас предупредил :)

# systemctl enable smb.service && systemctl enable nmb.service
# systemctl restart smb.service && systemctl restart nmb.service

# firewall-cmd —permanent —zone=public —add-service=samba
# firewall-cmd —reload

Пробуем с рабочей станции в сети открыть шару share и создать пробный файл. Создав, проверьте на сервере, с какими правами создан файл:

# ls -al /samba/share

Если все ок и вы можете войти в публичную шару и создать в ней файл, то можно попробовать создать запароленную директорию для отдельного пользователя. Если что-то не так, скорее всего проблема в правах на папки, iptables или с SELinux.

Шары с паролем

Общая идея такова: если нам надо создать пользователя user1 для шары Samba, нам надо сначала создать пользователя с таким логином в системе Linux, а потом создать такого же пользователя в Samba. По моему разумению, системный пользователь, создаваемый для Samba, не должен иметь возможность входа в систему, а также иметь домашнюю директорию. Собственно, зачем ему это?

# useradd -c 'Samba member' -G smbgrp -M -s /sbin/nologin user1

Вообще говоря, пока вы не создадите пароль для этого пользователя, зайти им в систему нельзя, но представьте себе, когда через год или три вы забудете, ставили вы пароль или нет, и при просмотре /etc/passwd конкретно так вздрогнете, если оставить шелл по-умолчанию ;) Так что в любом случае проверьте файл /etc/passwd после выполнения команды. Хотя бы один разок.

А это уже внутренний пользователь Samba:

# smbpasswd -a user1

Создаем пользовательскую папку. Для директории user1 права можно ставить уже не 775, а 755:

# mkdir /samba/user1
# chcon -t samba_share_t /samba/user1
# chown user1:smbgrp /samba/user1
# chmod 755 /samba/user1

# ls -al /samba/
total 16
drwxr-xr-x.  4 root         root   4096 Feb 28 15:50 .
dr-xr-xr-x. 21 root         root   4096 Feb 28 14:54 ..
drwxr-xr-x.  2 user1        smbgrp 4096 Feb 28 15:50 user1
drwxrwxr-x.  2 samba_guest  smbgrp 4096 Feb 28 15:12 share

# nano /etc/samba/smb.conf
...
[User1 Share]
comment = User1's files
path = /samba/user1
;valid users = @smbgrp
valid users = user1
guest ok = no
writable = yes
browsable = yes
create mask = 0640
directory mask = 0750

параметр create mask = 0640 указывает, что создаваемые в этой шаре файлы будут для владельца с правами на запись, для группы - на чтение, всем остальным - фиг;
параметр directory mask = 0750 указывает аналогично, только для директорий.

В принципе, в личной шаре никто не мешает вам использовать маски 0600 и 0700 соотв. Хотите, поиграйтесь :) Но никогда без явно обозначенной цели не делайте маски 0777 ни для чего, даже если после этого все работает.

# systemctl restart smb.service && systemctl restart nmb.service

Проверяйте работу, все должно быть ок. В сетевом окружении должны быть две сетевые папки: share и user1.

Создайте еще пользователя, проверьте, как работают права доступа к пабликам и персональным директориям. Если что-то идет не так, проверяйте права доступа на директории и встроенные механизмы защиты, в данном случае SELinux.

Дополнительно

Ну и напоследок некоторые полезные команды.

Список пользователей Samba:

# pdbedit -L
user1:1001:Samba member

Расширенные данные по пользователям:

# pdbedit -L -v

Смена пароля у существующего пользователя:

# smbpasswd <User_name>

Удаление существующего пользователя:

# smbpasswd -x <User_name>

Приостановление учетной записи без удаления:

# smbpasswd -d <User_name>

Не хотите видеть в сетевой папке всякие временные файлы? В конфиге smb.conf добавьте к группе [User1 Share] что-то вроде:

hide files = /$RECYCLE.BIN/desktop.ini/lost+found/Thumbs.db/~*/

Iptables для Samba

Лучший способ узнать, что нужно разрешить в iptables - это посмотреть, какие порты слушает Samba:

# netstat -tulpn | egrep "samba|smbd|nmbd|winbind"
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN      13107/smbd
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN      13107/smbd
tcp6       0      0 :::139                  :::*                    LISTEN      13107/smbd
tcp6       0      0 :::445                  :::*                    LISTEN      13107/smbd
udp        0      0 192.168.88.255:137      0.0.0.0:*                           13119/nmbd
udp        0      0 192.168.88.2:137        0.0.0.0:*                           13119/nmbd
udp        0      0 0.0.0.0:137             0.0.0.0:*                           13119/nmbd
udp        0      0 192.168.88.255:138      0.0.0.0:*                           13119/nmbd
udp        0      0 192.168.88.2:138        0.0.0.0:*                           13119/nmbd
udp        0      0 0.0.0.0:138             0.0.0.0:*                           13119/nmbd

Соответственно, в iptables надо добавить следующие правила:

-A INPUT -s 192.168.88.0/24 -p udp -m udp --dport 137 -m state --state NEW -j ACCEPT
-A INPUT -s 192.168.88.0/24 -p udp -m udp --dport 138 -m state --state NEW -j ACCEPT
-A INPUT -s 192.168.88.0/24 -p tcp -m tcp --dport 139 -m state --state NEW -j ACCEPT
-A INPUT -s 192.168.88.0/24 -p tcp -m tcp --dport 445 -m state --state NEW -j ACCEPT

где 192.168.88.0/24 - ваша локальная сеть.

LOG-файл Samba

Можно тюнинговать логирование бесконечно долго, но если быстро и достаточно полезно, то приведу пример, как выводить в лог информацию о том, кто, откуда, что переименовал, что смотрел, что удалил. Открываем файл /etc/samba/smb.conf:

...
[global]

log file = /var/log/samba/log.%m
log level = 1 auth_audit:3 auth_json_audit:3
max log size = 10000

[Common]
...
vfs objects = full_audit
full_audit:prefix = %u|%I
full_audit:success = mkdir rmdir read pread write pwrite sendfile rename unlink lock
full_audit:failure = mkdir rmdir read write rename unlink
full_audit:facility = LOCAL7
full_audit:priority = ALERT
...

# systemctl restart smb.service && systemctl restart nmb.service

Попробуйте открыть файлы на шаре, удалить папку, создать файл. Потом посмотрите файл /var/log/messages:

Sep  4 17:50:19 centos smbd_audit: samba_guest|192.168.3.3|rename|ok|files/open_server_5_2_5_basic.exe|files/_open_server_5_2_5_basic.exe
Sep  4 17:50:40 centos smbd_audit: samba_guest|192.168.3.3|rename|ok|files/_open_server_5_2_5_basic.exe|files/open_server_5_2_5_basic.exe
Sep  4 18:01:11 centos smbd_audit: samba_guest|192.168.3.3|mkdir|ok|files/Новая папка
Sep  4 18:01:13 centos smbd_audit: samba_guest|192.168.3.3|rename|ok|files/Новая папка|files/333
Sep  4 18:01:16 centos smbd_audit: samba_guest|192.168.3.3|rmdir|ok|files/333

Все ясно. Кто-то с ip 192.168.3.3 переименовал файл open_server_5_2_5_basic.exe, причем дважды. Потом создал папку, переименовал ее и удалил.

Играясь со списком "mkdir rmdir read pread write pwrite sendfile rename unlink lock" можно реагировать на разные события, а можно вообще так full_audit:success = all !open (все, кроме открытия).

Можно до бесконечности писать про всякие отдельные фишки. Но в целом зада выполнена.



26.07.2019 11:36 Николай
Здравствуйте. Я сделал домашний сервер на CentOS 7.6. Более полугода не могу решить две проблемы, 1. Периодически пропадает доступ к ресурсам Samba сервера из рабочей станции под Linux из Dolpin: - > Сеть > Добавить сетевую папку > Сетевой диск Windows. Ранее добавленные и сохранённые ресурсы недоступны. Когда доступ есть время присоединения, через Putty около секунды, когда доступа нет, оно увеличивается до 40 секунд. Аналогично через Putty запускается Midnight Commander. Доступ к ресурсам Samba из Windows не пропадает. Затем, через несколько дней, без всякого вмешательства, всё восстанавливается. 2. Периодически один, или несколько дисков сервера переводится в режим "Только чтение". Восстанавливается так же без вмешательства. И ещё вопрос, я не понял смысла команды "firewall-cmd --permanent --zone=public --add-service=samba", нужна ли она в рабочей группе и на что влияет, точнее нужны ли дополнительные настройки в случае её использования. При настройке сервера я её не использовал. На рабочей станции две ОС, Fedora 28 Plasma и Windows 10.
26.07.2019 13:32 Николай
Откорректировал в соответствии с Вашими рекомендациями файл smb.conf и у меня совсем пропал доступ к общим папкам сервера, хотя команда testparm сообщает, что всё ОК. Снова восстановил свой конфигурацонный файл и доступ восстановился. Привожу полностью состав файла:
[global]
workgroup = WORKGROUP
server string = File Server
netbios name = nikiv64
interfaces = lo enp2s0 192.168.8.3/24
hosts allow = 127. 192.168.8.
security = user
passdb backend = tdbsam
map to guest = bad user
min protocol = smb2

log file = /var/log/samba/log.%m
max log size = 50

encrypt passwords = yes
security = user
dns proxy = no
dos charset = 866
unix charset = UTF-8

[homes]
comment = Home Directories
valid users = %S, %D%w%S
browseable = No
read only = No
inherit acls = Yes

[home]
comment = My Files
path = /home/user
force user = user
force group = user
guest ok = yes
writable = yes
create mask = 0775
directory mask = 0775
Всё работает, однако проблема №1, которая появилась сегодня утром, осталась. Я нашёл способ подключения к общим ресурсам сервера при помощи утилиты cifs, через конфигурационный файл fstab, однако подключение происходит примерно за 40 секунд, подозреваю, что оно осуществляется, не через Samba, а через SSH.
27.07.2019 08:38 Николай
Просмотрел информацию по зонам, оказывается зона public активна по умолчанию. На всякий случай выполнил команду firewall-cmd --get-active-zones и получил сообщение:
public
interfaces enp2s0
Получается, мне нет необходимости активизировать эту зону. Хотя стоит попробовать, ведь получится, что я принудительно её открою и привяжу её к Samba. Возможно именно из-за этого у меня идёт свистопляска с доступом , через Самбу. Большое спасибо.
06.08.2019 22:49 bzzz
Спасибо за настойчивость и подробные комменты. Я сейчас то в отпуске, то в командировке. У меня тоже бывало такое, что вдруг ни с того ни с сего Samba из видимости винды исчезает. Но мне казалось, что это глюк винды. На самбе-то я ничего не меняю иногда месяцами.
23.12.2019 19:03 Николай
Прошу помощи в настройке файлового сервера под CentOS 7. Проблема 1, с рабочей станции под Linux, у любого общего ресурса отображается свободный объём 4,9 GB, хотя его в десятки раз больше, из-под Windows он отображается правильно. Это создаёт проблему при копировании на сервер больших файлов и каталогов из-под Linux. Проблема 2, при отсутствии соединения с интернет, пропадает доступ к ресурсам сервера, через Samba с рабочей станции под Linux, через SSH доступ есть, но нужный ресурс открывается около 40 секунд, так же долго происходит соединение с сервером из Putty, а также запуск Midnight Commdnder удалённо на сервере. Причина этой проблемы в том, что CentOS требует соединение с публичным сервером DNS. Установил и настроил dnsmasq на сервер, тестирование показывает, что имена хостов преобразуются в IP адреса и наоборот, даже при отключённом интернет, но без интернет всё равно доступа нет. Поскольку сервер домашний и количество рабочих станций очень мало, используется статическая адресация, может быть возможно отключить на сервере использование DNS и DHCP, если это возможно, то как?
24.12.2019 08:56 bzzz
По поводу 2) попробуйте поиграть с "name resolve order".
24.12.2019 08:59 bzzz
И, кстати, конфиг можете показать?
24.12.2019 09:04 bzzz
К 2) еще "dns proxy"

Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?