Реализуем сервис файлового сервера на Astra Linux

Часть первая: Исследование возможности импортозамещения файлового сервер

В этой части про практическую реализацию файлового сервера на отечественном стеке

Дисклеймер

Данная статья представляет собой личное мнение автора о требованиях и работе файловых серверов. Предназначена в первую очередь чтобы поделится собственным опытом. Информация, изложенная в статье, основана на собственных исследованиях и опыте работы, и может не отражать общепринятые мнения или практики. Автор не стремится выставить кого-либо в плохом свете и призывает к конструктивному обсуждению. Рекомендуется дополнительно изучать источники для более глубокого понимания темы.

Хотелось бы привести тут пару тройку скриншотов где было бы GUI с развёртыванием сервиса и сказать что всё довольно просто. Увы, но очень много особенностей и текста в связи с этим увы по максимально по верхам без глубокого погружения в темы.

Муки выбора

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

Варианты конструктора и почему я выбрал то что выбрал:

Astra Linux GUI +LVM+ext4+ Samba Server + xattr — Многие скажут зачем усложнять и возможно будут правы. Да Samba умеет эмулировать права NTFS. Но права будут только в Samba никак использовать данные о правах кроме как в самбе не выйдет. Для управления этими правами потребуется Windows машина или смирение с RWX правами. Невозможностью использования указанных прав при отдачи по иным протоколам. Будут проблемы с регистра зависимостью. Также решение не позволит реализовать дедупликацию и сжатие данных. Проблема с длинной имён файлов останется не решённой. С реализацией теневых копий будут значимые проблемы.

Astra Linux GUI +btrfs+ Samba Server — Заметно веселее, Уже есть snapshot`ы и сжатие данных, но теже права rwx без перспектив появления чего-то более весёлого. Регистра зависимость. Проблема с длинной имён файлов останется не решённой (я не нашел как реализовать длину имени файла более 255 символов).

Astra Linux GUI +NTFS+ Samba Server — крайне заманчивая идея, но это очевидная заплатка и главное для управления нужна Windows машина.

Astra Linux GUI +ZFS+ Samba Server — по сути дела максимально приближенное решение к Windows Server. ОС Linux без патчей не поддерживает полноценно права по модели NFSv4, но фундаментально это возможно (см.TrueNAS от iXsystems), как заметил @xanto в комментарии к предыдущей статье в релизе ZFS 2.3 появится поддержка long names, а пока я понимаю как сделать RWX (понимаю что NFSv4 можно ожидать в ближайших релизах очень надеюсь на содействие и необходимые патчи от Астры, Рэдсофт и Базаль СПО), есть snapshot`ы, дедупликация и сжатие данных, наследование прав и нечувствительность к регистру.

т.к. моё блокирующее правило выбора, реальное импортозамещение, выбран вариант с ZFS о нём далее:

План развёртывания:

→Разворачиваем актуальную версию Astra Linux 1.8.1.12 на ядре 6.1 (на ядре 6.6 не работает ZFS из коробки) 4vCPU+10Gb ОЗУ+ HDD 60Gb (astra) + НDD 2Tb (UserData) за пределами этой статьи
→поиск на источнике файлов длина имени файлов более 255 байт и решение проблем
→Устанавливаем необходимые пакеты
→Настройка Kerberos
→Настройка Samba server
→включение в домен MS AD
→Настройка ZFS
→Настройка утёных записей доменных администраторов для управления сервером
→Применение матрицы доступа на сетевую шару и последующая заливка данных.

Подложим соломку т.е. ищем длинные имена файлов

Для того чтобы не наступить на грабли того, что файловая система в Linux не может сохранить файл с длинной имени файла более 128 символов на кирилице предварительно в Windows Server рекомендую проверить шары на факт наличия в них файлов что не влезут в файловую систему Linux
Пример скрипта на PowerShell для этих целей.

# Укажите путь к папке, в которой нужно искать файлы
$folderPath = «C:\»
# Укажите файл в который сохранить результат
$ResultSaveToFile =«C:\FileToRename.txt»

# Функция для получения размера имени файла в байтах
function Get-FileNameSizeInBytes {
param ([string]$fileName)
return [System.Text.Encoding]:: UTF8.GetByteCount ($fileName)
}

