Установка в изолированных средах

При необходимости установки и обновления в изолированных от Интернет сегментах сети необходимо развернуть локальную копию репозитория обновлений. Для этого необходимо добавление в локальный DNS записи для registry.ngrsoftlab.ru и выпуск сертификата для возможности установления https соединений. Содержимое локального репозитория, в т.ч. обновления, передаются производителем как tar-архивы <имякомпонента>.tar по запросу на адрес support@ngrsoftlab.ru.

Начиная с версии 3.9.1, установка и обновление Alertix возможны и без докер-репозитория. Для этого при запуске инсталлера для обновления/установки укажите переменную окружения REMOTE_REGISTRY=0. Для проверки доступных версий без докер-репозитория нужный образ должен быть на хосте консоли управления, даже если компонент устанавливается на другой хост инсталляции. При сохранении образа на хост, его имя должно быть таким, как если бы образ был скачан из репозитория, с хостом консоли в адресе (например, alertixdemo.ngrsoftlab.ru/platform-back:3.9.1)

Пример установки и настройки собственного локального репозитория - https://docs.docker.com/registry/deploying/

Допускается использование любого другого продукта, обеспечивающего docker api v2.

В репозитории должен быть создан пользователь с любыми логином, паролем и правами на запись в репозиторий (если в продукте есть ролевая модель).

Для наполнения репозитория необходимо авторизоваться в репозитории с созданным пользователем с помощью команды:

docker login https://registry.ngrsoftlab.ru

Для всех архивов с компонентами Alertix выполнить (при условии, что компоненты импортируются в образы alertix/<имякомпонента>:<версия>):

docker load -i <component>.tar
docker tag alertix/<component>:<version> registry.ngrsoftlab.ru/<component>:<version>
docker push registry.ngrsoftlab.ru/<component>:<version>
docker rmi alertix/<component>:<version> registry.ngrsoftlab.ru/<component>:<version>

После этого производится обычная процедура Первоначальная установка. Логин и пароль созданного пользователя локального репозитория будет необходим в процессе установки как Имя пользователя и пароль в кабинет обновляемого содержимого.

Пример процедуры подготовки сборки дистрибутива Платформы в полностью изолированной среде с локальным репозиторием на базе Docker registry приведен далее.

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

Обязательным условием является использование ОС полностью идентичных версий на всех серверах (хост с доступом в Интернет, хост на который планируется устанавливать локальный репозиторий, и хосты, планируемые под установку Платформы). Все скрипты, приведенные в процедуре, необходимо запускать с правами root, например sudo bash example.sh.

1. Подготовка всех необходимых пакетов.
На хосте, имеющем доступ в Интернет, установите необходимые пакеты в ОС с помощью команды:

sudo apt install openssh-server curl docker docker.io python3 python3-docker pass postgresql-client net-tools jq -y
Если при установке Платформы производится подключение к удаленному postgres, обеспечьте отключение логирования команд класса SET, так как через них иногда передаются чувствительные данные сессии. Пример конфигурации плагина журналирования pgaudit: pgaudit.log = 'all, -misc, -misc_set'

На этом же хосте создайте и выполните скрипт следующего содержания:

#!/bin/bash

mkdir repository
chown _apt repository
cd repository

dpkg-query -f '${binary:Package}\n' -W > Inststalled_Packages
while read package; do
    apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances $package | grep "^\w" | sort -u)
done < Inststalled_Packages

apt-ftparchive packages . > Packages

cd ..
tar -czvf repository.tar.gz repository/

В результате работы скрипта, в директории его запуска будет создан файл repository.tar.gz. Скопируйте данный файл на хосты, куда будет устанавливаться Платформа и локальный репозиторий.

2. Выгрузка образа (image) docker Registry.
На хосте, имеющем доступ в Интернет, создайте и выполните скрипт следующего содержания:

#!/bin/bash

docker pull registry:2.7.0
docker save registry:2.7.0 -o registry.tar

В результате работы скрипта, в директории его запуска будет создан файл registry.tar. Скопируйте данный файл на хост, куда будет устанавливаться локальный репозиторий.

3. Выгрузка всех образов (image) Alertix.
На хосте, имеющем доступ в Интернет, создайте и выполните скрипт следующего содержания:

#!/bin/bash

echo "Enter Alertix version:"
read version

mkdir -p images

images=(agents gateway census opensearch ioc-watcher opensearch-dashboards logstash platform-back platform-front postgres reporter signal wec ueba watchdog)
# Для аутентификации необходимо ввести данные от личного кабинета NGR
docker login registry.ngrsoftlab.ru

for image in ${images[@]} ; do
  echo $image
  docker pull registry.ngrsoftlab.ru/$image:$version
  docker tag registry.ngrsoftlab.ru/$image:$version $image
  docker image save -o images/$image.tar $image
  gzip images/$image.tar
done

tar -czvf images.tar.gz images/

В ходе работы скрипта необходимо ввести логин и пароль учетной записи репозитория обновлений производителя. В результате работы скрипта, в директории его запуска будет создан файл images.tar.gz. Скопируйте данный файл на хост, куда будет устанавливаться локальный репозиторий.

