Найти тему
Тюнинг Админа

Файловый сервер для компании на Ubuntu 22.04 LTS + Samba 4.15.13

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

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

-2

Отключим службу сопоставления 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

-3

Если у вас также все срослось двигаемся дальше.

Удаляем полученный тикет:

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

-4

Если у вас, что то не сложилось выводим наш 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 клиентского компьютера:

-5

У пользователя John есть полные права на папку Documents, но нет прав даже на чтение папки Soft и его естественно не пускает.

-6

Настройка сетевой корзины

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

Создадим папку для нашей корзины:

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 удаляет файл:

-7

На сервере в консоли запускаю mc и лезу в папку recycle:

-8

Видим, что John что-то удалил, заходим и видим, да именно он удалил наш файл:

-9

Перемещаем между папками нажав F6 и Enter:

-10

Автоматизированная очистка Корзины

Рано или поздно ваша сетевая корзина начнет разрастаться и ее необходимо будет чистить от мусора. Для автоматизации этой задачи создадим скрипт который будет удалять содержимое старше 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 и копируем нужные нам данные в рабочую папку пользователей:

-11

Выбираем и копируем нажимая F5(восстанавливая) содержимое /backup/Documents в /Documents

-12

На этом всё, старался как можно доступнее описать процесс

Вывод:

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