# Ищем файлы с не-латинскими символами в имени и длиной больше maxLength
$files = Get-ChildItem -Path $folderPath -Recurse -File | Where-Object { (Get-FileNameSizeInBytes $_.Name) -gt 255 }

# Сохраним результаты в файл
$files | ForEach-Object { $_.FullName } | Set-Content -Path $ResultSaveToFile -Encoding UTF8
If ($files.count -ge 1) {
Write-Host «Поиск завершен. Результаты сохранены в FileToRename.txt» -ForegroundColor Green
} else {Write-Host «Поиск завершен. Не найдены файлы с длинной имени более 255 байт» -ForegroundColor Green}

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

Настройка репозиториев:

После установки астра работает только с репой из диска, правим файл
/etc/apt/source.list
так чтобы стало:

nano /etc/apt/source.list

deb https://download.astralinux.ru/astra/stable/1.8_x86–64/repository-main/ 1.8_x86–64 main contrib non-free non-free-firmware
deb https://download.astralinux.ru/astra/stable/1.8_x86–64/repository-extended/ 1.8_x86–64 main contrib non-free non-free-firmware

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

Установка пакетов:

sudo apt install -y krb5-user winbind libpam-krb5 libpam-winbind libnss-winbind acl attr dnsutils chrony samba zfsutils-linux smbldap-tools zfs-$(uname -r) zfsutils-linux
sudo reboot

и подключение модуля ядра ZFS
sudo /sbin/modprobe zfs
sudo reboot

Настройка синхронизации времени

Создаём файл конфигурации для синхронизации времени:
nano /etc/chrony/conf.d/<имя домена>.conf

Содержимым (указываем все контроллеры домена + хотябы один IP адрес сервера с которым можем синхронизироваться метка prefer обозначает что этот узел предпочтителен для синхронизации времени):

server prefer
server dc2.habr.ru.
server

Остальные серверы из конфига /etc/chrony/chrony.conf вероятно лучше закомментировать время важно! в целом может быть каким угодно, но главное чтобы одним в домене.

Настройка Kerberos

Переводим текущие настройки в резерв.
mv /etc/krb5.conf /etc/krb5.conf.backup
Формируем файл /etc/krb5.conf
Замените habr.ru на свой домен и контроллеры домена. Регистр написания имени домена важен, habr.ru неравен hAbr.RU из за этого могут быть проблемы при вводе в домен.

[libdefaults]
default_realm = HABR.RU
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
[realms]
HABR.RU = {
kdc = dc1.habr.ru
kdc = dc2.habr.ru
kdc = dc3.habr.ru
admin_server = dc3.habr.ru
default_domain = habr.ru
}
[domain_realm]
.habr.ru = HABR.RU
habr.ru = HABR.RU
[login]
krb4_convert = false
krb4_get_tickets = false

Проверяем как работает в (на этом этапе вам потребуется пользователь из домена)

kinit <имя пользователя из домена >

Должно спросить пароль и не выдать ошибок если выдаёт ошибки пробуйте различное написание помните linux регистразависимый.

Настройка Samba

nano /etc/samba/smb.conf

[global]
security = ADS
server string= Fileserver
workgroup = HABR
realm = habr.ru
idmap config * : backend = tdb
idmap config * : range = 3000–7999

idmap config habr.ru: backend = rid
idmap config habr.ru: range = 10000–999999

template shell = /bin/bash
template homedir = /home/%U@%D

client min protocol = SMB2
client max protocol = SMB3
winbind enum groups = yes
winbind enum users = yes
winbind nested groups = yes
winbind use default domain = yes
winbind refresh tickets = yes

unix charset = utf-8
dos charset = cp866
nt acl support = yes
acl group control = yes
map acl inherit = yes
unix password sync = yes
preferred master = No
local master = No
domain master = No
wide links = yes

Конфиг рабочий, описание параметров тут https://www.samba.org/samba/docs/man/ Вам нужно заменить имя домена. Также обращаю внимание что имя должно быть в томже регистре что ваш домен был записан во время создания. Регистр написания имени домена важен, habr.ru неравен hAbr.RU из за этого могут быть проблемы при вводе в домен.
К сожалению если тут всё писать то статья станет совсем монструозной

