Введение

Управление аутентификацией и авторизацией пользователей требует обеспечения высокой доступности NAC-системы, т. к. в случае её отказа подключение пользователей и эндпоинтов станет невозможным.

Резервирование Eltex-NAICE выполняется по схеме Active-Active с использованием VRRP-адреса, что позволяет использовать один RADIUS-сервер в настройках сетевых устройств и зарезервировать подключение для сетевых устройств, настройки которых не поддерживают указание нескольких RADIUS-серверов. Для настройки схемы с резервирование требуется выделить 4 виртуальных (или физических) сервера: 2 для функционирования сервисов NAICE, 2 для функционирования СУБД PostgreSQL, отвечающей за хранение данных.

Установка обновлением схемы с резервированием на хост, который ранее использовался для работы системы в однохостовом режиме не допускается

Порядок действий при переходе с однохостовой схемы на схему с резервированием описан в v1.2_3.9.3 Обновление PostgreSQL при переходе со схемы с однохостовой установкой на схему с резервированием.

Общая схема резервирования


Системные требования к серверам

Системные требования к серверам описаны в разделе "Установка с резервированием" статьи v1.2_3.1 Системные требования

Установка

Возможна онлайн и оффлайн установка.

Установка онлайн возможна на все поддерживаемые типы ОС и описана далее.

Оффлайн установка (закрытый контур) описана в разделе v1.2_3.5.1 Установка схемы с резервированием в закрытом контуре (с использованием VRRP)

Онлайн установка

Для выполнения онлайн установки требуется обеспечить с хостов, на которые выполняется установка, прямой доступ в сеть Интернет (без использования прокси-сервера или иных способов, которые вызывают подмену сертификатов конечных сайтов, к которым выполняется обращение в ходе установки).

Требуется указывать IP-адреса целевых серверов при выполнении установки! Использование доменных имен не допускается!

Установка выполняется с помощью двух плейбуков ansible:

Подготовка к установке 

Адреса целевых хостов, на которых будет выполняться установка, определяется в файле inventory/hosts-cluster.yml.

Для СУБД PostgreSQL необходимо задать адреса в разделе postgres-cluster:

# Группа хостов для установки postgres-cluster (primary + standby)
postgres-cluster:
  hosts:
    node_primary:
      ansible_host: <IP-адрес хоста для node-1 PostgreSQL>
      ansible_port: 22
      ansible_user: <логин пользователя>
      ansible_ssh_pass: <пароль пользователя>
      ansible_become_password: <пароль для повышения привилегий (sudo)>
      forwarded_postgresql_port: 5432
      forwarded_ssh_port: 15432
    node_standby:
      ansible_host: <IP-адрес хоста для node-2 PostgreSQL>
      ansible_port: 22
      ansible_user: <логин пользователя>
      ansible_ssh_pass: <пароль пользователя>
      ansible_become_password: <пароль для повышения привилегий (sudo)>
      forwarded_postgresql_port: 5432
      forwarded_ssh_port: 15432

Для установки сервисов NAICE с резервированием необходимо задать адреса в разделе reservation:

# Группа хостов для установки NAICE с резервированием
reservation:
  hosts:
    master_host:
      ansible_host: <IP-адрес хоста 1 для NAICE>
      ansible_port: 22
      ansible_user: <логин пользователя>
      ansible_ssh_pass: <пароль пользователя>
      ansible_become_password: <пароль для повышения привилегий (sudo)>
      keepalived_interface: <наименование интерфейса, на котором будет настроен VIP-адрес, например eth0>

    backup_host:
      ansible_host: 192.168.0.102
      ansible_port: 22
      ansible_user: <логин пользователя>
      ansible_ssh_pass: <пароль пользователя>
      ansible_become_password: <пароль для повышения привилегий (sudo)>
      keepalived_interface: <наименование интерфейса, на котором будет настроен VIP-адрес, например eth0>
  vars:
    keepalived_vip: <VIP-адрес, без маски, например 192.168.0.11>

При выполнении онлайн установки не требуется указывать данные для доступа к хосту, на котором запускается плейбук, в разделе Local actions. Данный раздел используется только при выполнении установки в закрытом контуре.

Настройка Docker-сетей

Для сервисов NAICE используются три Docker-сети:

Переменные для настройки Docker-сетей находятся в файле group_vars/networks.yml. В нём задаются подсеть, диапазон IP‑адресов и шлюз для каждой сети.

