Full Stack in The Wild

. . . или проекты старого сисадмина

Инструменты пользователя

Инструменты сайта


zmb:server

Сервер управления

Физический или виртуальный сервер. Можно несколько - для распределения нагрузки и/или утилизации каналов связи (механизм балансировки и синхронизации таких серверов - не реализован)

Аналогично контроллеру домена в Windows-окружении предоставляет политики управления тонким клиентами, которые, в свою очередь, являются полноценными членами домена MS Active Directory как объекты-компьютеры.

Параметры сервера

Начать можно с:

  • RAM >= 1GB
  • HDD >= 5GB

Количество тонких клиентов не сильно влияет на ресурсы сервера, начальных параметров вполне достаточно для обслуживания не менее 300 устройств.

Операционная система

Одинаковая: для сервера и тонких клиентов - любая актуальная RHEL-based система версии 8,
например:

  • RHEL
  • CentOS (Stream)
  • AlmaLinux
  • Rocky Linux
  • Oracle Linux

Предполагается минимальная начальная инсталляция:

/etc/dnf/dnf.conf
[main]
best=true
clean_requirements_on_remove=true
deltarpm=false
gpgcheck=true
installonly_limit=2
install_weak_deps=false
max_parallel_downloads=1
plugins=false
skip_if_unavailable=false
tsflags=nodocs
#reposdir=/etc/yum.repos.d/local

и настроенный сетевой стек: IP-адрес, DNS-регистрация и CNAME:

# hostname: srvtc8.aliennet.ru
hostnamectl | head -1
Static hostname: srvtc8.aliennet.ru
 
getent hosts srvtc8
192.168.100.200 srvtc8.aliennet.ru
 
# CNAME: tc8 -> srvtc8
getent hosts tc8
192.168.100.200 srvtc8.aliennet.ru tc8.aliennet.ru
 
# CNAME: zmb -> tc8
getent hosts zmb
192.168.100.200 srvtc8.aliennet.ru zmb.aliennet.ru tc8.aliennet.ru

Администратор системы (zmb)

Локальный пользователь на сервере.
В его домашнем каталоге устанавливается все необходимое: веб-сайт, корень сетевой загрузки, пакеты ПО и т.п.

useradd --comment "The Managed Box (ZMB) Administrator" --home-dir /opt/zmb --create-home --user-group zmb
chmod -v go+rx /opt/zmb

Рекомендуется:

  • настроить ssh-доступ пользователю zmb с авторизацией по ключу;
  • назначить необходимый уровень sudo;
  • заблокировать суперпользователя root.

Например:

dnf install sudo
echo "zmb ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/zmb
echo 'root:*' | chpasswd -e
usermod --groups systemd-journal --append zmb

Полезные дополнения:

/opt/zmb/.bashrc
. . .
# User specific aliases and functions
alias ping='ping -O'

Далее, по тексту предполагается интерактивная работа на сервере управления
под пользователем zmb (за исключением очевидных операций суперпользователя).
В качестве ~ выступает домашний каталог: /opt/zmb.

Необходимые криптографические сущности

SSH

Удаленный административный доступ к тонким клиентам осуществляется по протоколу SSH с авторизацией по ключу.
Интерактивный вход пользователем root на тонких клиентах запрещен (пароль замаскирован):

ssh-keygen
/opt/zmb/.ssh/config
Host *
    LogLevel              ERROR
    StrictHostKeyChecking no
    User                  root
    UserKnownHostsFile    /dev/null

GPG

Для цифровой подписи пакетов и репозитория:

sudo dnf install createrepo pinentry rng-tools rpm-build rpm-sign rpmdevtools 
sudo reboot
gpg --full-generate-key
Real name: The Managed Box (ZMB) Project
Email address: zmb@aliennet.ru

Резервная копия:

gpg --export                --armor zmb@aliennet.ru > zmb@aliennet.ru-pub.txt
gpg --export-secret-keys    --armor zmb@aliennet.ru > zmb@aliennet.ru-sec.txt
gpg --export-secret-subkeys --armor zmb@aliennet.ru > zmb@aliennet.ru-sec-sub.txt
gpg --export-ownertrust                             > ownertrust.txt

Восстановление:

gpg --import            zmb@aliennet.ru-pub.txt
gpg --import            zmb@aliennet.ru-sec.txt
gpg --import            zmb@aliennet.ru-sec-sub.txt
gpg --import-ownertrust ownertrust.txt

Полезное:

gpg --edit-key a@b.c
gpg> passwd
gpg> trust
gpg> save

RPM

cd ~
rpmdev-setuptree

Небольшое отступление от «стандартов» - трехбуквенный базовый каталог сборки (для красоты):

mv -fv ~/rpm{build,}
sed -i "s/rpmbuild/rpm/g" ~/.rpmmacros
echo >> ~/.rpmmacros
echo "%_gpg_name$(gpg --list-keys zmb@aliennet.ru | sed -n 2p)" >> ~/.rpmmacros

Структура домашнего каталога /opt/zmb (~)

https://www.aliennet.ru/download/zmb/

~/bin - исполняемые модули, сервисы и таймеры (доступные по PATH)
  dat - база данных тонких клиентов
  log - протоколы работы системы
  rpm - сборочный каталог собственных *.rpm пакетов
  www - файлы общего доступа web- и pxe- серверов

Электронная почта

Для уведомления о событиях системы и состоянии тонких клиентов:

sudo dnf install postfix
/etc/aliases
. . .
# Person who should get root's mail
root:  zmb
 
# ZMB Administrator
zmb:   zmbadm@aliennet.ru
sudo newaliases
sudo systemctl --now enable postfix
 
echo test-zmb  | sendmail zmb
echo test-root | sendmail root

WEB-сервер

Необходим для сетевой установки ОС на тонких клиентах, предоставления им обновлений и политик управления:

sudo dnf install httpd
/etc/httpd/conf.modules.d/00-optional.conf
. . .
LoadModule ratelimit_module modules/mod_ratelimit.so
. . .
/etc/httpd/conf.d/zmb.conf
ServerSignature Off
ServerTokens ProductOnly
 
LogFormat "%{%d.%m.%Y %H:%M:%S}t %h %r %>s %b" zmb
CustomLog "/opt/zmb/log/httpd-access.log" zmb
 
<VirtualHost *:80>
    ServerName zmb.aliennet.ru
    ServerAdmin webmaster@aliennet.ru
    DocumentRoot "/opt/zmb/www"
    <Directory "/opt/zmb/www">
	Options +Indexes -MultiViews +FollowSymLinks
	IndexOptions IgnoreCase FancyIndexing FoldersFirst NameWidth=* SuppressDescription SuppressHTMLPreamble
	AllowOverride All
	Require all granted
    </Directory>
</VirtualHost>
 
<Location "/cvd">
    SetOutputFilter RATE_LIMIT
    SetEnv rate-limit 20
    SetEnv rate-initial-burst 50
</Location>
mkdir -pv ~/log ~/www
sudo truncate -s 0 /etc/httpd/conf.d/welcome.conf
sudo systemctl --now enable httpd

Базовый каталог основного сайта: ~/www

PXE-сервер

Необходим для загрузки «по сети» тонких клиентов с целью их начальной инициализации:

/etc/systemd/system/tftp.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/sbin/in.tftpd -s /opt/zmb/www/setup -B 1360
mkdir -pv ~/www/setup
sudo dnf install tftp-server
sudo systemctl --now enable tftp

Базовый каталог сетевой загрузки: ~/www/setup