Инструкция по развертыванию коробочного решения

Требования

Здесь описаны требования, предъявляемые платформой ЕСИА Шлюз к IT-инфраструктуре, в которую планируется интеграция. Поскольку платформа представляет собой комплексное и конфигурируемое решение, то данные требования носят консультационный характер и могут меняться в зависимости от конкретной выбранной схемы размещения или иных условий.

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

Рекомедуемое ПО:

  • docker - не ниже 20.10.16 (рекомендуемое 24.0.2 (compose встроен));
  • docker-compose (отдельный) - не ниже 1.29.2 (рекомндуемое 2.19.0);
  • ОС - Linux.

Дополнительные требования:

Для корректной работы приложению необходимо наличие лицензионного кода на ПО КриптоПро CSP 5.0

Достаточно приобрести лицензию для КриптоПро CSP 5.0 на одно рабочее место бессрочная

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

Минимальные требования к аппаратной части:

  • 2CPU;
  • 4GB Memory;
  • 100GB Disk 1.

Минимальные требования к аппаратной части БД:

  • 2CPU;
  • 4GB Memory.

Технические особенности

Программное обеспечение ЕСИА Шлюз поставляется в виде архива с Ansible скриптами.

Ansible - это система управления конфигурациями, написанная на языке программирования Python, с использованием декларативного языка разметки для описания конфигураций. Используется для автоматизации настройки и развертывания программного обеспечения.

При развертывании используется Nomad.

Nomad это система оркестрации docker контейнеров от HashiCorp, написанная на Golang.

Безопасность

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

Хранение данных

ЕСИА Шлюз не хранит данные локально и представляет из себя read-only контейнеры. Все данные сохраняются в строго определенных местах: PostgreSQL и Redis, которые в свою очередь не являются частью ПО и могут быть настроены и запущены силами специалистов заказчика согласно установленным нормам.

Кроме того, ЕСИА Шлюз спроектирован так, чтобы во время работы не сохранять персональные данные, с которыми он работает, а хранить лишь информацию о выполненной работе - какой запрос как именно был обработан.

Мониторинг

ЕСИА Шлюз имеет несколько интерфейсов для мониторинга состояния приложения.

1. Доступность приложения (/healthcheck)

HTTP эндпоинт отвечающий за доступность приложения. Используется балансировщиками и оркестраторами. На основе данных полученных с этого эндпоинта обычно принимается решение доступен сервис или нет.

2. Метрики приложения (/metrics)

HTTP эндпоинт отдающий метрики приложения в формате prometheus. Доступен только через basic auth.

Список доступных метрик:

  • http_server_requests_total - Общее количество HTTP-запросов, обработанных приложением с разделением на статус, метод и эндпоинт;
  • http_server_request_duration_seconds_bucket - Длительность HTTP-ответа приложения с разделением на метод, эндпоинт и длительность ответа;
  • http_server_request_duration_seconds_sum - Сумма длительности HTTP-ответов приложения с разделением на метод и эндпоинт;
  • http_server_request_duration_seconds_count - Количество HTTP-ответов приложения с разделением на метод и эндпоинт;
  • http_server_exceptions_total - Общее количество исключений, возникших в работе приложения.

3. Интеграция с Sentry

Необходимо указать dsn в конфигурации приложения для интеграции.

Sentry - это платформа для отслеживания ошибок и мониторинга приложений.

Схемы

Размещение сервисов на виртуальных машинах

Оптимальная схема Допустимая схема

На виртуальных машинах, со схем выше, так же запущены consul registrator и nomad client.

Взаимодействие между сервисами

Взаимодействие между сервисами

ЕСИА Шлюз, Signer и базы данных

Роль Агредатор Signer в ЕСИА Шлюз

Роль Signer в ЕСИА Шлюз

Схематичная работа Signer в процессе запроса к ЕСИА

Конфигурация

Конфигурирование хост-машины

