Файловый сервер SAMBA на базе Linux CentOS 7

  • Tutorial


Привет Хабр!
После активности шифровальщика Petya 27.06.2017, я отключил SMB1 он же CIFS, и получил производственное оборудование и сетевые МФУ которые не умеют работать на «новых» версиях SMB протокола.

Как тогда получать данные с «старых» устройств? Как показала практика, отдельная «машина» с Windows не выход, во время атаки кроме доменных «машин» пострадали также не включенные в домен, по этому, а также по лицензионным соображениям я решил использовать Linux.

Под катом находится пошаговая инструкция по установке и настройке файлового сервера SAMBA на базе CentOS 7:

— Анонимный доступ
— Аутентификация и авторизация
— Интеграция с Active Directory

Установка CentOS 7


Сервера работают под управлением VMware ESXi, и по этому я установил CentOS 7 1611 на VM, выделив 1 CPU, 1GB RAM и 3GB HDD.

LVM я не использую, SWAP раздел не создаю, на загрузочный раздел выделяю 500MB, а все остальное отдаю под корень файловой системы. В качестве файловой системы использую ext4.



Процесс установки описывать я не буду, даже если вы этого никогда не делали, это не сложно, у вас все получится. Предполагаю что вы уже все установили, тогда можно приступать.

Если вы новичок в линукс, делайте копии оригинальных файлов с конфигами, используйте команду cp.

cp /etc/somefile.conf /etc/somefile.conf.bak

Получение ip адреса по DHCP


Если по какой-то причине в сети нету DHCP сервера, вам стоит его поднять. Работать с большим количеством VM без DHCP не удобно.

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

dhclient

Показать ip адрес

ifconfig

YUM


CentOS 7 использует пакетный менеджер YUM. Шпаргалка по yum находится тут.

Если выход в интернет организован через прокси сервер, добавьте адрес прокси в файл конфигурации /etc/yum.conf, используйте редактор vi или следующую команду

echo proxy=http://your.proxy:8888 >> /etc/yum.conf

В случае использования логина и пароля для доступа к прокси серверу, добавьте следующие параметры:
proxy_username=yum-user
proxy_password=qwerty

Установка на VM агентов для взаимодействия с хост сервером


Для VMware ESXi необходимо установить open-vm-tools

yum install open-vm-tools

Для Hyper-V, hyperv-daemons

yum install hyperv-daemons

Установка обновлений


Очень важно установить все доступные обновления

yum update

Midnight Commander


Редактировать файлы без нормального редактора очень не удобно, и я предлагаю использовать mc и mcedit

yum install mc

Настройка сети


Для настройки статического ip адреса и имени хоста можно использовать утилиту nmtui



В командной строке список сетевых адаптеров можно получить командой

nmcli device status

Статический ip и gateway задается следующей командой, где «ens192» это имя сетевого адаптера

nmcli connection modify “ens192” ipv4.addresses “192.168.1.100/24 192.168.1.1”

Настройка FQDN


Пусть полное имя хоста будет ls01.fqdn.com, выполняем команду

hostnamectl set-hostname ls01.fqdn.com

Перезагружаем службу имен

systemctl restart systemd-hostnamed

Проверить результат можно следующими командами

hostnamectl status
hostname
hostname -s
hostname -f

ipv6


Если протокол ipv6 не используется, логично его отключить, для этого нужно добавить два параметра в файл /etc/sysctl.conf, выполните следующие команды или используйте редактор mcedit

echo net.ipv6.conf.all.disable_ipv6 = 1 >>  /etc/sysctl.conf
echo net.ipv6.conf.default.disable_ipv6 = 1 >>  /etc/sysctl.conf

Перезагрузите службу сети

service network restart

SELINUX


На данном этапе службу SELINUX необходимо отключить, проверить статус службы SELINUX можно командой

sestatus

Измените значение SELINUX в файле /etc/selinux/config на SELINUX=disabled затем перезагрузите сервер.

reboot

Вернусь к SELINUX в конце статьи.

SAMBA


Установка

yum install samba

Добавление службы в автоматический запуск

chkconfig smb on

