Развертывание сервера приложений GS с сервером авторизации
Contents
Развертывание сервера приложений GS с сервером авторизации#
Инструкция описывает установку сервера (далее также - прокси, gs-authproxy) регистрации и авторизации пользователей, представляющих внешние организации (например, для возможности завести личный кабинет поставщика)
Подготовка#
Для работы прокси необходимо следующее ПО:
Debian 11 (с настроенным sudo)
Global Server
Apache HTTP Server в качестве web-сервера для сервера авторизации
HAProxy в качестве форвард-прокси (и, если требуется, распределителя нагрузки) для сервера приложений и сервера авторизации. Возможно заменить на nginx
PostgreSQL для хранения сессионной информации.
Global Server установите в соответствии с документацией
Установите пакеты:
sudo apt install apache2 libapache2-mod-wsgi-py3
sudo a2enmod wsgi
sudo apt install haproxy
В файле /etc/apache2/ports.conf
измените директиву Listen 80
на Listen 8000
, или укажите другой порт.
Создайте PostgreSQL базу данных:
create user worker with password 'worker';
create database authproxy;
grant all privileges on database authproxy to worker;
Развертывание и конфигурация#
Склонируйте репозиторий в удобную вам папку.
Установите нужные серверу авторизации пакеты и настройте окружение:
chmod +x bin/*
bin/installpkg.sh
bin/initvenv.sh
source venv/bin/activate
Вы можете использовать тестовые ключи для подписи токенов. Если вы хотите создать свою пару ключей для токенов подписи (настоятельно рекомендуется), то сгенерируйте их следующими командами:
openssl genrsa -out privateKey.pem 2048
openssl rsa -in privateKey.pem -pubout -out publicKey.pem
Настройка GlobalServer#
Откройте в Global Server «Настройка системы» - «Настройки и сервисы» - «Настройки модулей системы» - «Общие настройки модулей» - «btk»:
Укажите значение
jSettingForGenGidUrl
, например,{"sTransferProtocolForGenGidUrl":"http","sHostNameForGenGidUrl":"192.168.24.89:9000"}
Проверьте, что флаг
bUsernameEnglishLettersOnly
снят или отсутствует, иначе создание новых пользователей будет невозможно из-за наличия цифр в логинахСоздайте и укажите значение
sUrlGenPrefix
, равноеsHostNameForGenGidUrl
вjSettingForGenGidUrl
, например,192.168.24.89:9000
. Должно быть необязательно, начиная с btk 1.0.700.Добавьте публичный ключ подписи в текстовом виде без заголовка и подвала под ключом
extUserPublicKey
. Например, для тестового ключа:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnY1eq7C1PMhnXdvrlM5EcC6B4VgkLheotvPIiLf5vV2ZS+VPDhc2ZyCy17Fmn68Py28YUHJqCmP1BvXiPomFNPQrf4rgVAu3C6w5Orv86r8IjZiyApCIC0G5qkL6Cuvu3qDkT1axQ3pqSCyrgnUDuatPp019kjvOJo9a5PfnrlKw/i4zoFcs8qUwHfCwsTRmdl828YRlzf0rHA/jiT21J1AzkkgMSQmIH9XRxlSS9HmkP6Hgvx7Fe+ir86kU6Pw5OLaCeBnlh0RUrolSnyLNhjPuCqIQ54pfz8YzR/T2jMgxU+hvVjD2vC8OJLNDWv7g0rNzynV4zIWNt6gkiHzkvwIDAQAB
Настройка gs-authproxy#
Заполните шаблон config.yml
из deploy/templates
и поместите файл в директорию mail_gate_pass
:
Укажите учетные данные для доступа к БД и SMTP-серверу
Укажите доступ к закрытому ключу подписи (
deploy/templates/private_key.pem
, если используете тестовые значения)Укажите доменное имя сервера или IP-адрес, название БД, поправьте ссылки на корректные в соответствии с именем БД и прикладными задачами (например, укажите authorize_url, как просто название бд (
/PGTEST/
), чтобы при входе открывалось меня приложений)
Пример заполненного config.yml
:#
database:
# Имя БД выделенной для работы с проектом
name: authproxy
# Имя пользователя
user: worker
# Пароль
password: worker
# хост на котором будет запущена БД
host: 10.100.0.1
# порт на котором будет запущена БД
port: 5432
django:
# Секретный ключ Django играет роль в обеспечении безопасности вашего веб-приложения.
secret_key: 'django-insecure-gf35bki&j&=ftvc!(j92kx+=cu^q(3*54_66ue&e9_6f*ay5ii'
# Режим разработки.
debug: False
endpoints:
# url на который будет отправляться запросы
request_url: 'http://127.0.0.1:80/app/sys/rest/ss/pkg/Btk_JexlGatePkg/execute'
# название базы данных GS
database_name: pgTest
# url на который будет отправляться пользователь для аутентификации
authorize_url: '/PGTEST/'
# url который используется в режиме разработки для регистрации пользователя
debug_register_url: '/PGTEST/Bs_RegOrgMainMenu/gtk-ru.bitec.app.bs.organization.Bs_Organization%23CardForRegOrganization/'
email:
# адрес SMTP-сервера, через который будут отправляться электронные письма. Замените 'smtp.example.com' на реальный адрес вашего SMTP-сервера.
email_host: 'smtp.mail-server.net'
# порт SMTP-сервера. Значение 587 часто используется для подключения к серверу через TLS (Transport Layer Security)
email_port: 465
# имя пользователя (адрес электронной почты) для аутентификации на SMTP-сервере. Укажите здесь ваш реальный адрес электронной почты.
email_host_user: 'user@mail-server.net'
# пароль для аутентификации на SMTP-сервере. Укажите здесь ваш реальный пароль от почтового ящика.
email_host_password: 'password'
# булевое значение, указывающее, следует ли использовать TLS (Transport Layer Security) для защищенного соединения с SMTP-сервером. Установите True, если ваш SMTP-сервер поддерживает TLS, и False в противном случае. Скорее всего True, если порт - 587
email_use_tls: 'False'
# булевое значение, указывающее, следует ли использовать SSL для защищенного соединения с SMTP-сервером. Установите True, если ваш SMTP-сервер поддерживает SSL, и False в противном случае. Скорее всего True, если порт - 465
email_use_ssl: 'True'
# email_use_tls и email_use_ssl не могут одновременно быть True
#Для получения реквизитов учетных данных обратитесь в отдел прикладной разработки
#Авторизация пользователей происходит по алгоримту geawt
#При необходимости создайте дерикторию gs-authproxy/mail_gate_pass/security для
#Хранения приватных ключей
# Типы учетных записей используемых в системе:
# - Сервисный пользователь
# Используется для обращения к rest api сервера приложения
# - Пользователь для регистрации учетных данных
# Под этим пользователем идет регистрация учетнных данных для работы в сервере приложения
# - Простой пользователь
# Под данной учетной записью происходит штатная работа внешних пользователей
gs_tokens:
# Ключ для подписи токена сервисного пользователя
# Должен распологаться в каталоге gs-authproxy/mail_gate_pass/security
service_private_key: '../deploy/templates/private_key.pem'
# Ключ для подписи токена пользователя под которым идет регистрация учетных данных
# Должен распологаться в каталоге gs-authproxy/mail_gate_pass/security
register_private_key: '../deploy/templates/private_key.pem'
# Ключ для подписи простых пользователей.
# Должен распологаться в каталоге gs-authproxy/mail_gate_pass/security
user_private_key: '../deploy/templates/private_key.pem'
# имя сервисного пользователя
service_user_name: 'admin'
# имя пользователя под которым идет регистрация учетных данных.
register_user_name: 'admin'
# Используется для указания доверенных источников запросов, которые могут обходить защиту от атак CSRF.
# В неё нужно прописывать домены или IP-адреса, с которых разрешены такие запросы.
csrf:
domain: 'http://192.168.24.89:9000'
# Укажите путь, по которому куки будут доступны
cookie:
path: '/PGTEST/'
Примечание
Не включайте режим debug: на актуальной версии он не работает, так как неправильно перенаправляет на карточку регистрации (начиная с btk 1.0.734 открытие карточки регистрации возможно только по ссылке, сгенерированной сервером, в режиме отладки серевер авторизации пересылает по статичной ссылке).
Затем инициализируйте БД и соберите статические файлы.
python manage.py migrate
python manage.py collectstatic
Настройка Apache2#
Заполните шаблон 001-mail_gate.conf
из deploy/templates
и поместите файл в директорию /etc/apache2/sites-available/
:
Укажите адрес и порт прослушивания (Virtual Host)
Укажите доменное имя сервера или IP-адрес (ServerName)
В директивах DocumentRoot, WSGIDaemonProcess, WSGIScriptAlias, Directory, Alias поправьте пути так, чтобы они вели на соответсвующие файлы и папки из репозитория.
Пример заполненного Apache2:#
# Укажите полные пути в соответствии с вашим проектом.
<VirtualHost *:8000>
# Устанавливает основное имя сервера для данного виртуального хоста. Здесь указан IP-адрес сервера, можно указать доменное имя.
ServerName 192.168.24.89:9000
# Задает каталог, в котором располагаются файлы, обслуживаемые этим виртуальным хостом (каталог проекта).
DocumentRoot /opt/gs-ap/mail_gate_pass
# Определяет процесс WSGI, используемый для обработки запросов к Python-приложению.
# project1 - имя процесса.
# python-home - путь к виртуальной среде Python.
# python-path - путь к каталогу Django приложения.
WSGIDaemonProcess project1 python-home=/opt/gs-ap/venv python-path=/opt/gs-ap/mail_gate_pass
WSGIProcessGroup project1
# путь к wsgi файлу Django приложения
WSGIScriptAlias / /opt/gs-ap/mail_gate_pass/mail_gate_pass/wsgi.py
#Определяет каталог на файловой системе и его настройки доступа. Устанавливает правила доступа к файлу с именем wsgi.py и разрешает доступ.
<Directory /opt/gs-ap/mail_gate_pass/mail_gate_pass>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
# Создает псевдоним URL для статических файлов и определяет каталог в системе где хранятся статические файлы и настройки доступа.
Alias /gs-authproxy/static /opt/gs-ap/mail_gate_pass/static
<Directory /opt/gs-ap/mail_gate_pass/static>
Require all granted
</Directory>
# Создает псевдоним URL для медиа файлов и определяет каталог в системе где хранятся медиа файлы и настройки доступа.
Alias /gs-authproxy/media /opt/gs-ap/mail_gate_pass/media
<Directory /opt/gs-ap/mail_gate_pass/media>
Require all granted
</Directory>
# Устанавливает файл, куда будут записываться сообщения об ошибках сервера.
ErrorLog /var/log/mail_gate_pass-error.log
# Устанавливает файл, куда будут записываться запросы к серверу.
CustomLog /var/log/mail_gate_pass-access.log combined
</VirtualHost>
Включите сайт:
sudo a2ensite 001-mail_gate.conf
Настройка HAProxy#
Заполните шаблон haproxy.cfg
из deploy/templates
и поместите файл в директорию /etc/haproxy/haproxy.cfg
:
Укажите адрес и порт прослушивания (директива bind в секции http-in)
Укажите адрес доступа к Apache (директива server в секции gs_authproxy_server)
Укажите адрес доступа к Global Server (директива server в секции globalservers)
Пример заполненного haproxy.cfg
:#
# определяет, что это для обработки входящих HTTP запросов
frontend http-in
mode http
# указывает HaProxy, какие адреса и порты прослушивать
bind :80
# создает условие, проверяющее, является ли запрос корнем ("/").
acl is_root path -m str /
# создает условие, проверяющее, начинается ли путь запроса с "/gs-authproxy".
acl is_gs_authproxy path_beg /gs-authproxy
# указывает HaProxy использовать бэкенд gs_authproxy_servers для запросов, удовлетворяющих условию.
use_backend gs_authproxy_servers if is_gs_authproxy || is_root
# определяет бэкенд по умолчанию для всех остальных запросов.
use_backend globalservers unless is_gs_authproxy || is_root
# определяет бэкенд для обработки запросов с префиксом "/gs-authproxy".
backend gs_authproxy_servers
mode http
#определяет Django сервер.
server django_server 127.0.0.1:8000
#определяет бэкенд для всех остальных запросов.
backend globalservers
mode http
# определяет globalserver.
server globalserver 127.0.0.1:8080