Для запуска ЕСИА Шлюз можно использовать современную ОС семейства Linux. Тем не менее есть примерные требования, которые гарантируют нормальную работу и простоту запуска, поскольку они используются при разработке и тестировании платформы. Такие требования являются следующими:

  • ОС: Debian 9.5 (x86-64) или выше, Ubuntu 18.04 (x86-64) или выше;
  • Наличие на машине доступа к sentinel.harbor.rnds.pro по протоколу HTTPS на порт 443 для скачивания Docker образов сервисов;
  • Ansible версии не менее 2.9;
  • Плагин для работы с докером в Ansible;
  • Python 3.

Конфигурирование сервиса через Ansible inventory

Конфигурирование сервиса выполняется через Ansible inventory. Перед стартом развертывания сервиса необходимо подготовить следующие данные и заполнить их в файле инвентаря по пути inventory/box_single_host.ini: (см приложение А):

  • доменное имя, по которому будет доступен ЕСИА Шлюз;

    По доменному имени ЕСИА шлюз должен быть доступен из сети интернет (порты 443 и 80 должны быть перенаправлены на машину установки)

  • данные для подключения к базе данных PostgreSQL:
    • database_host - IP Address;
    • database_port - IP Port;
    • database_username - User;
    • database_password - Password;
    • приложение использует 2 базы данных:
      • esia_default_db - Имя технической базы, необходимой для работы фоновых задач;
      • esia_main_db_ - Имя основной базы, необходимой для работы приложения;
  • сервис Redis:
    • redis_host - IP Address;
    • redis_port - IP Port.

Установка ПО

Архив Ansible скриптов содержит команды для установки всех необходимых зависимостей и инфраструктуры для работы ЕСИА Шлюза.

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

1. Подготовка хост системы перед разворачиванием приложения

Перед установкой системы на хост, необходимо произвести первоначальную настройку ОС, а также файл инвентаря по пути inventory/box_single_host.ini

  • Убедиться в правильной установке времени и часового пояса системы.
  • Обновить систему пакетным менеджером до последней стабильной версии:

    apt-get update && apt-get upgrade  
    
2.1. Устанавливаем приложениe Docker на хост
ansible-playbook playbook/system/docker.yml -i inventory/box_single_host.ini -l all -D
2.2. Устанавливаем Consul (service discovery) на хост
ansible-playbook playbook/infra/consul.yml -i inventory/box_single_host.ini -D

В случае отсутствия развернутых на стороне заказчика сервисов Redis и PostgreSQL перед дальнейшей установкой (для тестирования работоспособности сервиса) необходимо их установить. ⚠️ Важно: База данных PostgreSQL и Redis поставляемая в коробочном решении не может применяться в боевом режиме. Весь риск и последствия использования тестовых баз данных лежат на заказчике.

  ansible-playbook playbook/infra/db.yml -i inventory/box_single_host.ini
  ansible-playbook playbook/infra/redis.yml -i inventory/box_single_host.ini
2.3. Устанавливаем Nomad (система оркестрации)
  ansible-playbook playbook/nomad.yml -i inventory/box_single_host.ini -D

Убеждаемся что Nomad запущен.

systemctl status nomad

В случае отсутствия ошибок запуска сервиса, на порту 4646 хоста установки должен появиться WEB интерфейс Nomad.

2.4. Ставим Traefic (Web Proxy)
ansible-playbook playbook/infra/traefik-nomad.yml -i inventory/box_single_host.ini -D
2.5. Конфигурируем Tenats
ansible-playbook playbook/add-tenants.yml -i inventory/box_single_host.ini -D
2.6. Ставим SentinelApp
ansible-playbook playbook/sentinel-nomad.yml -i inventory/box_single_host.ini -e replicas=1 -e deploy_tag=latest -D

📝 Важно! После выполнения команды установки SentinelApp, необходимо выждать время необходимое для запуска сервисов.