Запуск службы и проверка состояния

service smb start
smbstatus

firewallD


По умолчанию CentOS 7 использует брандмауэр firewallD, состояние службы можно узнать командой

firewall-cmd --state

Для получения списка правил и сервисов используйте

firewall-cmd --list-all
firewall-cmd --list-services



Обратите внимание на список сервисов, если вы отключили протокол ipv6, логично также поступить и с dhcpv6-client

firewall-cmd –permanent –remove-service=dhcpv6-client

Создаем правило для SAMBA и перезагружаем

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

Общий ресурс с анонимным доступом


Создаем папку для ресурса /samba/guest

mkdir /samba
mkdir /samba/guest

Меняем владельца и назначаем права

chown nobody:nobody /samba/guest
chmod 777 /samba/guest

Редактируем файл конфигурации SAMBA /etc/samba/smb.conf

mcedit  /etc/samba/smb.conf

Меняем содержание оригинального файла на следующее
[global]
workgroup = WORKGROUP
security = user
map to guest = bad user
min protocol = NT1

[guest]
path = /samba/guest
guest ok = Yes
writable = Yes
На всякий случай я указал минимальную версию протокола SMB=NT1. Если вы укажите SMB2 или SMB3, клиенты с Windows XP и ниже не смогут получить доступ к ресурсам.

Проверка параметров и перезагрузка службы

testparm
service smb restart
smbstatus


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

Бантики


По умолчанию лог файлы находятся в папке /var/log/samba. При необходимости получить подробные логи, в раздел [global] необходимо добавить параметр log level = 2 или 3. По умолчанию используется значение 1, значение 0 отключает ведение логов.
[global]
log level = 2
Как вы можете знаете, предоставление доступа к файлам это только часть функционала SAMBA. Если на сервере будут только файловые ресурсы, службу печати логично отключить. В разделе [global] добавьте следующие параметры
[global]
load printers = no
show add printer wizard = no
printcap name = /dev/null
disable spoolss = yes

Конфигурация SAMBA находиться в каталоге /etc/samba, а логи в каталоге /var/log/samba
Мне удобней все инструменты держать по рукой, по этому я монтирую необходимые мне каталоги в /samba

Создаем каталоги, в которые будет все монтироваться

mkdir /samba/smbconf
mkdir /samba/smblogs

Редактируем конфиг файл /etc/fstab, я предполагаю что вы знаете за что отвечает fstab.

mcedit /etc/fstab

Добавляем следующие строки
/etc/samba /samba/smbconf none bind 0 0
/var/log/samba /samba/smblogs none bind 0 0

Монтируем без перезагрузки
mount -a

Подключение диска


Держать ресурс с общим доступом на системном диске без квоты, не лучший выбор. С квотами я решил не связываться, мне проще подключить отдельный «физический» диск.

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

lsblk

Создание таблицы разделов на диске /dev/sdb

parted /dev/sdb mklabel msdos

или

parted /dev/sdb mklabel gpt

Подробную информация про gpt можно прочитать тут

Создание раздела на весь диск sdb, в лучших традициях жанра я решил сделать отступ 1MiB в начале диска.

parted /dev/sdb mkpart primary ext4 1MiB 100%

Создаем файловую систему ext4

mkfs.ext4 /dev/sdb1

Редактируем fstab

mcedit /etc/fstab

Добавляем еще одну строку
/dev/sdb1 /samba/guest ext4 defaults 0 0

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

mount –a

Проверяем результат

df -h

Назначение прав

chmod 777 /samba/guest

Подключение образа диска


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

Создаем каталог для хранения образов

mkdir /samba/smbimg	

Создаем файл образа размером 100 мб

dd if=/dev/zero of=/samba/smbimg/100M.img bs=100 count=1M

Про команду dd много интересного можно прочитать тут

В варианте с образом я решил не создавать таблицу разделов, просто создаем файловую систему ext4.

mkfs.ext4 /samba/smbimg/100M.img

Редактируем fstab

mcedit /etc/fstab

Конфиг для монтирования образа
/samba/smbimg/100M.img /samba/guest ext4 defaults 0 0

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

