Развертывание сервера приложений GS с сервером авторизации#

Инструкция описывает установку сервера (далее также - прокси, gs-authproxy) регистрации и авторизации пользователей, представляющих внешние организации (например, для возможности завести личный кабинет поставщика)

Подготовка#

Для работы прокси необходимо следующее ПО:

  1. Debian 11 (с настроенным sudo)

  2. Global Server

  3. Apache HTTP Server в качестве web-сервера для сервера авторизации

  4. HAProxy в качестве форвард-прокси (и, если требуется, распределителя нагрузки) для сервера приложений и сервера авторизации. Возможно заменить на nginx

  5. 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. Если он установлен, то системные имена пользователей не могут содержать символы национального алфавита, только английские буквы.

  • Добавьте публичный ключ подписи в текстовом виде без заголовка и подвала под ключом extUserPublicKey. Например, для тестового ключа deploy/templates/private_key.pem:

    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/), чтобы при входе открывалось меню приложений)

  • настройки Django

  • имена для генерации токена

  • путь к файлу с логами

  • сведения об организации

  • время жизни кода подтверждения

  • путь для доступа к cookie

  • включение тихого режима (True/False) (По-умолчанию приватный ключ хранится в ~/.gs-authproxy.priv)

Пример заполненного config.yml:#

database:
# Имя БД
  name: authproxy
# хост на котором будет запущена БД
  host: localhost
# порт на котором будет запущена БД
  port: 5432

django:
# Url для записи секретного ключа в credential manager. Секретный ключ Django играет роль в обеспечении безопасности вашего веб-приложения.
  url: 'django_secret_key'
# Режим разработки.
  debug: true

endpoints:
# url на который будет отправляться запросы
  request_url: 'http://127.0.0.1:80/app/sys/rest/ss/pkg/Btk_JexlGatePkg/execute'
# url на который будет отправляться пользователь для авторизации
  authorize_url: '/PGDEV/Btk_ConfiguratorMainMenu/gtk-ru.bitec.app.btk.Btk_Notification%23Head/'
  database_name: PGDEV
  debug_register_url: '/PGDEV/Bs_RegOrgMainMenu/gtk-ru.bitec.app.bs.organization.Bs_Organization%23CardForRegOrganization/'


email:
# адрес SMTP-сервера, через который будут отправляться электронные письма. Замените 'smtp.example.com' на реальный адрес вашего SMTP-сервера.
  email_host: 'smtp.example.com'
# порт SMTP-сервера. Значение 587 часто используется для подключения к серверу через TLS (Transport Layer Security)
  email_port: 587
# булевое значение, указывающее, следует ли использовать TLS (Transport Layer Security) для защищенного соединения с SMTP-сервером. Установите True, если ваш SMTP-сервер поддерживает TLS, и False в противном случае
  email_use_tls: True
  email_use_ssl: False
# Тема письма.
  subject: 'Код подтверждения для портала поставщиков'
# Текст сообщения в письме. Обязательно сохранять переменную "{code}"
  message: '''
  Добрый день!

Ваш код подтверждения {code}  введите его на сайте для продолжения.
Если Вы не запрашивали данный код, пожалуйста, проигнорируйте это письмо.

С уважением

----

Данное сообщение сформировано автоматически и ответ на этот адрес не будет прочитан.'''

gs_tokens:
  # Ключ для подписи токена сервисного пользователя
  # Должен распологаться в каталоге gs-authproxy/mail_gate_pass/security
  service_private_key: 'security/service_private_key.pem'

  # Ключ для подписи токена пользователя под которым идет регистрация учетных данных
  # Должен распологаться в каталоге gs-authproxy/mail_gate_pass/security
  register_private_key: 'security/register_private_key.pem'

  # Ключ для подписи простых пользователей.
  # Должен распологаться в каталоге gs-authproxy/mail_gate_pass/security
  user_private_key: 'security/user_private_key.pem'
  # имя сервисного пользователя
  service_user_name: 'admin'
  # имя пользователя под которым идет регистрация учетных данных.
  register_user_name: 'admin'


# Используется для указания доверенных источников запросов, которые могут обходить защиту от атак CSRF.
# В неё нужно прописывать домены или IP-адреса, с которых разрешены такие запросы.
csrf:
  domain: 'http://127.0.0.1'


