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

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

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

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

В статье приведен пример установки файлового сервера 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

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 - означает, что если был указан логин/пароль и такого логина не существует, то будет произведена попытка войти под учеткой гостя.

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

Да, и еще, я сразу удалил в этом файле дефолтные группы [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 (все, кроме открытия).

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

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


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