Файловое хранилище в любой среде является средством первой необходимости, даже в совсем небольших сетях без доменной структуры присутствуют папки с общим доступом и для удобства использования и резервного копирования рано или поздно приходят к тому, что необходим отдельный специализированный ресурс.
Samba это отличное решение по организации общего доступа к файлам и папкам в Windows сетях, а также контроллеров домена.
В этой статье мы рассмотрим вариант хранилища с авторизацией пользователей active directory, которая в моём случае реализована на базе Samba 4.15.13
Содержание статьи
- Системные требования
- Подготовка сервера
- Установка и настройка Kerberos
- Установка и настройка Samba
- Настройка Winbind
- Публикация папок в общий доступ
- Настройка сетевой корзины
- Автоматизированная очистка Корзины
- Настройка Firewall
- Настройка параметров доступа Samba
- Подключение NFS хранилища
- Бэкап
- Восстановление данных
- Вывод
Системные требования
Требования по аппаратной части:
- Процессор: 2 ядра от 1Ггц
- Оперативная память: 1ГБ
- Жёсткий диск: от 10ГБ
Конфигурация сети:
- Cтатический ip адрес
- Имя хоста samba
Подготовка сервера
Повышение прав доступа:
sudo -s
Установим имя нашему серверу:
hostnamectl set-hostname samba.tuning-admina.local
Правим конфигурационный файл /etc/hosts:
127.0.0.1 samba.tuning-admina.local samba
Проверяем командой:
hostnamectl status
Отключим службу сопоставления DNS:
systemctl disable --now systemd-resolved
Удалим символьную ссылку на файл конфигурации:
unlink /etc/resolv.conf
Создадим новый файл конфигурации:
touch /etc/resolv.conf
Приведем файл к следующему виду:
nano /etc/resolv.conf
# IP адреса Samba серверов
nameserver 192.168.1.1
nameserver 192.168.1.2
# Главный домен для Samba поиска
tuning-admina.local
Сохраняем и закрываем редактор:
CTRL+O,CTRL+X
Делаем файл конфигурации неизменяемым:
chattr +i /etc/resolv.conf
Настраиваем сеть, для этого отредактируем конфигурационный файл:
nano /etc/netplan/00-installer-config.yaml
network:
ethernets:
ens18:
dhcp4: false
addresses: [192.168.1.3/24]
gateway4: 192.168.1.254
nameservers:
addresses: [192.168.1.1,192.168.1.2]
version: 2
Сохраняем и закрываем редактор:
CTRL+O,CTRL+X
Применяем настройки:
netplan apply
Обновление пакетов и их зависимостей:
apt update && apt upgrade -y
Устанавливаем временную зону:
timedatectl set-timezone Europe/Moscow
Установим службу синхронизации времени:
apt install chrony -y
Добавляем в автозапуск службу:
systemctl enable chrony
Устанавливаем дополнительные пакеты:
apt install mc net-tools -y
Перезагружаем сервер:
reboot
Установка и настройка Kerberos
Устанавливаем пакет krb5-user:
apt install krb5-user
Приводим конфигурационный файл /etc/krb5.conf к следующему виду:
nano /etc/krb5.conf
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = TUNING-ADMINA.LOCAL
dns_lookup_kdc = false
dns_lookup_realm = false
forwardable = true
ticket_lifetime = 24h
[realms]
TUNING-ADMINA.LOCAL = {
kdc = ns1.tuning-admina.local
default_domain = TUNING-ADMINA.LOCAL
admin_server = ns1.tuning-admina.local
}
[domain_realm]
.tuning-admina.local = TUNING-ADMINA.LOCAL
tuning-admina.local = TUNING-ADMINA.LOCAL
Сохраняем и закрываем редактор:
CTRL+O,CTRL+X
Проверяем работу kerberos:
kinit administrator@TUNING-ADMINA.LOCAL
Вводим пароль и должны увидеть следующее:
Password for administrator@TUNING-ADMINA.LOCAL:
Warning: Your password will expire in 35 days on Ср 30 авг 2023 14:50:51
Получаем тикет администратора:
klist
Если у вас также все срослось двигаемся дальше.
Удаляем полученный тикет:
kdestroy
Установка и настройка Samba
Установим необходимые пакеты:
apt install samba cifs-utils winbind libnss-winbind libpam-winbind -y
Приводим конфигурационный файл samba к следующему виду:
nano /etc/samba/smb.conf
[global]
realm = TUNING-ADMINA.LOCAL
workgroup = TUNING-ADMINA
security = ads
encrypt passwords = yes
netbios name = samba
server string = %h, Samba server %v
domain master = no
local master = no
preferred master = no
os level = 0
domain logons = no
dns proxy = no
socket options = TCP_NODELAY
unix charset = UTF-8
dos charset = 866
idmap config * : backend = tdb
idmap config * : range = 3000-7999
idmap config TUNING-ADMINA : backend = rid
idmap config TUNING-ADMINA : range = 10000-999999
winbind enum users = yes
winbind enum groups = yes
winbind refresh tickets = yes
winbind use default domain = yes
winbind offline logon = yes
winbind cache time = 300
template homedir = /Documents/%U
template shell = /bin/bash
load printers = no
show add printer wizard = no
printcap name = /dev/null
disable spoolss = yes
log level = 0 vfs:1
Сохраняем и закрываем редактор:
CTRL+O,CTRL+X
Увеличим лимит на одновременно открытые файлы до 16384:
nano /etc/security/limits.conf
В самом низу файла добавляем:
* - nofile 16384
root - nofile 16384
Сохраняем и закрываем редактор:
CTRL+O,CTRL+X
Проверяем на ошибки файл конфигурации Samba утилитой testparm:
testparm
Если ошибок нет то увидим следующее:
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_DOMAIN_MEMBER
Перезагрузим наш сервер:
reboot
Вводим наш Samba сервер в домен:
net ads join -U administrator@tuning-admina.local
Вводим пароль администратора:
Password for [administrator@tuning-admina.local]:
И видим такой результат:
Using short domain name -- TUNING-ADMINA
Joined 'SAMBA' to dns domain 'tuning-admina.local'
Все наш Samba сервер в домене, поздравляю.
Настройка Winbind
Теперь нам необходимо отредактировать конфигурационный файл /etc/nsswitch.conf для того, чтобы видеть и пользоваться учётными записями и группами домена, изменим параметры passwd и group:
nano /etc/nsswitch.conf
passwd: files winbind
group: files winbind
Сохраняем и закрываем редактор:
CTRL+O,CTRL+X
Добавляем службу winbind в автозагрузку:
systemctl enable winbind
Перезапускаем службу winbind:
systemctl restart winbind
Проверяем доверительные отношения с контроллером домена:
wbinfo -t
Мы должны увидеть следующее:
checking the trust secret for domain TUNING-ADMINA via RPC calls succeeded
Выводим список пользователей домена:
wbinfo -u
krbtgt
john
guest
administrator
Выводим список групп домена:
wbinfo -g
Если у вас, что то не сложилось выводим наш Samba из домена, удаляем установленные пакеты и конфигурационные файлы и повторяем процедуры внимательно ничего не пропустив.
Публикация папок в общий доступ
Создадим папки для публикации:
mkdir /Documents
mkdir /Soft
Делаем полные права доступа на эти папки:
chmod 777 /Documents
chmod 777 /Soft
Добавляем в конфигурационный файл Samba информацию о папках и правах доступа:
nano /etc/samba/smb.conf
[Documents]
writeable = yes
read list = //Права доступа на чтение
valid users = "@domain admins" "@domain users" //Доступ разрешен
path = /Documents //Путь к директории
[Soft]
writeable = yes
read list = //Права доступа на чтение
valid users = "@domain admins" //Доступ разрешен
path = /Soft //Путь к директории
Сохраняем и закрываем редактор:
CTRL+O,CTRL+X
Перезапускаем службы Samba:
systemctl restart smbd
systemctl restart nmbd
На этом все идем проверять наши папки с W10 клиентского компьютера:
У пользователя John есть полные права на папку Documents, но нет прав даже на чтение папки Soft и его естественно не пускает.
Настройка сетевой корзины
Предлагаю не откладывать в долгий ящик и настроить корзину, так как человеческий фактор никто не отменял и в случае удаления содержимого вы легко сможете восстановить данные.
Создадим папку для нашей корзины:
mkdir /recycle
Делаем полные права доступа на эту папку:
chmod 777 /recycle
Добавляем в секцию [Documents] конфигурационного файла Samba:
nano /etc/samba/smb.conf
vfs object = recycle
recycle:repository = /recycle/%U
recycle:keeptree = yes
recycle:versions = yes
recycle:touch = yes
recylce:exclude_dir = /tmp /TMP /temp /TEMP /public /cache /CACHE
recycle:exclude = *.TMP *.tmp *.temp ~$* *.log *.bak
Сохраняем и закрываем редактор:
CTRL+O,CTRL+X
Перезапускаем службы Samba:
systemctl restart smbd
systemctl restart nmbd
Проверяем, пользователь John удаляет файл:
На сервере в консоли запускаю mc и лезу в папку recycle:
Видим, что John что-то удалил, заходим и видим, да именно он удалил наш файл:
Перемещаем между папками нажав F6 и Enter:
Автоматизированная очистка Корзины
Рано или поздно ваша сетевая корзина начнет разрастаться и ее необходимо будет чистить от мусора. Для автоматизации этой задачи создадим скрипт который будет удалять содержимое старше 30 дней.
nano /recycle.sh
#!/bin/bash
find /recycle/ -type f -mtime +30 -exec rm -rf {} \;
Сохраняем и закрываем редактор:
CTRL+O,CTRL+X
Делаем файл исполняемым:
chmod +x /recycle.sh
Для запуска скрипта по расписанию ежедневно в 22:00 добавим задание в планировщик cron:
Запускаем cron:
crontab -e
Выбираем nano в качестве редактора: 1
7 22 * * * root /recycle.sh
Сохраняем и закрываем редактор:
CTRL+O,CTRL+X
По просьбам трудящихся выкладываю полный конфигурационный файл /etc/samba/smb.conf
[global]
realm = TUNING-ADMINA.LOCAL
workgroup = TUNING-ADMINA
security = ads
encrypt passwords = yes
netbios name = samba
server string = %h, Samba server %v
domain master = no
local master = no
preferred master = no
os level = 0
domain logons = no
dns proxy = no
socket options = TCP_NODELAY
unix charset = UTF-8
dos charset = 866
idmap config * : backend = tdb
idmap config * : range = 3000-7999
idmap config TUNING-ADMINA : backend = rid
idmap config TUNING-ADMINA : range = 10000-999999
winbind enum users = yes
winbind enum groups = yes
winbind refresh tickets = yes
winbind use default domain = yes
winbind offline logon = yes
winbind cache time = 300
template homedir = /Documents/%D/%U
template shell = /bin/bash
load printers = no
show add printer wizard = no
printcap name = /dev/null
disable spoolss = yes
log level = 0 vfs:1
[Documents]
writeable = yes
read list =
valid users = "@domain admins" "@domain users"
path = /Documents
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
[Soft]
writeable = yes
read list =
valid users = "@domain admins"
path = /Soft
Настройка брандмауэра ufw
Добавляем брандмауэр ufw в автозагрузку:
systemctl enable ufw
Проверяем статус службы:
systemctl status ufw
Если статус: inactive
Запускаем службу:
systemctl start ufw
Разрешаем доступ к серверу по SSH только с определенного адреса/сети:
ufw allow from 192.168.1.0/24 to any port 22
Разрешаем доступ к портам 137-139, 445, которые использует Samba:
ufw allow from 192.168.1.0/24 to any port 137-139, 445
Всё остальные порты на вход блокируем:
ufw deny all
Настройка параметров доступа Samba
Параметр hosts allow добавленный в секцию [global] разрешает доступ к нашему файловому серверу с определённых хостов и сетей:
hosts allow = boss, 192.168.1., 192.168.1.0/255.255.255.0
Параметр hosts deny добавленный в секцию создаёт запрет на доступ для хостов и сетей:
hosts deny = manager, 192.168.2., 192.168.2.0/255.255.255.0
Это правило исключает адреса из этого диапазона:
hosts deny = ALL EXCEPT 192.168.3.0/24
Подключение NFS хранилища
Для чего спрашивается к файловому серверу подключать хранилище? Я например вижу в этом следующие возможности:
- Для бэкапа важной информации
- Для миграции данных с одного узла на другой.
- Огромные архивы не обязательно держать на файловом сервере или папки админов с софтом тем самым без явной необходимости раздувать объём хранения. Тем самым мы их мапим и подключаем как шары с разными правами доступа.
Для подключения NFS хранилища в качестве хранения данных или бэкапов, необходимо установить клиент:
apt install nfs-common
Создание каталога в качестве точки монтирования:
mkdir /Backup
Подключение nfs шары в качестве локальной папки:
mount ip_адрес_nfs:/backup/samba /Backup
Добавляем монтирование NFS каталога в автозагрузку:
nano /etc/fstab
ip_адрес_nfs:/backup/samba /Backup nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
Бэкап
В нашем случае мы будем настраивать автоматизированный бэкап путем запуска скрипта планировщиком заданий Cron по расписанию ежедневно в 22:00.
Создаем скрипт:
nano /backup.sh
#!/bin/sh
tar -czvf /Backup/Documents-`date +"%Y-%m-%d_%H-%M"`.tgz /Documents
find /Backup -type f -mtime +14 -exec rm {} \;
Сохраняем и закрываем редактор:
CTRL+O,CTRL+X
Делаем наш скрипт исполняемым:
chmod +x /backup.sh
Для запуска скрипта по расписанию ежедневно в 22:00 добавим задание в планировщик cron:
Запускаем cron:
crontab -e
Выбираем nano в качестве редактора: 1
00 22 * * * root /backup.sh
Сохраняем и закрываем редактор:
CTRL+O,CTRL+X
Восстановление данных
Переходим в каталог Backup:
cd /Backup
Выводим список содержимого:
ls
Documents-2023-07-27_12-27.tgz Documents-2023-07-27_13-15.tgz
Распаковываем нужный нам архив:
tar -xvzf Documents-2023-07-27_13-15.tgz
Запускаем mc и копируем нужные нам данные в рабочую папку пользователей:
Выбираем и копируем нажимая F5(восстанавливая) содержимое /backup/Documents в /Documents
На этом всё, старался как можно доступнее описать процесс
Вывод:
Советую присмотреться к решению, так как оно является достаточно надёжным, простым в настройке и использовании, а также минимально требовательным к ресурсам.