#Рестарт служб связанных с Samba server
sudo systemctl restart winbind smbd nmbd

Ввод в домен:

После того как у нас верно сконфигурированы Kerberos (получен билет) и Samba, можно подключаться к домену. При помощи утилиты net ads join

net ads join -U habr.adm

где,
— habr.adm это имя пользователя которому разрешено добавление в домен (также можно указывать с доменом в формате habr.adm@HABR.RU)

Если при подключении возникнет ошибка »DNS Update for test-astra-fs.habr.ru failed: ERROR_DNS_UPDATE_FAILED» не пугаемся вероятно у вас просто не обновилась DNS запись это к вопросу настройки вашего DNS, но бывает относительно часто…

Проверяем статус

sudo net ads testjoin

Если вернёт »Join is OK» ваш компьютер в домене

Настройка ZFS

Веб справка по файловой системе и командам: https://openzfs.github.io/openzfs-docs/man/master/index.html#master

Особо отмечу что ZFS жадная до ОЗУ, в случае если используется дедупликация 1Tb храниища требует дополнительно 2–5Gb ОЗУ. Также в ZFS можно настроить несколько уровней кеширования как в ОЗУ так и на SSD что позволит построить весьма весёлые файлохранилище
Создаём пул:

sudo zpool create \
-o ashift=12 \
-o autotrim=on \
-o compression=on \
-O acltype=posixacl \
-O xattr=on \
-O dedup=on \
-O recordsize=16 \
zpool vdb

где
— vdb имя диска/дисков на котором у нас данные

Создаём набор данных DataSet

sudo zfs create \
-o casesensitivity=insensitive \
-o aclmode=passthrough \
-o aclinherit=passthrough \
-o acltype=posix \
-o recordsize=8k \
-o quota=1G \
-o reservation=1G \
zpool/scan

casesensitivity — указание чувствительности к регистру файловой системы (может быть указано только при создании)
recordsize — размер блока данных (по умолчанию 128 кб что не всегда оптимально, сложный параметр есть много аспектов связанных с дедупликацией и особенностями работы RAID) рекомендуется менять осознано после погружения в тему. Базово если в основном файлы мелкие docx/xlsx (по 10–100 кб) и не используется RAID массив ZFS то имеет смысл сделать меньше 128 если хранятся файлы в среднем более 128 КБ то можно делать и больше моя личная рекомендация от 4k до 16k.

dedup — состояние де дупликации on/off (необязательно указывать)
compression — включение/отключение режима сжатия данных (необязательно указывать)
quota — указание квоты для этого набора данных (необязательно указывать)
reservation — резервирование места на диске под это конкретный датасет (необязательно указывать)
aclmode — тип наследования прав при создании папки файла.
acltype — тип используемых прав, три значения off | nfsv4 | posix нам сейчас нужен posixaclinherit — определяет, как наследуются права доступа (ACL) в каталогах.

Для создания снапшотов используется комманда

zfs snapshot pool_name/dataset_name@snapshot_name

я создал файл и дёргаю его из планировщика (старый снапшоты тоже удаляю)

b67b981d82bee2d93e6fca8340f2c136.png

#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
zpool=«zpool/scan»
prefix=«UTC-»
zfs snapshot $zpool@$prefix`date -u +%Y%m%d-%H:%M:%S`

Создаём файловые шары

Тут магия

[scan]
path = /zpool/scan/

scan read only =no

browseable = yes

valid users = @HABR\domain users»
admin users = @«HABR\domain admin»
force group = astra-admin
vfs objects = shadow_copy2 io_uring
inherit permissions = yes
inherit acls = yes
shadow: mountpoint = /zpool/scan/
shadow: snapdir = .zfs/snapshot
shadow: format = UTC-%Y%m%d-%H:%M:%S
shadow: sort = desc
shadow: localtime = no

чуть расшифрую:

[имя шары]
path = <путь к папке >
read only =no
browseable = yes
valid users = <Пользователи или группы имеющие доступ к шаре>
admin users = <Пользователи или группы имеющие доступ на администрирование шары>
inherit permissions = yes #передавать наследование в файловую систему
inherit acls = yes # передавать наследование в файловую систему
force group = astra-admin #если не сделать можно организовать дыру в безопасности, в связи с некоторыми особенностями реализации групп в linux и того что мы используем xattr как основной инструмент назначения прав.
vfs objects = <список подключаемых модулей>
Модуль io_uring — обеспечивает улучшенный механизм работы с диском
Модуль shadow_copy2 — включаем использование теневых копий