Пример содержимого файла group_vars/networks.yml:

---
# Переменные для настройки Docker сети
docker_network_unmasked:
  subnet: "172.18.0.0/20"
  ip_range: "172.18.8.0/21"
  gateway: "172.18.0.1"
  
docker_network_external:
  subnet: "172.20.0.0/20"
  ip_range: "172.20.8.0/21"
  gateway: "172.20.0.1"
  
docker_network_internal:
  subnet: "172.21.0.0/20"
  ip_range: "172.21.8.0/21"
  gateway: "172.21.0.1"

В примере приведены значения по умолчанию. Если сети пересекаются с существующими сетями в вашей инфраструктуре, то требуется заменить сети в файле group_vars/networks.yml перед установкой NAICE. Инструкция по смене Docker-сетей на уже установленном NAICE приведена в статье V1.2_ru_3.15 Смена Docker-сетей

Установка кластера СУБД PostgreSQL

Выполнить плейбук:

ansible-playbook install-postgres-cluster.yml -i inventory/hosts-cluster.yml

Результатом выполнения плейбука будет установка СУБД PostgreSQL в кластере на серверах, указанных в node_primary и node_standby. Мастер-нода кластера будет находиться на хосте node_primary.

Проверка состояния кластера PostgreSQL после установки описана в инструкции Диагностика состояния кластера БД PostgreSQL.

Установка кластера NAICE

Перед установкой необходимо убедиться, что роль Primary принадлежит ноде PostgreSQL, указанной в переменной node_primary "ansible_host". При необходимости выполнить переключение роли Primary. В противном случае установка не сможет быть завершена.


В настройках подключения к БД сервисов NAICE указываются оба адреса БД, а запись в БД возможна только через Primary-сервер, обязательным условием является использование в URL параметра targetServerType.
Пример:

URSUS_POSTGRES_JDBC_URL:jdbc:postgresql://192.168.0.101:5432,192.168.0.102:5432/ursus?targetServerType=primary

Адреса взаимодействия с БД берутся из значения ansible_host из раздела postgres-cluster файла hosts-cluster.yml.

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

ansible-playbook reservation-naice-services.yml -i inventory/hosts-cluster.yml

Проверка состояния кластера NAICE

После завершения установки на одной из нод кластера, NAICE захватит мастерство VRRP и поднимет у себя на интерфейсе VIP-адрес. Для того, чтобы узнать на какой ноде он находится, необходимо выполнить команду на каждой ноде:

ip address show dev <имя интерфейса указанное в переменной keepalived_interface>


$ip address show dev eth0
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 02:00:a5:a1:b2:ce brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 192.168.0.101/24 brd 192.168.0.255 scope global eth2
       valid_lft forever preferred_lft forever
    inet 192.168.0.103/32 scope global eth2:NAICE
       valid_lft forever preferred_lft forever
    inet6 fe80::a5ff:fea1:b2ce/64 scope link
       valid_lft forever preferred_lft forever


$ip a show dev eth2
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 02:00:a5:a1:b2:cf brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 192.168.0.102/24 brd 192.168.0.255 scope global eth2
       valid_lft forever preferred_lft forever
    inet6 fe80::a5ff:fea1:b2cf/64 scope link
       valid_lft forever preferred_lft forever


VIP-адрес должен быть только на одной ноде кластера. Если адрес отображается на обоих нодах, это, как правило, означает отсутствие связности между ними.

Для работы протокола VRRP требуется наличие L2-связности и возможность передавать мультикаст-трафик на адреса VRRP 00:00:5E:00:01:XX (используемые для рассылки анонсов MAC-адреса определенные в RFC3768).

На хосте зайти в папку установки (по умолчанию /etc/docker-naice) и убедиться, что контейнеры запущены. 