2.7. Ставим Jigner (сервис для подписания запросов выданным сертификатом)
ansible-playbook playbook/jigner-nomad-box.yml -i inventory/box_single_host.ini -D

Постнастройка и проверка работы сервиса изложена в документации



ПРИЛОЖЕНИЕ А. Содержимое файла Ansible inventory

# Настройки инстанса установки ЕСИА шлюза
# Здесь: 
#      ansible_host - IP инстанса на который будет производиться установка ПО
#      ansible-user - имя пользователя от которого будет осуществлено подключение к инстансу
host-all ansible_host=192.168.56.4  ansible_user=root

ansible_python_interpreter=/usr/bin/python3
inventory=prod
instance=prod
sentinel_datacenter=sentinel

# Адрес docker registry
registry_url="sentinel.harbor.rnds.pro"
# Переменная (логин) для доступа к репозиторию с контейнерами поставщика ПО (выдается отдельно)
registry_login=logins
# Переменная (пароль) для доступа к репозиторию с контейнерами поставщика ПО (выдается отдельно)
registry_pass="pass"

# Доменное имя по которому в дальнейшем будет доступен ЕСИА шлюз из сети интернет.
#                            !!! Важно !!!
# В качестве web proxy используется Traefik (https://doc.traefik.io/traefik/)
# Который в свою очередь обеспечивает маршрутизацию трафика из сети интернет к приложению
# Для корректной работы "ЕСИА шлюза" должны быть открыты и проброшены порты 80 и 443 на IP адрес установки ПО
domain=esia.example.org

#########################################################################################################
#                                     Database config                                                   #
#########################################################################################################
database_adapter=postgresql
database_encoding=unicode
# IP адрес по которому будет доступна база данных
# В случае использования БД не из поставки, необходимо сюда вписать IP сервера БД (database_host=192.168.56.4)
database_host={{ ansible_host }}
# Порт по которому будеть доступна база данных Postgresql (по умолчанию 5432)
database_port=5432
# Имя пользователя для подключения к Postgresql (по умолчанию postgres)
database_username=postgres
# Пароль для подключения к Postgresql (тот который использовался при разворачивании postgresql)
database_password=qL0448kx7exn
# Число потоков подключения к базе (по умолчанию 10) 
database_pool=10
# Имя базы данных (для технических нужд приложения, можно не менять)
database_tech_db_name=esia_default_db
# Имя базы данных (для основных настроек, можно не менять)
database_main_db_name=esia_main_db

#########################################################################################################
#                                     Consul Catalog config                                             #
#########################################################################################################
# IP адрес на котором будет развернут ведущий Consul сервис
consul_host={{ ansible_host }}
# Порт для взаимодействия с Consul (обычно 8500) 
consul_port=8500
# IP адрес c которого будет разрещен доступ к web консула
# Возможные значения: 
#	192.168.56.0/24 - Доступ разрешен всем ip из сети 
#	192.168.56.1/32 - Доступ разрешен только одному IP
consul_client_ip=`{{ ansible_host }}`,`192.168.56.1/32`

# App variables
# Заполнять приложение тестовыми данными
app_need_seed=true

# Пароль для доступа к административной WEB панели шлюза.
# Административная панель доступна по адресу из переменной {{ domain }}
# Логин к web панели admin@esia.pro
# Длина пароля не менее 8 символов. Пароль должен содержать строчные, заглавные, цифры и спецсимволы
app_main_admin_password="admin"

# Логин и пароль для доступа к метрикам приложения в формате prometehus
# Метрики доступны по адресу /metrics
app_metrics_basic_auth=admin:$2a$12$tdBexapOwSR5FGiw./fV/eI7lLF9.HIfz0ogkfiqgQyTxne4fPAa2

# Интеграция с sentry
app_sentry_rails_enable=true
app_sentry_rails_dsn=https://url_to_sentry/project_id

