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

Привет Хабр!
После активности шифровальщика 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.
Получение ip адреса по DHCP
Если по какой-то причине в сети нету DHCP сервера, вам стоит его поднять. Работать с большим количеством VM без DHCP не удобно.
Для принудительного обновления или получения ip адреса выполните команду
Показать ip адрес
CentOS 7 использует пакетный менеджер YUM. Шпаргалка по yum находится тут.
Если выход в интернет организован через прокси сервер, добавьте адрес прокси в файл конфигурации /etc/yum.conf, используйте редактор vi или следующую команду
В случае использования логина и пароля для доступа к прокси серверу, добавьте следующие параметры:
Установка на VM агентов для взаимодействия с хост сервером
Для VMware ESXi необходимо установить open-vm-tools
Для Hyper-V, hyperv-daemons
Установка обновлений
Очень важно установить все доступные обновления
Midnight Commander
Редактировать файлы без нормального редактора очень не удобно, и я предлагаю использовать mc и mcedit
Настройка сети
Для настройки статического ip адреса и имени хоста можно использовать утилиту nmtui

В командной строке список сетевых адаптеров можно получить командой
Статический ip и gateway задается следующей командой, где «ens192» это имя сетевого адаптера
Настройка FQDN
Пусть полное имя хоста будет ls01.fqdn.com, выполняем команду
Перезагружаем службу имен
Проверить результат можно следующими командами
Если протокол ipv6 не используется, логично его отключить, для этого нужно добавить два параметра в файл /etc/sysctl.conf, выполните следующие команды или используйте редактор mcedit
Перезагрузите службу сети
SELINUX
На данном этапе службу SELINUX необходимо отключить, проверить статус службы SELINUX можно командой
Измените значение SELINUX в файле /etc/selinux/config на SELINUX=disabled затем перезагрузите сервер.
Вернусь к SELINUX в конце статьи.
SAMBA
Добавление службы в автоматический запуск
Запуск службы и проверка состояния
firewallD
По умолчанию CentOS 7 использует брандмауэр firewallD, состояние службы можно узнать командой
Для получения списка правил и сервисов используйте

Обратите внимание на список сервисов, если вы отключили протокол ipv6, логично также поступить и с dhcpv6-client
Создаем правило для SAMBA и перезагружаем
Общий ресурс с анонимным доступом
Создаем папку для ресурса /samba/guest
Меняем владельца и назначаем права
Редактируем файл конфигурации SAMBA /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 и ниже не смогут получить доступ к ресурсам.
Проверка параметров и перезагрузка службы
Поздравляю вас, достигнут первый уровень посвящения. Общий ресурс с анонимным доступом настроен, будет работать долго и надежно. Но можно и нужно настроить еще несколько вещей.
Бантики
Конфигурация SAMBA находиться в каталоге /etc/samba, а логи в каталоге /var/log/samba
Мне удобней все инструменты держать по рукой, по этому я монтирую необходимые мне каталоги в /samba
Создаем каталоги, в которые будет все монтироваться
Редактируем конфиг файл /etc/fstab, я предполагаю что вы знаете за что отвечает fstab.
Добавляем следующие строки
Монтируем без перезагрузки
Подключение диска
Держать ресурс с общим доступом на системном диске без квоты, не лучший выбор. С квотами я решил не связываться, мне проще подключить отдельный «физический» диск.
Для получения списка устройств можно использовать команду lsblk
Создание таблицы разделов на диске /dev/sdb
Подробную информация про gpt можно прочитать тут
Создание раздела на весь диск sdb, в лучших традициях жанра я решил сделать отступ 1MiB в начале диска.
Создаем файловую систему ext4
Добавляем еще одну строку
Подключение образа диска
Если вам не нужны большие объемы, и достаточно ресурса размером ххх мб, можно подключить образ диска из файла.
Создаем каталог для хранения образов
Создаем файл образа размером 100 мб
Про команду dd много интересного можно прочитать тут
В варианте с образом я решил не создавать таблицу разделов, просто создаем файловую систему ext4.
Конфиг для монтирования образа
Подключение RAM диска
Для временных ресурсов где не нужен большой объем, как мне кажется RAM диск это наилучший вариант, очень быстро и просто настраивается, а скорость работы поражает воображение.
Конфиг для RAM диска
Удаление старых файлов
В случае «файлопомойки» ресурсы нужно как-то освобождать, для этого можно использовать планировщик задач crontab
#удалять файлы и каталоги каждый час
* 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 <> \;
Логи службы 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 адресам не всегда удобно или возможно, тогда можно использовать логины и пароли.
Сначала необходимо создать локального пользователя в системе
Если пользователь будет работать только с SAMBA ресурсами, задавать ему пароль для системы нет необходимости. Пароль для системы и для SAMBA хранятся в разных файлах и могут отличаться.
Затем необходимо добавить системного пользователя в пользователи самбы и задать ему пароль
По умолчанию для хранения паролей используется файл формата tdb, которые расположен в каталоге /var/lib/samba/private/
Изменить каталог расположения файла можно глобальным параметром passdb backend
tdb файлы были созданы для замены «устаревших» текстовых, если вы хотите использовать текстовые файлы, для этого используйте параметр passdb backend=smbpasswd в разделе global
passdb backend=smbpasswd:/etc/samba/smbpasswd
Затем укажите списки пользователей и групп для доступа к ресурсам
Интеграция с Active Directory
Также есть возможность получать информацию о пользователей из LDAP, но мне этот вариант не интересен и я сразу перехожу к AD. Подробная инструкция от Microsoft находится тут.
Для AD очень важна синхронизация времени, по этому стоит начать с этого.
Установка соответствующей службы
Добавляем в конфиг файл /etc/ntp.conf сервера выполняющих роль домен контроллеров
Добавляем службу ntp в автоматический запуск
Проверяем синхронизацию времени
winbind
Для получения информации о пользователях из AD необходимо установить пакет samba-winbind
Добавляем службу в автоматический запуск
Добавление хоста в AD
Напомню что в начале даной инструкции задали имя хоста ls01.fqdn.com. Будем считать что полное имя домена fqdn.com, а короткое пусть будет fqdn_com
Для внесения всех необходимых параметров в конфигурационные файлы можно воспользоваться утилитой authconfig-tui, установите флажок Use Winbind, затем перейдите на следующее окно

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

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

