# Развертывание сервера приложений GS с сервером авторизации Инструкция описывает установку сервера (далее также - прокси, gs-authproxy) регистрации и авторизации пользователей, представляющих внешние организации (например, для возможности завести личный кабинет поставщика) ## Подготовка Для работы прокси необходимо следующее ПО: 1. Debian 11 (с настроенным sudo) 2. Global Server 3. Apache HTTP Server в качестве web-сервера для сервера авторизации 4. HAProxy в качестве форвард-прокси (и, если требуется, распределителя нагрузки) для сервера приложений и сервера авторизации. Возможно заменить на nginx 5. PostgreSQL для хранения сессионной информации. Global Server установите в соответствии с [документацией](http://helpcenter.gs.local/G3SysAdminDoc/html/030_globalServer_standAlone.html) Установите пакеты: ```shell sudo apt install apache2 libapache2-mod-wsgi-py3 sudo a2enmod wsgi sudo apt install haproxy ``` В файле `/etc/apache2/ports.conf` измените директиву `Listen 80` на `Listen 8000`, или укажите другой порт. Создайте PostgreSQL базу данных: ```sql create user worker with password 'worker'; create database authproxy; grant all privileges on database authproxy to worker; ``` ## Развертывание и конфигурация Склонируйте [репозиторий](https://git.global-system.ru/appdev/project/kaustik/gs-authproxy) в удобную вам папку. Установите нужные серверу авторизации пакеты и настройте окружение: ```shell chmod +x bin/* bin/installpkg.sh bin/initvenv.sh source venv/bin/activate ``` Вы можете использовать тестовые ключи для подписи токенов. Если вы хотите создать свою пару ключей для токенов подписи (настоятельно рекомендуется), то сгенерируйте их следующими командами: ```shell 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`. Например, для тестового ключа: ```text 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`: ```yaml 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/' ``` ```{note} Не включайте режим debug: на актуальной версии он не работает, так как неправильно перенаправляет на карточку регистрации (начиная с btk 1.0.734 открытие карточки регистрации возможно только по ссылке, сгенерированной сервером, в режиме отладки серевер авторизации пересылает по статичной ссылке). ``` Затем инициализируйте БД и соберите статические файлы. ```shell 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: ```xml # Укажите полные пути в соответствии с вашим проектом. # Устанавливает основное имя сервера для данного виртуального хоста. Здесь указан 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 и разрешает доступ. Require all granted # Создает псевдоним URL для статических файлов и определяет каталог в системе где хранятся статические файлы и настройки доступа. Alias /gs-authproxy/static /opt/gs-ap/mail_gate_pass/static Require all granted # Создает псевдоним URL для медиа файлов и определяет каталог в системе где хранятся медиа файлы и настройки доступа. Alias /gs-authproxy/media /opt/gs-ap/mail_gate_pass/media Require all granted # Устанавливает файл, куда будут записываться сообщения об ошибках сервера. ErrorLog /var/log/mail_gate_pass-error.log # Устанавливает файл, куда будут записываться запросы к серверу. CustomLog /var/log/mail_gate_pass-access.log combined ``` Включите сайт: ```shell 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`: ```text # определяет, что это для обработки входящих 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 ```