$ sudo docker compose ps -a
NAME             IMAGE                                                               COMMAND                  SERVICE         CREATED              STATUS                        PORTS
epg-service      naice-build-hosted.registry.eltex.loc/naice/epg-service:1.3-2       "/bin/sh -e /usr/loc…"   epg-service     6 minutes ago        Up 5 minutes (healthy)        
naice-aquila     naice-release.registry.eltex.loc/naice-aquila:1.2                   "java -cp @/app/jib-…"   naice-aquila    About a minute ago   Up About a minute (healthy)   0.0.0.0:8091->8091/tcp, [::]:8091->8091/tcp, 0.0.0.0:49->1049/tcp, [::]:49->1049/tcp
naice-bubo       naice-release.registry.eltex.loc/naice-bubo:1.2                     "java -cp @/app/jib-…"   naice-bubo      5 minutes ago        Up 3 minutes (healthy)        0.0.0.0:8093->8093/tcp, [::]:8093->8093/tcp
naice-castor     naice-release.registry.eltex.loc/naice-castor:1.2                   "java -Djava.awt.hea…"   naice-castor    5 minutes ago        Up 3 minutes (healthy)        0.0.0.0:8095->8095/tcp, [::]:8095->8095/tcp
naice-cetus      naice-release.registry.eltex.loc/naice-cetus:1.2                    "java -cp @/app/jib-…"   naice-cetus     5 minutes ago        Up 3 minutes (healthy)        0.0.0.0:8099->8099/tcp, [::]:8099->8099/tcp
naice-gavia      naice-release.registry.eltex.loc/naice-gavia:1.2                    "java -cp @/app/jib-…"   naice-gavia     5 minutes ago        Up About a minute (healthy)   0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp
naice-gulo       naice-release.registry.eltex.loc/naice-gulo:1.2                     "java -cp @/app/jib-…"   naice-gulo      5 minutes ago        Up 3 minutes (healthy)        0.0.0.0:8089->8089/tcp, [::]:8089->8089/tcp
naice-lemmus     naice-release.registry.eltex.loc/naice-lemmus:1.2                   "java -cp @/app/jib-…"   naice-lemmus    5 minutes ago        Up 3 minutes (healthy)        0.0.0.0:8083->8083/tcp, [::]:8083->8083/tcp
naice-lepus      naice-release.registry.eltex.loc/naice-lepus:1.2                    "java -cp @/app/jib-…"   naice-lepus     5 minutes ago        Up 3 minutes (healthy)        0.0.0.0:8087->8087/tcp, [::]:8087->8087/tcp, 0.0.0.0:67->1024/udp, [::]:67->1024/udp
naice-mustela    naice-release.registry.eltex.loc/naice-mustela:1.2                  "java -cp @/app/jib-…"   naice-mustela   5 minutes ago        Up 3 minutes (healthy)        0.0.0.0:8070->8070/tcp, [::]:8070->8070/tcp
naice-nats       naice-build-hosted.registry.eltex.loc/naice/nats:1.2.2              "docker-entrypoint.s…"   nats            6 minutes ago        Up 5 minutes (healthy)        4222/tcp, 6222/tcp, 7777/tcp, 8222/tcp
naice-ovis       naice-release.registry.eltex.loc/naice-ovis:1.2                     "java -cp @/app/jib-…"   naice-ovis      5 minutes ago        Up 3 minutes (healthy)        0.0.0.0:8084->8084/tcp, [::]:8084->8084/tcp
naice-phoca      naice-release.registry.eltex.loc/naice-phoca:1.2                    "java -cp @/app/jib-…"   naice-phoca     6 minutes ago        Up 5 minutes (healthy)        0.0.0.0:8097->8097/tcp, [::]:8097->8097/tcp
naice-radius     naice-release.registry.eltex.loc/naice-radius:1.2                   "/docker-entrypoint.…"   naice-radius    4 minutes ago        Up 4 minutes (healthy)        0.0.0.0:1812-1813->1812-1813/udp, [::]:1812-1813->1812-1813/udp, 0.0.0.0:9812->9812/tcp, [::]:9812->9812/tcp
naice-sterna     naice-release.registry.eltex.loc/naice-sterna:1.2                   "/docker-entrypoint.…"   naice-sterna    About a minute ago   Up About a minute (healthy)   0.0.0.0:32888->80/tcp, [::]:32888->80/tcp, 0.0.0.0:8443->444/tcp, [::]:8443->444/tcp
naice-ursus      naice-release.registry.eltex.loc/naice-ursus:1.2                    "java -cp @/app/jib-…"   naice-ursus     5 minutes ago        Up 4 minutes (healthy)        0.0.0.0:8081->8081/tcp, [::]:8081->8081/tcp
naice-vulpus     naice-release.registry.eltex.loc/naice-vulpus:1.2                   "java -cp @/app/jib-…"   naice-vulpus    5 minutes ago        Up 3 minutes (healthy)        0.0.0.0:8086->8086/tcp, [::]:8086->8086/tcp
naice-web        naice-release.registry.eltex.loc/naice-web:1.2                      "/docker-entrypoint.…"   naice-web       About a minute ago   Up 59 seconds (healthy)       0.0.0.0:443->443/tcp, [::]:443->443/tcp, 0.0.0.0:32889->80/tcp, [::]:32889->80/tcp, 0.0.0.0:80->4200/tcp, [::]:80->4200/tcp