# SMTP Config APP options
# Настройки доступа к вашему почтовому серверу
app_smtp_user_name=esia@domain.ru
app_smtp_port=465
app_smtp_password=the_best_passwd
app_smtp_address=mail.domain.ru

# Доступ в административную панель web proxy traefik
# Административная панель находится по адресу: traefik.{{ domain }}
# Для авторизации в панель исользуется механизм basicauth
# Генерацию пары ID/пароль (user ID/password) можно выполнить в консоли:
# echo $(htpasswd -nb user password)
# Examle for 'admin' user and password 'admin'
# basicauth=admin:$apr1$NDJBJf7Z$GaB8YemUqNpvni.wcZTKe/
basicauth=admin:$apr1$NDJBJf7Z$GaB8YemUqNpvni.wcZTKe/

# Settings for connect to redis
# IP адрес хоста на котором доступен сервис Redis (не может быть localhost)
# В случае использования redis не из поставки, сюда вписать IP сервера Redis (redis_host=192.168.56.4)
redis_host={{ ansible_host }}
# Порт по которому доступен сервис Redis (по умолчанию 6379)
redis_port=6379
# Пароль для подключения к сервису Redis
redis_pass=the_best_pass
redis_url=redis://{{ redis_pass }}@{{ redis_host }}:{{ redis_port }}

## Переменные для доступа к сайту https://www.cryptopro.ru/ для скачивания дистрибутива криптопро
cryptopro_login="mail@gmail.com"
cryptopro_password="the_best_pass"
## Лицензия для КриптоПро CSP. Если не задана, то используется демо лицензия на 3 месяца. 
## Пример лицензии: 50500-10037-ELQF5-H28KM-8E6BA
cryptopro_csp_license=""

# Доменное имя по которому будет доступен сервис подписания запросов (Jigner)
# Значение по умолчанию (без необходимости не менять)
jigner_domain="jigner.{{ domain }}"
# IP адрес сервиса подписания запросов (без необходимости не менять)
jigner_host="{{ ansible_host }}"
# Адрес локального docker registry в который будет публиковаться собранный образ сервиса подписания с CryptoPro
# В случае отсутвия локального репозитория в инфраструктуре заказчика перед разворачиванием сервиса подписания
# можно запустить его на инстансе на котором производится установка шлюза командой:
#  sudo docker run -d -p 5000:5000 --name registry registry:2
jigner_docker_registry=localhost:5000
# Логин для basic авторизации в сервисе подписания
jigner_login=admin
# Пароль для basic авторизации в сервисе подписания
jigner_password=123456
# Список ключей добавляемых в конфигурационный файл сервиса подписания
#Пример описания ключей
## igner_keys={{ '[{"alias":"Smev3","name":"gfhjk","pin":"0000"},{"alias":"Other","name":"asdasd","pin":"1111"}]' | from_json }}
jigner_keys={{ '[{"alias":"Smev3","name":"gfhjk","pin":"0000"}]' |  from_json }}

  1. ЕСИА Шлюз не занимаются хранением данных сами по себе, при необходимости что-то сохранить используются базы данных. Таким образом объем диска требуется только для размещения и запуска самих сервисов и их образов Docker

  • Инструкция по развертыванию коробочного решения
  • Требования
  • Системные требования
  • Технические особенности
  • Безопасность
  • Хранение данных
  • Мониторинг
  • 1. Доступность приложения (/healthcheck)
  • 2. Метрики приложения (/metrics)
  • 3. Интеграция с Sentry
  • Схемы
  • Размещение сервисов на виртуальных машинах
  • Взаимодействие между сервисами
  • Роль Агредатор Signer в ЕСИА Шлюз
  • Конфигурация
  • Конфигурирование хост-машины
  • Конфигурирование сервиса через Ansible inventory
  • Установка ПО
  • ПРИЛОЖЕНИЕ А. Содержимое файла Ansible inventory