mount -a

Проверяем результат

df -h

Назначение прав

chmod 777 /samba/guest

Подключение RAM диска


Для временных ресурсов где не нужен большой объем, как мне кажется RAM диск это наилучший вариант, очень быстро и просто настраивается, а скорость работы поражает воображение.

Редактируем fstab

mcedit /etc/fstab

Конфиг для RAM диска
none /samba/guest tmpfs defaults,size=100M 0 0

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

mount -a

Проверяем результат

df -h

Удаление старых файлов


В случае «файлопомойки» ресурсы нужно как-то освобождать, для этого можно использовать планировщик задач crontab

Просмотр заданий

crontab –l

Редактирование заданий

crontab –e	

Пример конфига:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=“”
HOME=/

#удалять файлы и каталоги каждый час
* 0-23 * * * rm –R /samba/guest/*

#Удалить только файлы старше 1 дня, запуск команды каждые 10 минут
0-59/10 * * * * find /samba/guest/* -type f -mtime +1 -exec rm –f {} \;

#удалить файлы старше 50 минут, запуск команды каждые 10 минут
0-59/10 * * * * find /samba/guest/* -type f -mmin +50 -exec rm -f {} \;

Выход из vi

<ESC>
:wq

Логи службы crontab находятся в файле /var/log/cron

Ограничение доступа к SAMBA по ip адресам


Если вам нужно ограничить доступ ко всем ресурсам SAMBA, добавьте ваши списки доступа в разделе global, а если необходимо ограничить только на определенный ресурс, в разделе этого ресурса.

Пример:
[global]
hosts allow = 192.168.1.100, 192.168.1.101
hosts deny = ALL

[guest]
hosts allow = 192.168.0.0/255.255.0.0
hosts deny = 10. except 10.1.1.1

Аутентификация и авторизация пользователей


Ограничение доступа по ip адресам не всегда удобно или возможно, тогда можно использовать логины и пароли.

Сначала необходимо создать локального пользователя в системе

adduser user1

Если пользователь будет работать только с SAMBA ресурсами, задавать ему пароль для системы нет необходимости. Пароль для системы и для SAMBA хранятся в разных файлах и могут отличаться.

Затем необходимо добавить системного пользователя в пользователи самбы и задать ему пароль

smbpasswd -a user1

По умолчанию для хранения паролей используется файл формата tdb, которые расположен в каталоге /var/lib/samba/private/

Изменить каталог расположения файла можно глобальным параметром passdb backend
[global]
passdb backend=tdbsam:/etc/samba/smbpassdb.tdb

tdb файлы были созданы для замены «устаревших» текстовых, если вы хотите использовать текстовые файлы, для этого используйте параметр passdb backend=smbpasswd в разделе global
passdb backend=smbpasswd:/etc/samba/smbpasswd

Затем укажите списки пользователей и групп для доступа к ресурсам
[guest]
path = /samba/guest
writable = no
read list = user1, @group2
write list = user2, user3

Интеграция с Active Directory


Также есть возможность получать информацию о пользователей из LDAP, но мне этот вариант не интересен и я сразу перехожу к AD. Подробная инструкция от Microsoft находится тут.

Для AD очень важна синхронизация времени, по этому стоит начать с этого.

Установка соответствующей службы

yum install ntp

Добавляем в конфиг файл /etc/ntp.conf сервера выполняющих роль домен контроллеров

mcedit /etc/ntp.conf

Пример:
server 192.168.1.10
server 192.168.1.20
server someserver.contoso.com

Добавляем службу ntp в автоматический запуск

chkconfig ntpd on

Запускаем службу

service ntpd start

Проверяем синхронизацию времени

ntpq –p

winbind


Для получения информации о пользователях из AD необходимо установить пакет samba-winbind

yum install samba-winbind

Добавляем службу в автоматический запуск

chkconfig winbind on

Запускаем службу

service winbind start

Добавление хоста в AD


Напомню что в начале даной инструкции задали имя хоста ls01.fqdn.com. Будем считать что полное имя домена fqdn.com, а короткое пусть будет fqdn_com

Для внесения всех необходимых параметров в конфигурационные файлы можно воспользоваться утилитой authconfig-tui, установите флажок Use Winbind, затем перейдите на следующее окно



Выберите модель безопасности ADS и укажите имена вашего домена. В поле домен контролер укажите “*”, это необходимо для автоматического поиска доступного домен контроллера. Затем нажмите ОК и закройте утилиту.



Для добавления хоста в AD используйте команду net ads join –U %username%, пользователь должен обладать правами на создание учетной записи ПК в домене

net ads join –U youruser



Если машина не добавляется в домен, добавьте FQDN имя хоста в файл /etc/hosts.
Я несколько раз все проверял, и в файл hosts я вносил изменения когда на этапе настройки сети задавал не полное имя хоста.

Для того чтобы вывести хост из домена используйте команду net ads leave –U %username%

Что делает утилита authconfig-tui?


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

/etc/krb5.conf
[libdefaults]
Default_realm = FQDN.COM

[realms]
FQDN.COM = {
kdc = *
}

/etc/nsswitch.conf
passwd: files sss winbind
shadow: files sss winbind
group: files sss winbind

/etc/samba/smb.conf
[global]
workgroup = FQDN_COM
password server = *
realm = FQDN.COM
security = ads
idmap config *: range = 16777216-33554431
template shell = /sbin/nologin
kerberos method = secrets only
winbind use default domain = false
winbind pffline logon = false

Вы могли заметить что данная утилита вносит заметно меньше параметров чем написано в инструкции от Microsoft или других инструкциях, но если так работать – то почему бы и нет?

Из инструкции Microsoft я добавляю следующие параметры в конфиг
[global]
domain master = no
local master = no
preferred master = no
os level = 0
domain logons = no

Настройка прав доступа на ресурс
В качестве примера и для наглядности рекомендую настроить ресурсы с разными правами на одну папку
[domain users read only]
path = /samba/guest
read list = "@fqdn_com\domain users"
force create mode = 777
directory mask = 777

[domain users writable]
path = /samba/guest
read list = "@fqdn_com\domain users"
write list = "@fqdn_com\domain users"
force create mode = 777
directory mask = 777

Перезапускаем службу samba

service smb restart

Проверяем

smbstatus

На скриншоте видно пользователя домена который находится в одной из общих папок


THE END

Список полезных ссылок:

Боремся с вирусами и инфраструктурой, или отключение SMB v1
Критическая уязвимость SambaCry: как защититься
How to Fix SambaCry Vulnerability (CVE-2017-7494) in Linux Systems

Yum, шпаргалка
Команда dd и все, что с ней связано

Using Samba, 2nd Edition
Включение Samba-сервера на базе Ubuntu в домен AD
Setting Up Samba and Configure FirewallD and SELinux to Allow File Sharing on Linux/Windows Clients

SELinux — описание и особенности работы с системой. Часть 1
SELinux — описание и особенности работы с системой. Часть 2

P.S.
Вернемся к SELINUX, чтобы SAMBA сервер мог предоставить доступ к любым каталогам необходимо выполнить следующие команды

setsebool -P samba_export_all_ro=1
setsebool -P samba_export_all_rw=1


К сожалению я так и не смог настроить работу winbind при включенном SELINUX, если подскажете как, я буду благодарен.
Метки:
Поделиться публикацией
Похожие публикации
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 35
  • 0
    Хороший набор утилит значительно снижает время настройки сервера
    • 0
      Только стоит помнить, что ограничение на длину имени файла (если не ошибаюсь, с учетом пути) в ~два раза меньше, чем под Windows (для русского языка).
      Под линуксами длина имени 255байт. Под виндовс 255символов UTF-16.
      При использовании самбы в офисе неизбежно возникнут проблемы с длинными русскими именами файлов на этапе миграции с виндовс-сервера.
      • +2
        Под линуксом лимит на длину пути — 4096 байта, если нужно больше — перекомпилируйте ядро

        https://github.com/torvalds/linux/blob/master/include/uapi/linux/limits.h
        #define NAME_MAX 255 /* # chars in a file name */
        #define PATH_MAX 4096 /* # chars in a path name including nul */


        Под виндой, если использовать UNC (\\?\, не все программы умеют, например Double Commander — нет, а Total Commander — да) — около 32767, если обычным путем — 255.
      • –1
        Материал поражает наличием комментария к каждой банальной команде, при отсутствии последовательного объяснения теории и всего происходящего.

        Из крайности в крайность: то вы предполагаете, что читатель способен самостоятельно создать виртуальную машину в vSphere и установить операционную систему, то объясняете, как выйти из vi, при установленном несколько шагов назад mcedit. То вы выставляете права 777, выключаете SELinux, и монтируете директории логов и конфигурации Samba в другую директорию, то рекомендуете выполнить команду SELinux setsebool с разными параметрами, оставляете конфигурацию и логи Kerberos, nsswitch и cron'а в директориях по-умолчанию, редактируете /etc/samba/smb.conf и предлагаете смотреть логи в /var/log/samba. То не упоминаете о необходимости добавления на виртуальную машину второго диска и отказываетесь использовать квоты, то форматируете неизвестно откуда взявшийся /deb/sdb, и создаёте и подключаете аж два 100-мегабайтных псевдо диска в одну и ту же директорию. Бедная /samba/guest описывается аж тремя способами в smb.conf в двух местах в тексте, система инициализации у вас то SysV, то Systemd, домен то fqdn.com, то contoso.com, группа «domain users» то может читать и писать, то только читать.

        Не статья, а бардак, одним словом.

        Опытный инженер пойдёт читать официальную документацию. Малоопытному, простите, вредно читать и использовать эту статью.
        • 0
          Опытный инженер пойдёт читать официальную документацию

          Официальная документация по Samba и CentOS
        • +1
          Подробный полезный туториал.

          Скажите, какие либо подводные камни встречались? (В комментариях упоминают ограничение на длину имени файла)
          • 0
            После отключения SMB1 в домене, перестало пускать доменных пользователей на шары, вывел машину из домена и завел обратно, все пофиксилось.

            Я линукс использую для хранения дистрибутивов и временных файлов, не ИТ пользователи с этими ресурсами не работаю, откуда тут камни?)))
            • +1
              Со временем запись в DNS, сформированная после net ads join, протухает.
              Нужно в cron (ну или куда там) добавить «net ads dns register -P»
              • 0
                хм, вроде все ок, у меня одна из первых машин работает уже больше года.
                Получает зарезервированный ip адрес по DHCP, возможно обновляет DNS запись через DHCP…
                • 0
                  Если запись была создана в DNS вручную (хотя бы один раз после протухания), или в DHCP разрешено небезопасное обновление DNS — то да.
                  • 0
                    Ещё есть Nape Protection, когда DHCP-сервер управляет регистрацией в DNS.
            • 0
              По отключению selinux без перезагрузки:
              проверить состояние:
              $ getenforce
              отключить без перезагрузки:
              $ setenforce 0
              • 0
                отключить без перезагрузки:
                $ setenforce 0

                Как я понимаю после перезагрузки selinux будет снова активным…
                • 0
                  да, поэтому в конфиг, как вы написали, тоже надо внести изменения
                  • +1
                    $ setenforce 0 переводит selinux в permissive режим (аудит ведется, действия записываются в журнал, но правила безопасности не применяются), в котором он находится до перезагрузки, либо до setenforce 1.
                    Поэтому перманентное отключение делается через конфиг-файл.
                  • +1
                    Как правило данную возможность используют, чтобы получить список необходимых правил для SeLinux. т.е. выполняем:
                    # setenforce 0
                    Что то творим и настраиваем. У нас все работает и мы хотим врубить SeLinux.
                    Прежде делаем так:
                    # cat /var/log/audit/audit.log | grep denied | audit2allow -M modul_name
                    # semodule -i modul_name.pp
                    # setenforce 1
                    modul_name — имя модуля который подключит необходимые правила. По audit.log можно еще грепнуть по имени сервиса который настраиваем. Я как правило просто чищу файл перед началом сбора статистики.
                    • 0
                      Да, так работает! ^_^
                      Я раньше пытался создать «правило» вот так, не получалось…
                      grep winbind /var/log/audit/audit.log | audit2allow -m somenameofmodule

                      П.С.
                      установка audit2allow…
                      yum install policycoreutils-python

                      П.П.С.
                      Странно, я решил все проверить еще раз на VM где я не пытался настроить SELINUX, я его включил — после чего winbind начал работать без бубна… 0_о
                  • 0
                    По интеграции с MS AD: пошаговая от производителя
                    В остальном — как Лиссяру перечитал, с поправкой на CentOS. Ностальгия, однако.
                    • 0
                      А по какой причине необходимо было отключить SELinux?
                      мне кажется стоит писать про:
                      semanage fcontext -at samba_share_t "/path/to/share(/.*)?"

                      А отключение SELinux не такая уж и хорошая затея!
                      • 0
                        не смог настроить работу winbind =(
                        нет winbind нет авторизации пользователей в AD…
                        • +1
                          Есть еще sssd
                      • 0
                        Я такое ещё году в 11-м писал :)))
                        • 0
                          Повторение, как говорится.
                          • +1
                            Надо дальше расти, а не повторять пройденное :)
                        • 0
                          Принуждение к NTLM2 дает больший эффект, чем принуждение к SMB2
                          • +2

                            Для CentOs можно ещё одним официальным руководством воспользоваться, от другого производителя: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Windows_Integration_Guide/index.html

                            • 0
                              Мне кажется или все-таки начиная c CentOS 7* команды ifconfig и chkconfig упразднены?
                              • 0
                                В минимальной установке уже нет ifconfig, но можно поставить.
                                • +1
                                  Случайно не знаете, почему Редхат-гуру, Сандер Ван Ваг (Sander van Vugt) крайне не рекомендовал в своих курсах пользоваться утилитой ifconfig, а делать упор именно на nmcli/nmtui?
                                  • 0
                                    Потому что nmcli более навороченный и ему учат в курсе, а nmtui интуитивно понятен и сэкономит время на экзамене.

                                    Поражаюсь вашей усидчивости — у меня учебник пошел намного быстрее, тем более курс построен вокруг лаб и зубрёжки команд.
                                    • 0
                                      Усидчивость не будет лишней при подготовке к экзаменам RHCSA/RHCE. К поcледнему я, собственно, активно готовлюсь. Согласен, «забрёжный момент» весьма присутсвует при подготовке, но сами экзамены и подготовка к ним гораздо интереснее и «reallife-нее», что-ли, чем, скажем, CCNA/CCNP или Comptia.
                                    • 0
                                      потому что она depricated начиная с RHEL6
                                      это псевдоним к ip
                                      причём довольно криво работающий
                                      • 0
                                        Sander так же говорил, что рекомендует пользоваться nmcli, потому что nmtui переодически вываливается с ошибкой.
                                    • +2
                                      net-tools ставится как зависимость для open-vm-tools, а chkconfig и service сделали алиасами для systemclt.
                                    • 0
                                      Про SeLinux и Samba
                                      Насколько я понимаю это глобальные разрешения:
                                      # setsebool -P samba_export_all_ro=1
                                      # setsebool -P samba_export_all_rw=1
                                      но так не совсем правильно поступать… Для конкретной директории доступ к которой необходимо предоставить Samba делается так:
                                      # semanage fcontext -a -t samba_share_t '/mnt/storage/files(/.*)?'
                                      # restorecon -Rv '/mnt/storage/files'
                                      Если Вам нужно подружить одну директорию с Samba и еще что либо (Apache, VSFtpd) то делаем так:
                                      # semanage fcontext -a -t public_content_rw_t '/mnt/storage/web(/.*)?'
                                      # restorecon -Rv '/mnt/storage/web'
                                      Далее добавляем сами сервисы:
                                      # setsebool -P allow_smbd_anon_write 1
                                      # setsebool -P allow_httpd_anon_write 1
                                      # setsebool -P allow_ftpd_anon_write 1

                                      Также есть public_content_t если запись не нужна.

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