# Укажите путь, по которому куки будут доступны
cookie:
  path: 'PGDEV'
  
# Укажите путь для хранения логов
log:
  path: /tmp/gs-authproxy-error.log
  
# Укажите время жизни кода подтверждения в секундах.
verification_code:
  time: 300
  
# Тихий режим. При включении не запрашивает место для хранения ключа от паролей, использует значение по-умолчанию.
# Нужен для работы в режиме CI/CD. Допустимые значения: True / False. По-умолчанию приватный ключ хранится в ~/.gs-authproxy.priv
silent_mode:
  enabled: {{ silent_mode_enabled }}

# Данные организации. Для замены логотипа и favicon. Замените соответствующие файлы в директории "mail_gate_pass/static_dev/img"
organization:
  name: "Бизнес Технологии"
  phone_number: '+7 (777) 77-78-90'
  email: 'support@gmail.com'
  background_color: '#33a93d'
  url: 'https://global-system.ru/'

Примечание

Не включайте режим debug: на актуальной версии он не работает, так как неправильно перенаправляет на карточку регистрации (начиная с btk 1.0.734 открытие карточки регистрации возможно только по ссылке, сгенерированной сервером, в режиме отладки серевер авторизации пересылает по статичной ссылке).

Затем инициализируйте БД и соберите статические файлы.

python manage.py migrate
python manage.py collectstatic

Задайте пароли для базы данных, секретного ключа Django и почтового сервера. Для этого перейдите в каталог gs-authproxy и выполните скрипт set_credentials.sh

./set_credentials.sh set –url your_url –user your_user –password your_password`

  • для БД:

    • в качестве параметра --url используйте имя БД, которое вы указали в файле с конфигурациями проекта.

    • для параметра --user имя пользователя, которое вы использовали при создании БД.

    • для параметра --password пароль от БД, который вы использовали при создании БД.

  • для секретного ключа Django:

    • в качестве параметра --url используйте django:url, который вы указали в файле с конфигурациями проекта.

    • для параметра --user «django».

    • для параметра --password можно использовать любой достаточно длинный случайный набор символов.

  • для сервера почты:

    • в качестве параметра --url используйте email_host, который вы указали в файле с конфигурациями проекта.

    • для параметра --user имя пользователя (адрес электронной почты) для аутентификации на SMTP-сервере

    • для параметра --password пароль для аутентификации на SMTP-сервере````

Настройка 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

Перезапустите Apache:

sudo systemctl restart apache2

Настройка 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
    option forwardfor
    # создает условие, проверяющее, является ли запрос корнем ("/").
    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
    # добавляет заголовок X-Forwarded-Port
    http-request set-header X-Forwarded-Port %[dst_port]
    # определяет  globalserver.
    server globalserver 127.0.0.1:8080

Пример конфигурации haproxy.cfg с использованием https:#

frontend http-in
    mode http
    # указывает HaProxy, какие адреса и порты прослушивать
    bind :443 ssl crt /etc/haproxy/certs/cert.pem # путь до ssl-сертификата
    http-request add-header X-Forwarded-Proto https if { ssl_fc }
    option forwardfor
    # создает условие, проверяющее, является ли запрос корнем ("/").
    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
    # добавляет заголовок X-Forwarded-Port
    http-request set-header X-Forwarded-Port %[dst_port]
    # определяет  globalserver.
    server globalserver 127.0.0.1:8080

Перезапустите сервис haproxy:

sudo systemctl restart haproxy

Обновление#

Перед обновлением, не забудьте сделать резервные копии!

Если вы клонировали репозиторий при помощи средств git, то обновите его до последней версии. Если же вы получили сервер авторизации в виде архива, то:

  1. Скопируйте mail_gate_pass/config.yml в надежное место. Если вы создавали другие конфигурационные файлы в папке gs-authproxy (например, ключ подписи), то также скопируйте его в другое место.

  2. Удалите содержимое папки gs-authproxy и распакуйте в нее новый дистрибутив.

  3. Верните файлы конфигурации на их места.

Независимо от способа обновления файлов, выполните следующие команды для успешной миграции:

# cd gs-authproxy
bin/initvenv.sh
source venv/bin/activate
cd mail_gate_pass
python manage.py migrate
python manage.py collectstatic