Реализуем сервис файлового сервера на 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–7999idmap config habr.ru: backend = rid
idmap config habr.ru: range = 10000–999999template shell = /bin/bash
template homedir = /home/%U@%Dclient 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 = yesunix 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
я создал файл и дёргаю его из планировщика (старый снапшоты тоже удаляю)
#!/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
Мы увидим:
А вот так будет у нас
Установка отдельных прав на папки и файлы для дружественных доменов можно сделать через консоль с использованием утилиты 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 лет очень жирных государственных контрактов, когда указаный файловый сервер является базовым, фундаментальным для инфраструктуры предприятия… и должен условно разворачивать по клику ?!!! А то что разворачивается у вас может работать только в очень маленькой ограниченной группе лиц. С низкой производительностью…
Почему приходится «колхозить»?!!!