4. Установка локального репозитория.
На изолированных от сети Интернет хостах, планируемых под установку Платформы и локального репозитория, в каталоге, куда был скопирован файл repository.tar.gz, создайте и выполните скрипт следующего содержания:

#!/bin/bash

tar -xvf repository.tar.gz
cp /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb [trusted=yes] file:$(pwd)/repository/ ./" >/etc/apt/sources.list
apt update
dpkg --configure -a
apt update
touch /etc/cloud/cloud-init.disabled
apt update

5. Установка локального Docker Registry.
На хосте, планируемом под установку локального репозитория, в каталоге, куда был скопирован файл registry.tar, создайте и выполните скрипт следующего содержания:

#!/bin/bash

# Стандартная процедура установки Registry
apt install docker.io net-tools jq -y

echo "Enter NEW Registry user:"
read user_name

echo "Enter user $user_name NEW password:"
read -s user_password

echo "127.0.0.1 registry.ngrsoftlab.ru" >> /etc/hosts

mkdir auth
mkdir certs
openssl req -newkey rsa:4096 -x509 -sha256  -days 3650 -nodes -out certs/server.crt -keyout certs/server.key -addext "subjectAltName = DNS:registry.ngrsoftlab.ru"
docker load --input registry.tar
docker run --rm --entrypoint htpasswd registry:2.7.0 -Bbn $user_name $user_password > auth/htpasswd
docker run -d -p 443:443 --restart=always --name registry -v "$(pwd)"/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -v "$(pwd)"/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt -e REGISTRY_HTTP_TLS_KEY=/certs/server.key registry:2.7.0

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

6. Загрузка образов (image) в локальный docker Registry.
На хосте, где был установлен локальный репозиторий, в каталоге, куда был скопирован файл images.tar.gz, создайте и выполните скрипт следующего содержания:

#!/bin/bash

echo "Enter Alertix version:"
read version

tar -xvf images.tar.gz

images=(agents gateway census opensearch ioc-watcher opensearch-dashboards logstash platform-back platform-front postgres reporter signal wec ueba watchdog)
# Для аутентификации необходимо ввести данные, указанные при установке
docker login registry.ngrsoftlab.ru

for image in ${images[@]} ; do
  echo $image
  docker image load -i images/$image.tar.gz
  docker tag $image:latest registry.ngrsoftlab.ru/$image:$version
  docker push registry.ngrsoftlab.ru/$image:$version
  docker rmi $image:latest registry.ngrsoftlab.ru/$image:$version
done

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

7. Подготовка изолированного хоста к установке Alertix.
На изолированных от сети Интернет хостах, планируемых под установку Платформы, и хосте с установленным локальным репозиторием, создайте и выполните скрипт следующего содержания:

#!/bin/bash

# Стандартная процедура подготовки Alertix
$(grep "alertix ALL=(ALL:ALL) NOPASSWD: ALL" /etc/sudoers) && found="True" || found="False"
if [ "$found" == "False" ]; then
    echo "alertix ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers
fi

apt install openssh-server curl docker docker.io python3 python3-docker pass postgresql-client net-tools jq -y

mkdir /home/alertix/.ssh
chmod 700 /home/alertix/.ssh
touch /home/alertix/.ssh/authorized_keys
chmod 600 /home/alertix/.ssh/authorized_keys

chown -R alertix:alertix /home/alertix/

# Ввод IP адреса локального регистри
echo "Enter local registry IP address:"
read registry_ip
# Ввод предполагаемого FQDN имени хоста, например - alertix.local
echo "Enter guess FQDN for this machine:"
read fqdn

# Получение локального IP-адреса хоста
local_ip=$(hostname -I | awk '{print $1}')

echo "$registry_ip    registry.ngrsoftlab.ru    lk.ngrsoftlab.ru" >> /etc/hosts
echo "$local_ip    $fqdn" >> /etc/hosts

# Подготовка сертификата для работы с локальным регистри
mkdir /etc/docker/certs.d/
mkdir /etc/docker/certs.d/registry.ngrsoftlab.ru
echo -n | openssl s_client -connect registry.ngrsoftlab.ru:443 -servername registry.ngrsoftlab.ru | openssl x509 > server.crt
cp server.crt /etc/docker/certs.d/registry.ngrsoftlab.ru/ca.crt
cp server.crt /usr/local/share/ca-certificates/registry.ngrsoftlab.ru.crt
update-ca-certificates

После этого производится обычная процедура Первоначальная установка.

С версии 3.6.0 в процессе инсталляции устанавливаются максимальные минорные версии компонента. Однако, при установке через локальный docker-registry из-за разницы в настройках авторизации (если нет доступа по API без авторизации для получения доступных версий) установятся минимальные версии (например. 3.6.0). Поэтому для установки надо обязательно сохранить в репозитории минимальные версии компонентов ядра: platform-back, platform-front, agents, postgres (при необходимости установки вместе с платформой).

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

Чтобы использовать уже загруженные на хост консоли образы, перейдите в меню Обслуживание > Обновление ПО и нажмите кнопку "Репозиторий". В открывшемся окне установите переключатель Образы в положение "Выкл" (Использовать образы уже загруженные на хост консоли).

image
Рисунок 1.
Использование локальных образов может быть губительно для платформы, если образы некорректно протестированы или версии несовместимы.