Инструкция по развертыванию коробочного решения
Требования
Здесь описаны требования, предъявляемые платформой ЕСИА Шлюз
к 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 в процессе запроса к ЕСИА
Конфигурация
Конфигурирование хост-машины
Для запуска ЕСИА Шлюз
можно использовать современную ОС семейства 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 }}
-
ЕСИА Шлюз
не занимаются хранением данных сами по себе, при необходимости что-то сохранить используются базы данных. Таким образом объем диска требуется только для размещения и запуска самих сервисов и их образовDocker
. ↩