Если машина не добавляется в домен, добавьте FQDN имя хоста в файл /etc/hosts.
Я несколько раз все проверял, и в файл hosts я вносил изменения когда на этапе настройки сети задавал не полное имя хоста.
Для того чтобы вывести хост из домена используйте команду net ads leave –U %username%
Что делает утилита authconfig-tui?
Утилита добавляет параметры для подключения к AD в следующие файлы, параметров не много и при желании можно забить все руками.
Вы могли заметить что данная утилита вносит заметно меньше параметров чем написано в инструкции от Microsoft или других инструкциях, но если так работать – то почему бы и нет?
Из инструкции Microsoft я добавляю следующие параметры в конфиг
[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
На скриншоте видно пользователя домена который находится в одной из общих папок 
Список полезных ссылок:
P.S.
Вернемся к SELINUX, чтобы SAMBA сервер мог предоставить доступ к любым каталогам необходимо выполнить следующие команды
К сожалению я так и не смог настроить работу winbind при включенном SELINUX, если подскажете как, я буду благодарен.
First lets configure the Samba client on centOS
Now to use CentOS as client we must have another machine which act as server for our machine I choose Windows 7 you may choose another OS, little bit of steps may change but the concept is same almost.
Now in windows create your shared folder and assign the permission according to your purpose.
I created a folder inside my c drive named Smb_Share, then just right click to properties to share the folder.
Now get back to your Centos Machine and type this command in terminal. smbclient -U mukul -L //192.168.1.14 where -U is for user and -L is for host
After knowing the folder name now we can directly access the folder using command smbclient -U mukul //192.168.1.14/Smb_Share
After getting inside the machine use “?” command to know different commands
use get command like get filename to download any file to our system and the important thing is that file downloaded inside the directory from which you make connection like here I make connection from /root directory so all file downloaded inside this directory.
if you have write permission then you can also use mkdir command to make directory inside the shared folder here i create demo directory.
Use can use “mget” command to download multiple file from smb client.“Lcd” command is used for seeing current directory list like ls command in terminal.
“put” command is similar to get command but instead of downloading it upload the file to the server. And for multiple file use “mput”(m=multiple).
“del filename” command is used to delete the file “deltree Pictures\desktop.ini ” commands helps to delete the desktop.ini file so with deltree we can delete the directory inside file.
“Smbget” command if you know the file name then without making whole connection you can use smbget to directly download the file. As shown in image.
smbget -U mukul smg://192.168.1.14/Smb_Share/iecompat.dll
All these method are good only when your interaction with the shared folder is limited or may be one or two times a day but what will happen if your interaction with shared folder is on regular basis therefore sometimes network administrator mount the shared folder on system to make it easier for all to access it and sometimes users are not such qualified in all the things to make it accessible for all time. So only solution remained to permanently mount the folder to user system.
Before mounting we must know about Common Internet File System (CIFS) which is a network filesystem protocol used for providing shared access to files and printers between machines on the network. A CIFS client application can read, write, edit and even remove files on the remote server.
To download it use : yum install cifs-utils
Now to mount :mount -t cifs //192.168.1.14/Smb_Share -o user=mukul,password=123 /mnt/data
where user is mukul and password is 123, -t type of file system which is cifs, the Smb_Share folder is mount to the /mnt/data folder. To verify it use command:df -h
Now naviagate to /mnt/data to folder to verify
Last thing remain is to permanently Mount the shared folder.
vim /etc/fstab use this command to open fstab file and edit this file like i shown in above image. Here i use vim text editor you can use anyone and also you can add password just right to user=mukul but i choose not too. then just save and exit. type mount -a command to crosscheck. after this if the machine restart out mount folder remain mounted.
Configuring the samba(smb) on centOS 7 and using windows machine as a client.
Start with installing package for samba : Yum install samba*
2. Create the shared folder and put the data inside it, which you wanna to share. Gives permission to that folder according to your need. Like i create smb_data folder with permission 777 in recursive manner but i suggest you to use 775 permission chmod -R 0775 smb_data/ just crosscheck with ls -lha command
3. Add the users which you want to access the data like I create smbuser1 then create its password and smbpassword for security purposes. For more users you can make a group people and add members to this group and assign permission accordingly.
4. Now the main step is to edit the smb.config file inside /etc/samba/smb.conf using any text editor add these lines as shown in image.
[data]
comment = smb_data
path = /root/smb_data
public= yes
writable = yes
user list = smbuser1
here path decide the path of our shared folder, public=yes means available to people inside network, writable means giving write permission and user list the users which can access this shares folder.
5. Allow the port to make connection with Windows machine you can use firewalld but i mostly prefer iptables so I edit vim /etc/sysconfig/iptables and allow 445 port then restart the iptables service using systemctl restart iptables.service and to check whether port is open or not use iptables -n -L command.
6. Just restart the smb service systemctl restart smb.service
7. Now on client windows machine use run to access the shared folder by typing ip of centOS server \\192.168.1.12 and authenticate the smbuser1
Открываем общий доступ к папкам и файлам через Samba

После установки открываем конфиг /etc/samba/smb.conf, и начинаем его править под свои нужды. В секции [Global] правим следующие параметры:
Если ваш компьютер является еще в добавок и маршрутизатором, и имеет более чем 1 сетевую карту, будет не лишним указать, какой из имеющихся интерфейсов слушать:
Указываем нужное имя рабочей группы. По умолчанию стоит WORKGROUP.
Проверяем, есть ли параметр security, если нет, то выставляем ему значение user.
Доступ без авторизации
Расшарим папку music по адресу /var/music для всех пользователей (авторизация не будет требоваться). Имя папки, с которым её будут видеть пользователи которые зашли на шару задается в квадратных скобках (в данном случае — Music).
В данную папку будет иметь доступ кто угодно, но не сможет записывать (загружать, заливать) и удалять файлы без авторизации. Для того, чтобы дать неавторизованному пользователю полный доступ для работы с файлами и папками, воспользуемся параметром force user . Данный параметр отвечает за то, под каким пользователем будут выполняться операции с файлами в данной директории — например, если мы создадим пользователя samba-guest, и выдадим ему полные права на данную папку, а в force user пропишем значение samba-guest, то дадим полный доступ к директории:
Доступ с авторизацией
Теперь перейдем к тому, чтобы разрешить доступ к папке только определенному пользователю — к примеру, пользователю crazysysadmin.
Samba как и большинство приложений Linux использует для своих нужд уже существующих пользователей системы, поэтому нужно использовать либо уже имеющуюся учетную запись, либо создать новую. Создать нового пользователя можно командой useradd:
Затем нужно добавить пользователя в Samba:
И активировать его:
Если нужно поменять пароль пользователю samba, то это можно сделать следующей командой:
Теперь сделаем доступ к шаре music только для чтения для неавторизованных пользователей, и полный доступ для пользователя crazysysadmin:
Как должно быть понятно из примера выше, то все отличие заключается в строчке admin users — туда задаются пользователи с правами полного доступа на директорию. Так же туда можно добавлять и целые группы из системы — для этого перед её именем нужно поставить символ @ — например @admins.
Если же нужно сделать так, чтобы никто кроме пользователя crazysysadmin не имел доступа к этому каталогу (даже на просмотр), то просто меняем параметр guest ok на no:
Настройка Samba сервера в CentOS
Добавление нового пользователя происходит в два этапа: первый — добавление пользователя в систему.
Ключ -M означает, что для пользователя не будет создана домашняя папка, ключ -G users добавит пользователя в группу users, а -s /sbin/nologin не позволит пользователю выполнить вход в систему.
Вторым этапом добавим пользователя в базу tdbsam (возможно потребуется указать пароль, именно этот пароль будет использоваться для авторизации при доступе к общей папке)
Настраиваем автозапуск
Также потребуется настроить Firewall, а именно порты 137 , 138 , 139 , 445