#Рестарт служб связанных с Samba server
sudo systemctl restart winbind smbd nmbd

Настройка прав доменного админа

После всех настроек наш Сервер хоть и находится в домене, доменный админ, всё ещё является просто пользователем, так что добавляем доменного админа в группу astra-admin чтобы ему был доступен sudo

sudo usermod -aG astra-admin habr.adm

Теперь можно залогинится в наш сервер через GUI от имени доменного пользователя и настроивать доменные права пользователя

и вместо:

Вот так из коробки в Astra+ALDPro

Вот так из коробки в Astra+ALDPro

Мы увидим:

А вот так будет у нас

А вот так будет у нас

Установка отдельных прав на папки и файлы для дружественных доменов можно сделать через консоль с использованием утилиты setfacl если вы хотите впустить доверенную группу

#просто назначение прав
setfacl -m g: «domain users»: rwx /zpool/scan
#назначение Default прав
setfacl -d -m g: «domain users»: rwx /zpool/scan
#Добавление прав для группы из доверенного домена в GUI астры такого не добавить
setfacl -m g: «DOMAIN2\domain users»: rwx /zpool/scan
setfacl -m g: «DOMAIN3\domain users»: r-x /zpool/scan

Настраиваем права на папки и копируем. Единственное это нужно сделать на сетевую шару т.к. в Астре есть маленький баг с локальным копированием файлов.

Про баги в Astra Linux

Про «БагоФичи» Астры можно говорить очень долго, но сейчас про интересующие нас. При копировании из SMB шары в локальную папку на ZFS нарушается маска файлов и папок RWX превратится в R-X. Судя по всему ковырясь в коде для реализации мандатной системе Бойцы из астры что-то «задели» в механизме копирования или билд ZFS, что лежит в репозитории Astra содержит ошибки. На Debian 12 такой проблемы нету.

В любом случае как SMB шара и сервис файлового обмена работает корректно, как с клиентов на Linux всего зоопарка «отечественных» систем, что с клиентов на Windows.

Копировать можно с правами. Умеют это farmanager, MC, синхронизировать могут FreeFileSync, Rsync и многие другие, но нужно учесть, что права будут упрощены до RWX и иногда могут возникнуть сложности. Тема прав и того как соотносить Windows права и Linux крайне обширна приведу в пример:
setfacl -m g: «domain users»:--- /zpool/scan/Секретно
вот это запретит группе domain users доступ в папку /zpool/scan/Секретно


Для Windows админов хочется сделать маленькую, но важную ремарку: в Windows создатель папки/файла это просто создатель «для галочки» кто создал. В Linux создатель имеет большие полномочия чем просто пользователь которому разрешен RWX. Главнее создателя только root!

В заключение

Жду когда выйдет новый релиз ZFS чтобы увидеть реализацию длинных имён файлов, и полными правами NFSv4 на уровне файловой системы (или кто то из отечественных производителей посмотрит на реализацию ZFS от TrueNAS и принесёт на свою систему, вероятно тогда многие реально заинтересуется покупкой этого продукта).

После добавления поддержки прав на уровне файловой системы по модели NFSv4:
Полный доступ,
Траверс папок/выполнение файлов,
Содержание папки/ чтение данных,
Чтение атрибутов,
Чтение дополнительных атрибутов,
Создание файлов/ запись данных,
Создание папок/ дозапись данных,
Запись атрибутов,
Запись дополнительных атрибутов,
Удаление подпапок и файлов,
Удаление,
Чтение разрешений,
Смена разрешений,
Смена владельца.

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

P.S.

Хочется задать вопрос специалистам из ГК Astra ну вот какого … вы это не автоматизировали за 15 лет очень жирных государственных контрактов, когда указаный файловый сервер является базовым, фундаментальным для инфраструктуры предприятия… и должен условно разворачивать по клику ?!!! А то что разворачивается у вас может работать только в очень маленькой ограниченной группе лиц. С низкой производительностью…
Почему приходится «колхозить»?!!!

© Habrahabr.ru