Описание схемы работы

Нормальное состояние системы

В нормальном состоянии системы функционируют все четыре хоста.

Отказ хоста NAICE 1

При отказе хоста NAICE 1 будут автоматически выполнены следующие действия:

Отказ хоста БД 1

При отказе хоста БД 1 будут автоматически выполнены следующие действия:

Восстановление после отказа

  1. После возвращения в работу хоста NAICE, более высокоприоритетный VRRP инстанс не выполняет перехват мастерства и будет работать в состоянии VRRP BACKUP.
  2. После возвращения в работу хоста БД PostgreSQL, он будет работать в режиме Standby. Роль Primary останется у текущей ноды кластера.

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

В случае полной утраты одного из хостов требуется предварительно восстановить стартовое состояние: развернуть ОС, настроить IP-адресацию и пользователей, как было ранее, и выполнить процедуру восстановления.

Восстановление хоста кластера БД PostgreSQL

На оставшейся в работе ноде, выполнить резервное копирование данных в соответствии с инструкцией: v1.2_3.10 Создание резервной копии данных БД и восстановление данных БД.

Повторно развернуть хост для вышедшей из строя ноды кластера с прежней ОС, адресацией и пользователем.

Выполнить плейбук:

ansible-playbook install-postgres-cluster.yml -i inventory/hosts-cluster.yml

После завершения работы плейбука, проверить состояние кластера БД PostgreSQL, убедиться в его работоспособности и проверить работу авторизации и корректности настроек в GUI.

Восстановление хоста сервисов NAICE

Повторно развернуть хост для вышедшей из строя ноды кластера с прежней ОС, адресацией и пользователем.

Выполнить плейбук:

ansible-playbook reservation-naice-services.yml -i inventory/hosts-cluster.yml


При повторном выполнении установки будет выполнен перезапуск всех сервисов NAICE, что приведет к кратковременному (до 5 мин) перерыву в работе комплекса. Необходимо это учитывать при проведении работ по восстановлению.

Также будет выполнен перезапуск сервиса keepalived, что приведет к переходу VRRP-мастерства на более высокоприоритетный инстанс.

В случае, если выполнялось восстановление первого хоста NAICE, будет выпущен новый самоподписанный сертификат HTTPS.

После восстановления, убедиться в работе авторизации и корректной работе всех сервисов.

Приложения

Приложение А. Значение переменных окружения из repmgr.env и переменных для плейбука Ansible

Переменная окружения (repmgr.env)Переменная Ansible (group_vars/postgres-cluster.yml)Значение по умолчаниюОписание

Переменные REPMGR

REPMGR_CONNECT_TIMEOUT

repmgr_connect_timeout

5

Максимальное время ожидания в секундах при попытке установить соединение с базой данных.
REPMGR_RECONNECT_ATTEMPTS

repmgr_reconnect_attempts

3

Количество попыток повторного подключения к базе данных после неудачной попытки.
REPMGR_RECONNECT_INTERVAL

repmgr_reconnect_interval

5

Интервал в секундах между попытками повторного подключения к базе данных.
REPMGR_MASTER_RESPONSE_TIMEOUT

repmgr_master_response_timeout

20

Максимальное время ожидания в секундах ответа от мастер-ноды.
REPMGR_UPGRADE_EXTENSION

repmgr_upgrade_extension

yes

Будет ли автоматическое обновляться repmgr при запуске контейнеров PostgreSQL. Возможные значения yes / no.
BITNAMI_DEBUG

bitnami_debug

false

Включение режима отладки Bitnami. Возможные значения true / false.
REPMGR_LOG_LEVEL

repmgr_log_level

info

Уровень логирования repmgr. Возможные значения DEBUG - максимальный уровень логирования / INFO - стандартный уровень логирования / WARNINGS - только предупреждения / ERROR - только ошибки / FATAL - критические ошибки.