Установка#

Введение#

В разделе описывается установка IAM Proxy на виртуальную машину.

Установка IAM Proxy в среду контейнеризации OpenShift описана в разделе IAM Proxy в контейнере.

Установка сервиса состоит из следующих основных этапов:

  1. Подготовка окружения.

  2. Создание или изменение профиля развертывания.

  3. Подготовка и заполнение конфигурационных артефактов.

  4. Развертывание job на сервере CI Jenkins.

  5. Непосредственно выполнение развертывания.

  6. Проверка результатов развертывания.

Подготовка окружения#

Получить сервера на базе ОС RHEL 8 или Alt Linux Sp8. На серверах должны быть настроены и доступны базовые репозитории пакетов для пакетного менеджера (в зависимости от ОС это yum или apt).

При необходимости, получить новые проектные области или доступ к существующим областям инструментов DevOps (Git, Jenkins). Обеспечить чтобы на используемых Jenkins агентах был установлен Ansible 2.9+.

Подготовка дистрибутива#

Получите архив, содержащий файлы поставки дистрибутива. Текущая поставка предусматривает несколько файлов:

  • owned дистрибутив - архив оригинальных частей дистрибутива AUTH, включая зависимости на KCSE;

  • party дистрибутив - архив зависимостей дистрибутива AUTH, включая зависимости на KCSE;

  • vendor дистрибутив - архив полного дистрибутива компонента AUTH, включая зависимые модули KCSE.

Перед установкой, получите необходимые дистрибутивы, затем разархивируйте их в локальный каталог. В случае получения и использования party+owned дистрибутивов, их необходимо предварительно «объединить» специальной утилитой, использование которой подробно описано в подразделе «Объединение разделенного дистрибутива».

Описание установщика#

Основные операции по развертыванию выполняются запуском ansible-playbook, содержимое которого находится в дистрибутиве в файле ansible/platformauth-deploy-playbook.yml. Версия дистрибутива сервиса указывается при запуске ansible-playbook через переменную deploy_platformauth_version.

Пример запуска playbook:

ansible-playbook platformauth-deploy-playbook.yml -i inventories/DemoProfile/hosts --extra-vars "deploy_platformauth_version=1.0.1 tmp_clear=True"

Подготовка базовой конфигурации развертывания#

Здесь и далее под профилем подразумевается совокупность элементов конфигурации и окружения, свойственную определенному стенду.

Рекомендуется использовать систему версионного контроля кода для хранения конфигурации развертывания. Если подготовленные файлы конфигурации уже находятся в такой системе, выполните клонирование репозитория на локальную машину для внесения правок, и сделайте копию шаблонного каталога профиля конфигурации под новый стенд. Пример команды клонирования репозитория, которую необходимо выполнить в терминале:

git clone ssh://git@bitbucket.mycompany.ru:7999/Project/CI_platformauth.git

git checkout develop

При отсутствии шаблона конфигурационных файлов в системе версионного контроля, используйте пример из дистрибутива (примеры профилей расположены по пути deploy\ansible\inventories\).

Заполнение конфигурационных файлов#

Создание или изменение профиля развертывания#

Скопируйте профиль DemoProfile из дистрибутива, как шаблонный для нового профиля StendX.

ansible/inventories/DemoProfile -> ansible/inventories/StendX

Внесение изменений в конфигурационные файлы профиля стенда#

Необходимо внести изменения в параметры профиля StendX. В данной документации приводится описание и назначение определенных параметров. Поставляемые YAML-файлы могут содержать дополнительные комментарии к заполняемым параметрам. Например, дополнительные примеры и уточнения.

Заполнение файла ansible/inventories/StendX/hosts#

С примерами профилей развертывания можно ознакомиться в каталоге дистрибутива deploy/ansible/inventories.

Параметр

Описание

Пример

keycloak_geo1, keycloak_geo2

KeyCloak, модуль аутентификации (keycloak_geo1 min 1 ip)

node1.platformauth-devb.mycompany.mycompany.ru

proxy_geo1, proxy_geo2

Proxy, модуль проксирования (proxy_geo1 min 1 ip)

node1.platform-devb.mycompany.mycompany.ru

syslogng_geo1, syslogng_geo2

Syslog-ng, модуль событий аудита (syslogng_geo1 min 1 ip, syslogng_geo* max 1 ip)

10.x.x.99

loadbalancer_for_proxy

soft-балансировщик для Proxy, обычно необходим на стендах тестирования, и может быть заменен на hw-балансировщик (min 0 ip, max 1 ip)

10.x.x.10

loadbalancer_for_keycloak

soft-балансировщик для KeyCloak, обычно необходим на стендах тестирования, и может быть заменен на hw-балансировщик (min 0 ip, max 1 ip)

10.x.x.11

rds_server_geo1, rds_server_geo2

Route Discovery Service, модуль управления маршрутами для прокси (min 0 ip)

node1.platform-rds-devb.mycompany.mycompany.ru

Вместо IP\DNS в файле hosts используйте псевдонимы, с заданием для них в отдельных параметрах ansible_host\ipaddr\dns_name. Пример: keycloak_1 ansible_host=10.x.x.147 ipaddr=10.x.x.147 dns_name=node1.platformauth.mycompany.ru

Шаблон DNS-имени для серверов#

Описание DNS-имени по шаблону вызвано удобством при использовании понятных имен, и тем, что иногда сервера DNS ограничивают максимальную длину FQDN. Как правило, ограничение установлено в 63 символа. Также, имя с самого верхнего уровня домена используется как имя узла при организации распределенного cache в кластере Keycloak, длинна имени узла (node-id), также имеет ограничение по длине (обычно в 23 символа).

DNS-имя формируется по шаблону: <node_name>.<component_name>.<product_code>.<stand_code>.<dns_zone> Где значения в <...> описаны ниже:

Значение

Пример

Описание

node_name

node1

Опционально. Используется при количестве серверов более одного. Наименование и порядковый номер node на стенде (включает в себя наименование структурного компонента)

component_name

rds

Наименование компонента/сервиса IAM для которого создается dns-имя

product_code

cfge

Код продукта (название продукта/компонента в котором развертывается IAM Proxy)

stand_code

dev3

Код и номер стенда

dns_zone

my.company.ru

Наименование зоны в которой планируется создание записи

Пример: node1.rds.cfge-dev3.my.company.ru

Шаблон является необязательным и носит рекомендательный характер.

Заполнение файла ansible/inventories/StendX/group_vars/all/main.yml#

Здесь описываются основные параметры развертываемого сервиса.

Параметр

Описание

Пример

nexus_repo_url

Задать репозиторий в котором размещен дистрибутив сервиса

пример для Nexus - <https://nexus.my.company.ru/nexus/content/repositories/Nexus_PROD> )

nexus_artifact_id

Задать имя артефакта дистрибутива

для Nexus - 0000000000_PLATFORMAUTH

nexus_classifier

Задать класс артефакта (необязательный параметр, задается значение distrib при получении дистрибутива из Nexus MYCOMP)

nexus_url_username

nexus_url_password - задать под кем аутентифицироваться в Nexus (если данные конфиденциальны, вынести их в файл ansible/inventories/StendX/group_vars/all/vault_main_decrypted.yml)

ansible_user

Задать пользователя, под которым будут выполняться задачи по установке на целевых серверах

stend_type

Задать тип стенда. Допустимы следующие значения: dev, ift, psi, prom, nt (по умолчанию psi)

stend_abbr

Префикс для технических названий (например используется в шаблоне DNS-имен)

stend_name

Понятное название стенда для отображения в UI

stend_display_name

Понятное название АС установленной на стенде для отображения в UI (по умолчанию Platform V, используется при регистрации событий аудита для заполнения поля АС)

keycloak_dnsname

DNS-имя балансировщика для frontend KeyCloak. Данный параметр может вычисляться по шаблону

proxy_dnsname

DNS-имя балансировщика для frontend Proxy. Данный параметр вычисляется пошаблону (platform-stendx.my.company.ru, для пром platform.my.company.ru), и менять в нем может понадобиться только суффикс .my.company.ru. Для PCI DSS например это будет .pcidss.my.company.ru

proxy_system_user

Логин системного пользователя, под которым будут работать процессы прокси и балансировщика

proxy_use_configuration_from_rds

Получать конфигурацию ответвлений из RouteDiscoveryService (установка rds-client рядом с прокси)

proxy_oidc_client_id

Id клиента/системы на провайдере Open ID Connect, и в случае использования Keycloak обычно равно "PlatformAuth-Proxy"

proxy_oidc_client_secret

Опциональный, пароль для аутентификации на провайдере Open ID Connect, в случае настройки Keycloak развертыванием, этот параметр не задается и будет получен автоматически развертыванием из Keycloak. :warning: Влияет на безопасность

rds_server_urls

Указывается список URL rds-серверов через «;» по которым отдается активная конфигурация, используется клиентская failover-балансировка

rds_client_keyAlias

Алиас клиентского сертификата для rds-client из файла proxy-server.p12 (из rds_client_keyStore)

audit2_options

Параметры отправки событий в Platform V Audit (java опции)

Пример задания audit2_options:
audit2_options:
- { name: "zookeeper.connecting.string", value: "10.x.x.260:2181,10.x.x.262:2181" }
- { name: "kafka.producer.bootstrap.servers", value: "10.x.x.252:19092,10.x.x.256:19092" }
- { name: "kafka.producer.acks", value: "1" }
- { name: "buffer.maxSize", value: "1000000" } - { name: "buffer.directory", value: "/tmp/audit2" }

Заполнение раздела с описанием параметров ответвлений(junction) в "proxy_jct_list"#

В этой группе параметров необходимо задать описание параметров маршрутизации запросов на защищаемые сервисы, на который/которые будет осуществляться проксирование. Данный раздел - это список с произвольным количеством элементов/объектов, где каждый элемент описывает параметры проксирования на конкретный backend (указываются все backend с front-UI, имеющиеся на стенде).

Параметр

Описание

Пример

junctionName

Задать понятное описание для отображения ответвления сервиса на технической странице IAM Proxy. На стартовой странице IAM Proxy возможно объединить сервисы в раскрывающиеся группы, путем использования /

junctionName: MyGroup/Example, где MyGroup имя группы, а Example имя ответвления

description

Задать расширенное описание проксируемой подсистемы/сервиса на технической странице IAM Proxy

junctionPoint

Корневой контекст запросов, по которому будет определяться принадлежность запроса к конкретной подсистеме/backend, и в какой backend будет проксироваться запрос

junctionPoint: /company

indexUrl

URL относительно корня на backend, по которому осуществляется основной вход в UI подсистемы. Пустое значение или - позволяет не показывать ссылку/ответвление на стартовой странице IAM Proxy. Данный параметр используется исключительно для формирования ссылки на стартовой странице IAM Proxy, и не оказывает влияния на функциональность проксирования

indexUrl: /admin

transparent

"Прозрачность" url (необязателен, default False). True - при проксировании запросы будут проходить без изменения URL. URL введенный в адресной строке браузера будет совпадать с URL который придет в HTTP-запросе на backend(на сервер приложения). False - значение из junctionPoint будет вырезано из URL запросов, и вставлено в URL-ы контента ответов

transparent: True

https, True

Использование SSL на серверах backend (необязателен,default True)

sslCommonName

Шаблон/значение имени из CN сертификата backend-серверов, используется при соединении с backend по HTTPs. Значение "*" - отключает проверку SSL. (необязателен, default .mycompany.ru)

sslCommonName: .mysystem.mycompany.ru

serverAddresses

Список серверов (сервер:порт), на которые будут проксироваться/балансироваться запросы для данного контекста junctionPoint

Пример: [ "test-host.mycompany.ru:8080" , "test-host.mycompany.mycompany.ru:8080"]

applyJctRequestFilter

Указание дополнительных опций или конфигурационных файлов, применяемые к данному junctionPoint, которые необходимо применить к данному контексту. Варианты значений опций можно посмотреть в разделе настройки через компонент PACMAN (CFGA) продукта Platform V Configuration (CFG)

"common/rds-ssl-sni-on.server.conf" - включаем передачу имени сервера из sslCommonName через SNI

authorizeByRoleTemplate

Шаблон (регулярное выражение) авторизации ролей пользователя. Пул ролей по которым осуществляется доступ к junction формируется из ID токена общими ролями (роли Realm. Атрибуты: id_token.realm_access.roles или id_token.roles или id_token.groups) и ролью client (атрибут:id_token.resource_access[текущий client].roles)

EFS_.*

limitRequests

Опциональный. По умолчанию 0. Лимит в количестве запросов в секунду (rps), действующий по конкретному ответвлению, в случае превышении запрос будет задерживаться до соблюдения лимита, но если требуется задержка более 10 секунд, запрос будет отклонен с ошибкой. Лимит применяется в рамках каждого сервера IAM Proxy автономно. При установке параметра proxy_limit_req_jct_is_per_session в true лимит будет действовать в рамках каждой отдельной сессии пользователя, а не в общем для всего сервера

20

limitRequestsZone

Опциональный. По умолчанию ''. Имя зоны действия лимита limitRequests. Можно установить одно имя зоны по нескольким ответвлениям, чтобы организовать общий лимит по пулу ответвлений (по этим ответвлениям параметр limitRequests также должен устанавливаться одинаковым)

my_zone_20rps

Пример прохождения запроса по "непрозрачному" ответвлению

Когда transparent=false и junctionPoint=/jct-point, то URL будет меняться следующим образом:
Запрос: Browser (URL https://my.com/jct-point/myindex.html) -> IAM.Proxy -> BackEnd (URL https://my.com/myindex.html)
Ответ: BackEnd (body html:href: https://my.com/mysubpage.html) -> IAM.Proxy -> Browser (body html:href: https://my.com/jct-point/mysubpage.html)

Пример заполненного раздела для нескольких ответвлений:

proxy_jct_list:
  - junctionName: Мое приложение
    description: Расширенное описание проксируемой подсистемы/сервиса
    junctionPoint: /my-app
    indexUrl: /my-app/start-page
    sslCommonName: ".my.server.ru" # шаблон имени в SAN сертификата backend-серверов
    #https: False # default True
    transparent: True
    serverAddresses: [ "node1.my.server.ru:443" , "node2.my.server.ru:8443" ]
    applyJctRequestFilter: "common/rds-set-header-host-to-backend.location.conf"
  - junctionName: ФП SPAS
    description: Расширенное описание функциональной подсиситемы SPAS
    junctionPoint: /spas-dev
    indexUrl: /spas/admin/index
    sslCommonName: "*" # шаблон имени из CN сертификата backend-серверов (default .mycompany.ru)
    #https: False # default True
    #transparent: False # default False
    serverAddresses: [ "127.0.0.1:8443" ]

В параметре applyJctRequestFilter можно задать набор из следующих значений (через запятую):

  • common/oidc-unauth-access.location.conf - отключение функциональности по аутентификации\авторизации на ответвлении;

  • common/rds-set-header-host-to-backend.location.conf - переопределение заголовка Host в сторону backend с указанием первого сервера из пула балансировки (необходимо использовать при проксировании в сторону OpenShift);

  • common/rds-ssl-sni-on.server.conf - разрешаем передачу имени сервера по SNI, fqdn-имя сервера обязательно задается в proxy_ssl_name (необходимо использовать при проксировании в сторону OpenShift при routes с типом passthrough);

Для значений параметров применяются следующие ограничения:

  • при использовании DNS-имен в serverAddresses они должны успешно разрешаться в IP на DNS-сервере, который используется на IAM Proxy (иначе конфигурация не будет применена);

  • applyJctRequestFilter должен содержать пути к существующим файлам на IAM Proxy;

  • при https = true необходимо обеспечить наличие сертификатов ЦС в TrustStore IAM Proxy;

  • параметр junctionPoint должен быть уникален и не должен заканчиваться на /;

  • в случае наличия у всех запросов на приложение одного базового корневого контекста, рекомендуется использовать transparent = true;

  • использовать в applyJctRequestFilter опции common/rds-set-header-host-to-backend.location.conf и\или common/rds-ssl-sni-on.server.conf при проксировании в k8s\OS.

Заполнение файла ansible/inventories/StendX/group_vars/keycloak.yml#

В этом файле задаются параметры настройки KeyCloak, модуль аутентификации:

  • keycloak_db_address, keycloak_db_name, keycloak_db_user_name - задать реквизиты подключения к БД KeyCloak (чистая БД, при отсутствии таблиц они автоматически будут созданы). В keycloak_db_address можно указать несколько серверов ( пример 10.x.x.104:5432,10.x.x.105:5432). В keycloak_db_name можно указать дополнительный параметры для jdbc драйвера(пример keycloak?targetServerType=master&prepareThreshold=0).

  • keycloak_system_user - логин системного пользователя, под которым будет работать служба keycloak.

  • keycloak_force_install - True/False, принудительная полная установка keycloak, с предварительным удалением всех старых каталогов/файлов KeyCloak на целевом сервере (устанавливается в True при проблемах первоначальной установки, а после успешной установки необходимо выставить в False, чтобы при следующем обновлении случайно не потерять файлы размещенные вручную).

  • keycloak_alternative_redirect_uri - задаем дополнительные разрешенные redirect_uri (обычно не требуется задавать, если не используются дополнительные DNS-имена до прокси), https://* - разрешает redirect на любые хосты (не рекомендуется использовать при развертывании на Пром).

  • keycloak_saml_enabled - True/False, опциональный, по умолчанию False, включение endpoint SAML на Keycloak

  • keycloak_deploy_custom_modules - установить дополнительные модули на сервер (указывается имя файла из дистрибутива по пути \keycloak\config\deployments-custom).

    Пример ["custom1.jar","custom2.ear"]

  • keycloak_undeploy_modules - удалить модули если они есть на сервере (указывается имя файла, может потребоваться при отключении функциональности или для удаления устаревших модулей).

    Пример ["old1.jar","deprecated2.ear"]

  • proxy_oidc_client_jwt_signed_cert - сертификат в формате PEM для аутентификации на OIDC-endpoint методом Signed Jwt. Если определен этот параметр, то метод аутентификации на KeyСloak.SE будет выставлен в Signed Jwt (и будет использован сертификат, вместо client_secret). Значение задается текстом из открытой части сертификата прокси\oidc-клиента (текст между ---BEGIN CERTIFICATE--- и ---END CERTIFICATE---, с исключением перевода строк и пробелов). Закрытый ключ сертификата при этом указывается в параметре oidc_client_rsa_private_key ( для подписания запроса от прокси\oidc-клиента).

    Пример значения: "MIIKmDCCCICgAwIBAgITGAAAAAS5RQdwBbAYQAAAAAAABDANBgkqhkiG9w0BAQsF … JB9bF2BQ=="

  • wsSyncSpas - опциональный, настройки для синхронизации\получения справочников из функциональной подсистемы Объединенный сервис авторизации (ОСА).

    • url - endpoint по которому опубликован SOAP интерфейс функциональной подсистемы Объединенный сервис авторизации (ОСА).

    • user, password - логин/пароль для доступа к SOAP интерфейсу (параметр влияющий на безопасность).

    • roleOwnerType - куда сохранять роли полученные из подсистемы Объединенный сервис авторизации (ОСА) (CLIENT, REALM).

    • roleOwnerName - имя существующего клиента для сохранения ролей (используется при roleOwnerType = CLIENT).

      Пример: "PlatformAuth-Proxy"

    • scheduleTrigger - опциональный, задать периодический запуск синхронизации.

      Пример: "0 0 4 ? * *" запускать по расписанию каждый день в 4 утра

  • keycloak

    • smtpServer - задать параметры подключения к почтовому серверу по SMTP и пользователя, которые будут использоваться KeyCloak при отсылке уведомлений по email.

    • realms - опциональный, задает список realms для пользователей, создаваемых развертыванием. По умолчанию создается один пользовательский realm - PlatformAuth.

      Пример:

      realms: # опциональный, создание и обновление дополнительных realms
       - "CustomersAuth"
       - "TestRealm"
      
    • userRealmOptions.afterCreateUserSendEmail - задать True/False. True - при создании польз. отправлять уведомление по email и одноразовый временный токен на смену пароля.

    • userRealmOptions.actionTokenGeneratedByAdminLifespan - задать время жизни токена на смену пароля (в часах).

    • userRealmOptions.ssoSessionIdleTimeout - опциональный, время жизни сессии Keycloak по не активности (в минутах).

    • userRealmOptions.displayName , userRealmOptions.displayNameHtml - отображаемое название сервиса на форме входа.

    • soapApi.verifyCN - SOAP API по управлению УЗ требует аутентификации по клиентскому сертификату, в данном параметре указывается список допустимых CN клиентского сертификата (при mTLS) через |, * - отключить проверку.

    • soapApi.rolesFilter - фильтр по скоупу ролей, подпадающих под синхронизацию через API. Можно указать несколько префиксов ролей через запятую. Если в имени есть / то, считается что это роль клиента (пример, фильтр PlatformAuth-Proxy/ подходит под любую роль клиента PlatformAuth-Proxy).

      Пример: platformauth, EFS, PlatformAuth-Proxy/

    • realm_options - опциональный, список пар значений name+value которые будут установлены как опции для realm ( список доступных опций необходимо смотреть в документации компонента KCSE) Пример:

      realm_options:
       - { name: "accessTokenLifespan", value: "{{ 5*60 }}" } # время действия access-token, задается в секундах
       - { name: "ssoSessionMaxLifespan", value: "{{ 10*60*60 }}" } # максимальное время жизни сессии, задается в секундах
      
    • realm_attributes - опциональный, список пар значений name+value которые будут установлены как атрибуты для realm (список доступных служебных атрибутов необходимо смотреть в документации компонента KCSE, возможно указывать свои произвольные атрибуты)

      Пример:

      realm_attributes:
       - { name: "failureFactor", value: "10" } # количество неуспешных попыток входа до установки временной блокировки
      
    • infinispan - опциональный, настройки работы infinispan.

      • bind_port - опциональный, порт по которому будет подключение к кластеру infinispan.

      • tcp_send_buf_size - опциональный, размер буфера на отправку.

      • tcp_recv_buf_size - опциональный, размер буфера на получение.

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

      • thread_pool_min_threads - опциональный, минимальный размер пула потоков.

      • thread_pool_max_threads - опциональный, максимальный размер пула подключений.

Заполнение файла ansible/inventories/StendX/group_vars/proxy.yml#

Заполнение параметров IAM Proxy - модуль проксирования:

  • proxy_dns_servers - DNS-сервера (через пробел) актуальные для текущего стенда, используемые для определения ip адресов по DNS-именам, из модулей прокси;

  • proxy_session_idletime - время таймаута сессии прокси по не активности (в секундах) - устанавливаем значение в 30 минут;

  • proxy_session_name - опциональный, по умолчанию PLATFORM_SESSION, задает имя сессионной cookie

  • proxy_session_domain - имя домена для сессионной cookie (значение '…' позволяет задать родительский домен от фронтового fqdn);

  • proxy_session_check_addr - включаем привязку сессии к клиентскому IP-адресу (True/False, default False);

  • proxy_mtls_key_file - файл ключа сертификата прокси, для организации mTLS между прокси и проксируемой подсистемой/backend. Не обязательный;

  • proxy_mtls_cert_file - файл сертификата прокси, для организации mTLS между прокси и проксируемой подсистемой/backend. Не обязательный;

  • proxy_session_secret- Секрет используемый для шифрования сессии IAM Proxy (длина должна быть > 100 символом, и НЕ должно содержать символов '\$;

  • proxy_jct_ssl_name - по умолчанию при проверке сертификата на проксируемом сервере считаем валидные CN/SAN(из сертификатов backend) c таким доменом/host;

  • proxy_to_backend_access_token - опциональный, True - передавать в backend access_token вместо id_token;

  • proxy_to_syslog_server - удаленное логирование событий из IAM Proxy;

  • proxy_healtcheck_enable - True/False, опциональный, default False, True - включение активного healtcheck до серверов backend (ответвления в которых есть строка /rds-healthcheck в applyJctRequestFilter), будет вызов GET /healtcheck каждые 10 сек., и ожидается в ответе HTTP-код 200/302 для живого узла (статус доступен по url http://127.0.0.1:10080/status-healtcheck/);

  • proxy_keepalive_timeout - timeout [header_timeout], опциональный, default 180 170, параметр (timeout) ограничивающий время клиентских keepalive соединений, второй параметр (header_timeout) попадет в заголовок ответа в формате: Keep-Alive: timeout=header_timeout (по умолчанию будет заголовок Keep-Alive: timeout=170);

  • proxy_ssl_session_cache - опциональный, default none, настройка использования cache SSL сессий клиентских подключений, в параметре указывается объем памяти выделенный под cache в мегабайтах (в 1 мегабайте может поместиться около 4000 SSL сессий), так же можно указать none(разрешение использования cache на клиенте) или off(запрет использования cache);

  • proxy_support_isam_headers - опциональный, default True, True - добавлять в запросы HTTP-заголовки аналогично ISAM/WebSeal (iv-user, iv-groups, iv-remote-address). Функциональность доступна с версии (IAM Proxy) 4.2.2.

Параметры authz_spas указываются если необходимо использовать функциональность авторизации по URL на разрешениях которые предоставляет ОСА:

  • authz_spas_url - опциональный, url для вызова API SPAS функциональной подсистемы ОСА.

  • authz_spas_secret - опциональный, секрет для вызова API SPAS функциональной подсистемы ОСА.

  • authz_spas_ticket_lifetime - опциональный, частота обновления тикета SPAS функциональной подсистемы ОСА, в секундах.

  • authz_spas_ticket_failed_lifetime - опциональный, частота получения тикета SPAS функциональной подсистемы ОСА, если ранее попытка была неуспешной, в секундах.

  • authz_spas_rights_lifetime - опциональный, частота обновления полномочий из SPAS функциональной подсистемы ОСА, в секундах.

  • authz_spas_rights_failed_lifetime - опциональный, частота обновления полномочий из SPAS функциональной подсистемы ОСА, если ранее попытка была неуспешной, в секундах.

  • authz_spas_ssl_verify - опциональный, проверять сертификат на endpoint authz_spas_url.

  • oidc_discovery_url - опциональный, задание URL метаданных OIDC IDP.

  • oidc_logout_uri - опциональный, задание URL на который делать redirect при logout.

  • oidc_use_idp_provider - опциональный, вход на Keycloak через заранее указанного внешнего провайдера.

  • oidc_scope - опциональный, задание дополнительных скоупов OIDC при аутентификации.

  • oidc_ssl_verify - опциональный, проверять сертификат на endpoint OIDC.

  • oidc_use_client_cert - опциональный, использовать клиентский сертификат на endpoint OIDC.

  • oidc_host_gray - использовать для подключения к OIDC IDP отдельный ip:port, а не тот который в URL из $oidc_discovery_url (может потребоваться при необходимости использовании серых адресов IDP).

  • oidc_post_logon_by_token_call_uri - вызвать endpoint на IDP после восстановления по токену сессии на прокси.

  • oidc_access_token_expires_leeway_rand - опциональный, за сколько секунд до истечения access-токена обновить токены ( реальное количество секунд будет выбрано случайным образом от этого числа, а ошибка обновления будет проигнорирована если access-токен действителен). Можно указать проценты от времени действия access-токена, например 20% или 0.2.

  • oidc_reuse_refresh_count - опциональный, default -1, определяет количество повторных использований одного refresh токена (значение менее 0 снимает ограничение)

Заполнение файла ansible/inventories/StendX/group_vars/syslogng.yml#

Необходимо задать/проверить параметры модуля событий аудита (Syslog-ng)

  • syslogng_audit2_options - параметры для отправки событий в Platform V Audit (обычно равно{{ audit2_options }}).

  • syslogng_system_user - логин системного пользователя, под которым будут работать процессы Syslog-ng (должно быть равно syslog-ng).

  • syslogng_acccepted_ip_adresses - список(тип list), c каких ip-адресов разрешено принимать сообщения в Syslog-ng для отправки в ТС Аудит (обычно уже задан, и заполняется автоматически адресами серверов из групп keycloak и proxy, смотрите демо профиль, при этом сам ip-адрес обязательно указывается в переменной ipaddr у каждого сервера данных групп, в файле hosts)

Заполнение файла ansible/inventories/StendX/group_vars/rds_server.yml#

Задать параметры модуля RDS-Server из профиля, для веток указанных ниже, передаются в конфигурацию приложения(конфигурация springboot application) полностью как будет задано в профиле (корневой узел rds не передается), и их состав не ограничен развертыванием:

  • rds.logging.*

  • rds.configStore.*

  • rds.audit.*

  • rds.standin.*

  • rds.server.*

  • rds.configStore.config-store-jdbc-login - логин к БД компонента PACMAN (CFGA) продукта Platform V Configuration ( CFG).

  • rds.configStore.config-store-jdbc-url - url для подключения к БД Platform V Configuration компонента PACMAN ( пример jdbc:postgresql://10.x.x.3:5432/config).

  • rds.configStore.configStoreCryptoPas - пароль для шифрования в Platform V Configuration компонента PACMAN (параметр, влияющий на безопасность).

  • rds.audit.kafka-servers - сервера для подключения к kafka Platform V Audit (пример 10.x.x.48:9092,10.x.x.179:9092) .

  • rds.audit.mockMode - true/false, включение режима заглушки Platform V Audit.

  • rds.audit.runWithoutAudit - true/false, true - продолжить работу приложения при проблемах подключения к Platform V Audit.

  • rds.standin.cloud.client - параметры КМ Standin для получения состояния платформенного Standin в Прикладном Журнале.

  • rds.server.port - порт на котором будет поднят сервер по HTTPs.

  • rds.server.http.enable - true/false, true - включить работу по HTTP.

  • rds.server.http.port - порт на котором будет поднят сервер по HTTP.

  • rds.server.ssl.client-auth - none/need, использовать аутентификацию по клиентскому сертификату при обращении к API.

Примечание: Список параметров развертывания указанный выше не исчерпывающий, указаны параметры на которые стоит обратить внимание.

Заполнение конфиденциальных параметров, влияющих на безопасность#

  • Параметры задать в ansible/inventories/StendX/group_vars/all/vault_main_decrypted.yml (игнорируется git, и хранится только локально).

    Список приведен для примера, и может быть как расширен, так и уменьшен по необходимости. Все переменные vault_* используются исключительно на уровне yaml-файлов ansible профиля развертывания.

    • vault_deployer_pass - пароль пользователя которым заходим при развертывании по ssh.

    • vault_keycloak_admin_password - пароль технического администратора (используется только при развертывании).

    • vault_keycloak_db_password - пароль к БД keycloak (параметр, влияющий на безопасность).

    • vault_keycloak_keystore_password - пароль к базе сертификатов/ключей keycloak (файл keycloak-keystore.p12).

    • vault_keycloak_smtpServer_user_password - пароль пользователя под которым отправляются email-уведомления.

    • vault_proxy_session_secret - Секрет используемый для шифрования сессии IAM Proxy (длина должна быть > 100 символом, и НЕ должно содержать символов '\$" ).

      Содержимое параметра - это случайный набор символов, который можно сгенерировать как вручную, так и какими-то утилитами. Необходимо учесть, что сгенерированная последовательность должна состоять из печатных символов ASCII (за исключением символов '\$"), не должна содержать невидимых символов или символов управления(например, символов переноса строк). Одним из возможных вариантов генерации подобной последовательности на Unix-совместимой станции является использование следующей команды в терминале (или консоли bash):
      head /dev/urandom | LC_ALL=C tr -dc "(-[]-~" | head -c 512

    • vault_rds_config_store_jdbc_pas - пароль к БД Platform V Configuration компонента PACMAN.

  • Зашифровать файл с помощью ansible-vault, для этого:

    Ниже только рекомендация, но необязательный подход к шифрованию секретов. Допустимо шифровать как файлы целиком, так и переменные по отдельности, используя отдельно утилиту ansible-vault.

    • записать vault-пароль в ansible/inventories/StendX/group_vars/all/vault-password.txt (игнорируется git, и хранится только локально).

    • скопировать файлы из ansible/inventories/StendX/group_vars/all/ на ПК с установленным ansible(linux).

    • выполнить команду из каталога с файлами chmod a+x encrypt_vaults.sh && ./encrypt_vaults.sh.

    • в результате файл vault_main_decrypted.yml будет зашифрован и записан в vault_main_encrypted.yml.

    • скопировать файл vault_main_encrypted.yml в каталог профиля ansible/inventories/StendX/group_vars/all/.

Заполнение файлов-секретов#

Тут используются сертификаты, описание получения которых описано далее в разделе "Выпуск сертификатов"

  • Файлы размещаются в каталоге ansible/inventories/StendX/files/. Описание файлов:

    • keycloak-keystore.p12 - база сертификатов/ключей keycloak в которой содержится сертификат для организации HTTPs на keycloak (смотрите ниже описание выпуска сертификатов в ЦС).

    • proxy-server.crt.pem - открытый ключ для организации HTTPs на прокси.

    • proxy-server.key.pem - закрытый ключ для организации HTTPs на прокси.

    • proxy-server.p12 - из этой базы rds-client берет клиентский сертификат для mTLS при подключении по HTTPs к rds-server (обычно там тот же сертификат, что и в proxy-server.*.pem, но в формате PKCS12).

    • syslogng-server.crt.pem - открытый ключ для организации tls+syslog keycloak→syslog-ng.

    • syslogng-server.key.pem - закрытый ключ для организации tls+syslog keycloak→syslog-ng.

    • rds-server-keystore.p12 - база сертификатов/ключей keycloak в которой содержится сертификат для организации HTTPs на rds-server.

    • trusted_ca_*.cer - доверенные центры сертификации в формате DER, которые выдали сертификаты нам и/или смежным серверам (это как минимум корневой и промежуточный ЦС).

    • trusted_ca_*.crt.pem - доверенные центры сертификации в формате PEM, которые выдали сертификаты нам и/или смежным серверам (это как минимум корневой и промежуточный ЦС).

    • trusted_keycloak_*.cer - доверенные центры сертификации в формате DER, для аутентификации на keycloak по клиентскому сертификату (нужен, если keycloak_funcadmin_required_auth_cert: True).

    • client_trusted_chain.crt.pem - доверенные центры сертификации в формате PEM, для аутентификации на proxy по клиентскому сертификату (нужен, если задан proxy_mtls_front_verify_dn_regex).

    • keycloak/* - файлы и подкаталоги из этого каталога будут доставлены до серверов keycloak, в каталог /opt/keycloak/(переменная keycloak_home). Файлы *.j2 будут обработаны как шаблоны, и попадут на сервера без расширения .j2.

    • keycloak/post-deploy/*.sh - файлы из этого каталога будут запущены на серверах keycloak в конце развертывания ( если расширение будет .sh.j2, то предварительно файл будет обработан как шаблон, и .j2 будет отброшено).

    • proxy/* - файлы и подкаталоги из этого каталога будут доставлены до серверов proxy, в каталог /opt/iamproxy/. Файлы *.j2 будут обработаны как шаблоны, и попадут на сервера без расширения j2.

  • Для конфиденциальных файлов добавляется расширение .decrypted (эти файлы игнорируется git, и хранятся только локально), они будут позже шифроваться.

  • Зашифровать конфиденциальные файлы с помощью ansible-vault, для этого можно использовать такой подход:

    • записать vault-пароль в ansible/inventories/StendX/files/vault-password.txt (игнорируется git, и хранится только локально) (параметр, влияющий на безопасность).

    • скопировать файлы из ansible/inventories/StendX/files/ на ПК с установленным ansible(linux).

    • выполнить команду из каталога с файлами chmod a+x encrypt_vaults.sh && ./encrypt_vaults.sh .

    • в результате файлы file_name.xxxxx.decrypted будут зашифрованы и записаны в file_name.xxxxx.

    • скопировать зашифрованные файлы file_name.xxxxx в каталог профиля ansible/inventories/StendX/files/.

В случае необходимости использования SecMan, ознакомьтесь с инструкцией по настройке интеграции с Vault на ВМ или Vault в OSE.

Сохранение профиля в GIT#

После внесения всех изменений, наш каталог с профилем сохраняется в GIT, и размещается под версионный контроль. Сохранение лучше делать в отдельной ветке, соответствующей типу среды или конкретному стенду.

git branch StendX
git checkout StendX
git commit -a -m "init StendX"
git push origin

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

Выпуск сертификатов#

Для работы HTTPS по фронтовым DNS-именам потребуются сертификаты, выпущенные Центром Сертификации.

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

Создайте сертификаты на используемые в сервисах DNS-имена(должны быть в поле SAN сертификата), с использованием доверенных ЦС (ниже указаны рекомендуемые CN):

  • platform-stendx.my.company.ru(значение из параметра proxy_dnsname, для пром platform.my.company.ru).

  • platformauth-stendx.my.company.ru(значение из параметра keycloak_dnsname, для пром platformauth.my.company.ru).

  • platform-syslogng-stendx.my.company.ru(обмен по TLS между Keycloak и Syslog-ng, для пром platform-syslogng.my.company.ru).

  • platform-rds-stendx.my.company.ru(значения из параметра rds_server_urls, для пром platform-rds.my.company.ru).

Для каждого сертификата нужно будет ОБЯЗАТЕЛЬНО в альтернативных DNS-псевдонимах (Subject Alternative Names) указать все используемые под сервис DNS-имена (fqdn всех nodes и под балансировщик при его наличии, например platform-stendx.my.company.ru, node1.platform-stendx.my.company.ru), и желательно(но не обязательно) указать IP всех конечных серверов включая балансировщик (нужно в случе если планируется обращаться к серверам по IP).

Регистрация DNS-имен в службе DNS#

Доменные имена IAM Proxy и Keycloak.SE platform-stendx.my.company.ru , platformauth-stendx.my.company.ru необходимо зарегистрировать в DNS, указав для них IP-адреса балансировщиков (или IP самого сервера если он один) для IAM Proxy и Keycloak.SE соответственно. Для корректного функционирования решения достаточно заведения в DNS записи с типом A или B.

Если имеется несколько серверов у компонента, то для каждого отдельного сервера рекомендуется зарегистрировать во внутреннем DNS отдельное имя, прибавив к основному DNS-имени приставку node1., node2. и так далее. Пример имен двух серверов Keycloak: node1.platformauth-stendx.my.company.ru, node2.platformauth-stendx.my.company.ru

Создание в Jenkins задачи по установке#

При использовании Jenkins для установки, необходимо в нем создать задачу с типом pipeline, которая будет запускать ansible-playbook установщика.

Создание задачи:

  1. Найти Jenkins-файл в дистрибутиве: deploy/jenkins/PlatformAuth_CDL.jenkinsfile.

  2. Скопировать Jenkins-файл в тот же Git-репозиторий (например в папку jenkins/), где размещаются профили развертывания. В Jenkins-файл правим по желанию значения в defaultValue секции parameters{} под свой стенд, чтобы не вводить их потом каждый раз.

  3. Перейти в Jenkins и создать Jenkins job c типом Pipeline\<img height="300px" src="resources/new_item.png" /><img height="300px" src="resources/pipeline.png"/>.

  4. В блоке Pipeline, в поле Definition необходимо выбрать Pipeline script from SCS, затем в поле SCM выбрать GIT.

  5. В поле Repository URL указываем ссылку на Git-репозиторий из п.2.

  6. В поле Credentials указываем учетную запись которая имеет доступ на чтение к Git-репозиторию.

  7. Прописываем git-ветку в поле Branch Specifier, в Script Path относительный путь до Jenkins-файла ( например jenkins/PlatformAuth_CDL.jenkinsfile) и нажимаем Сохранить.

  8. Нажимаем кнопку Собрать сейчас. Сборка возможно будет с ошибкой, но это нормально. На этом этапе Jenkins job добавит необходимые параметры запуска из Jenkins-файла, и при следующем запуске они появятся в job.

  9. После обновления страницы появится кнопка Собрать с параметрами, по которой можно будет запустить сборку с параметрами:

    • STAND- наименование стенда, то есть inventory для ansible (это имя папки в ansible/inventories/, например StendX);

    • PLATFORMAUTH_VERSION- версия артефакта дистрибутива размещенного в Nexus;

    • EMAIL_RECIPIENTS- опциональный параметр, email для уведомлений о результате выполнения job;

    • PLAYBOOK- имя файла с playbook;

    • SSH_USER- опциональный параметр, учетная запись ssh-пользователя для подключения к хостам, ее необходимо указывать только при запуске подготовки серверов, когда необходимы привилегии sudo root;

    • LIMIT- опциональный параметр, задать ansible параметр limit для ограничения установки на выбранные хосты\группы которые расположены файле hosts (например когда мы хотим установить новую версию на часть серверов);

    • STAGE_DEPLOY- включить выполнение запуска указанного playbook;

    • DEBUG- включение подробного уровня логирования в ansible (-vvv);

    • USE_SECMAN- включить использование хранилища секретов Hashicorp Vault;

Дополнительно, для нормальной работы может потребоваться создать credentials в Jenkins с ID:

  • VAULT_PASSWD - с типом Secret text, в нем сохраняется секрет, на котором зашифрованы в ansible-vault параметры профиля развертывания (в нем сохраняется содержимое из файла ansible/inventories/StendX/files/vault-password.txt используемого в разделах "Заполнение файлов-секретов" и "Заполнение конфиденциальных параметров, влияющих на безопасность");

  • SSH_USER - с типом SSH Username with private key, в нем сохраняется закрытый ssh-ключ, который потом выбирается при запуске подготовки серверов;

  • Secman_app_role - с типом Vault App Role Credential, в нем сохраняется информация о роли и секретах хранимых в Hashicorp Vault.

Установка сервиса на сервера стенда#

Выполнение скриптов подготовки серверов#

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

Скрипты подготовки, включенные в дистрибутив (список в порядке очередности запуска):

  • prep-deployers.sh - выполняется на всех серверах в первую очередь. При запуске скрипта необходимо будет задать пароль для ssh-пользователя (deployer) под которым будет производиться развертывание (значение из переменной профиля vault_deployer_pass). Так же пароль можно указать при запуске prep-deployers.sh в первом параметре или в переменной окружения deployer_pass (параметр, влияющий на безопасность), если пароль не указан при запуске он будет запрошен в терминале;

  • prep-keycloak.sh - выполняется на всех серверах группы keycloak;

  • prep-iamproxy.sh - выполняется на всех серверах группы proxy;

  • prep-rds-client.sh - выполняется на всех серверах группы nginx, при использовании конфигурирования через rds-server и компонент PACMAN (CFGA) продукта Platform V Configuration (CFG);

  • prep-rds-server.sh - выполняется на всех серверах группы rds_server, при использовании конфигурирования через rds-server и компонент PACMAN (CFGA) продукта Platform V Configuration (CFG);

  • prep-syslog-ng.sh - выполняется на всех серверах группы syslogng;

  • prep-lb-iamproxy.sh - выполняется на всех серверах группы proxy;

  • prep-vault-agent.sh - выполняется на всех серверах группы loadbalancer;

  • unprep-all.sh - удалить все установленные ранее компоненты сервиса, и все преднастройки;

Примечания:

Файл дистрибутива system-prepare.zip содержит все файлы необходимые для подготовки серверов к установке (файлы, скрипты, пакеты необходимые для установки), и для подготовки серверов необходимо использовать его.

При ручной установке важен порядок запуска скриптов.

При установке на Alt Linux необходимо использовать скрипты с расширением .alt.sh (при отсутствии в дистрибутиве скрипта под конкретную ОС .alt.sh, используется общий .sh).

Описание прав linux-пользователей, которые создаются скриптами подготовки - prep-syslog-ng.sh, prep-rds-server.sh , prep-keycloak.sh, prep-iamproxy.sh, prep-deployers-dev.sh,prep-deployers.sh,prep-fluent-bit.sh , prep-vault-agent.sh.

Учетная запись

Описание полномочий и функциональности

Объекты доступа

syslog-ng

Чтение и запись объектов, управление службой syslog-ng

/etc/syslog-ng

/var/log/syslog-ng

/var/lib/syslog-ng

/var/run/syslog-ng

/usr/share/syslog-ng

/tmp/audit2"

rds-server

Чтение и запись объектов, управление службой rds-server

/opt/rds-server

keycloak

Чтение и запись объектов, управление службой keycloak

/opt/keycloak-se

iamproxy

Чтение и запись объектов, управление службой iamproxy

/opt/iamproxy

deployer

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

users: syslog-ng, rds-server, keycloak, nginx, fluent-bit, vault

fluent-bit

Чтение и запись объектов, управление службой syslog-ng

/etc/fluent-bit

/etc/fluent-bit/ssl

/var/log/fluent-bit

vault

Чтение и запись объектов, управление службой vault-agent и подключением tmpFS в каталог /opt/vault/secrets

/opt/vault

Запуск скриптов используя ansible-playbook#

Необходимо подготовить job в Jenkins, как описано выше в разделе "Создание в Jenkins задачи по установке".

При запуске подготовки все параметры указываем так же, как и при основном развертывании, за исключением параметров:

  • в PLAYBOOK выбирается значение platformauth-system-prepare-playbook.yml;

  • в SSH_USER выбирается Jenkins credential с закрытым ssh-ключом учетной записи для подключения к хостам по ssh, данная учетная запись должна иметь привилегии sudo root на всех серверах на которые будет производиться установка.

Если нет потребности использовать Jenkins, то можно запустить и без него. Пример запуска playbook из командной строки:

cd ansible
ANSIBLE_STDOUT_CALLBACK="debug" && \
ansible-playbook platformauth-deploy-playbook.yml \
  -i inventories/StendX/hosts \
  --vault-password-file ~/vault-password.txt \
  --extra-vars "deploy_platformauth_version=D-01.000.03-1.0.1 tmp_clear=True ansible_user=myusername ansible_password= ansible_ssh_private_key_file=~/.ssh/mykey.pem"

Запуск скриптов вручную#

В случае невозможности использовать ansible для запуска скриптов под привилегированным пользователем, их можно выполнить вручную на каждом сервере из консоли.

Пример установки скриптов:

# На сервера из списка(на все сервера сервиса) скопировать из дистрибутива файл system-prepare.zip и из каталога с этим архивом
# выполнить следующие команды (под пользователем root):
sudo yum -y install unzip
unzip system-prepare.zip -d /tmp && cd /tmp/system-prepare
chmod a+x *.sh
sudo ./prep-deployers.sh

# сервера keycloak:
# На данных серверах выполнить
sudo ./prep-keycloak.sh

# сервера iamproxy, syslog-ng:
# На данных серверах выполнить
sudo ./prep-iamproxy.sh
sudo ./prep-rds-client.sh
sudo ./prep-syslog-ng

Запуск развертывания сервиса на стенд#

Необходимо подготовить job в Jenkins, как описано выше в разделе "Создание в Jenkins задачи по установке".

  1. Откройте job по установке, и нажимаем "Собрать с параметрами".

  2. Заполните параметры сборки:

    • STAND, наименование стенда, то есть inventory для ansible (это имя папки в ansible/inventories/, например StendX);

    • PLATFORMAUTH_VERSION, версия устанавливаемого артефакта дистрибутива компонента AUTH размещенного в Nexus;

    • PLAYBOOK, выбираем playbook platformauth-deploy-playbook.yml;

  3. Нажать "Собрать" и ожидать завершения задачи.

  4. Если выполнение задачи завершилось успешно, то проверьте работоспособность развернутого стенда.

    Для проверки работоспособности можно пойти на корневую страницу IAM Proxy по ссылке https://<iam_proxy_hostname>:<proxy_https_port>/ ,
    где:

    • iam_proxy_hostname - FQDN IAM Proxy (параметр профиля proxy_dnsname);

    • proxy_https_port - порт, определенный в профиле развертывания (параметр lb_https_port).

    Если все успешно, то должны получить примерно такую страницу:

Обратите внимание, что при развертывании IAM Proxy с использованием аутентификации на Identity Provider, необходимо будет пройти аутентификацию и ввести учетные данные на IDP, а потом уже можно будет попасть на корневую страницу.

Развертывание так же возможно из командной строки вручную, пример:

cd ansible
ansible-playbook platformauth-deploy-playbook.yml \
  -i inventories/StendX/hosts \
  --vault-password-file ~/vault-password.txt \
  --extra-vars "deploy_platformauth_version=D-01.000.03-1.0.1 tmp_clear=True"

Загрузка ролевой модели сервиса в Объединенный сервис авторизации (ОСА)#

Для того чтобы назначать пользователю роли (в частности роль функционального администратора сервиса аутентификации) необходимо добавить их в ролевую модель Объединенного сервиса авторизации (ОСА), для этого выполните следующие шаги:

  1. Создайте в Объединенном сервисе авторизации (ОСА) модуль с именем platformauth.

  2. Импортируйте в модуль ролевую модель из файла (файл из дистрибутива keycloak\config\roleModel_platformauth.xml).

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

Работая с платформой с доступом к ресурсам приложений используйте проксирование через сервис аутентификации (компонент IAM Proxy), а в приложениях используйте прямую интеграцию с Open ID Connect провайдером платформы ( компонент KeyCloak.SE).

Объединение разделенного дистрибутива#

В случае получения поставки в виде разделенного дистрибутива, и если потребуется восстановить дистрибутив из разделенного на owned и 3rd-party части, необходимо для объединения использовать job jenkins, идущую в поставке.

Данный job загружает из Nexus\URL две части (owned и 3rd-party), объединяет их, и выгружает объединенный дистрибутив в Nexus\URL.

Файл ее конфигурации находится в дистрибутиве по пути: deploy/tools/import-job-to-jenkins/config_Inject3rdParty_Job.xml

Параметры job#

Параметр

Описание

NEXUS_DOWNLOAD_CREDS

Credentials для скачивания разделенного дистрибутив

OWNED_PART_DOWNLOAD_URL

Полный URL к owned-части разделенного дистрибутива

NEXUS_UPLOAD_CREDS

Credentials для закачивания восстановленного дистрибутива

NEXUS_UPLOAD_URL

Корневой URL NEXUS, куда закачиваем дистрибутив (часть до groupId)

UPLOAD_ARTIFACT_GROUP_ID

groupId полного восстановленного дистрибутива

UPLOAD_ARTIFACT_ID

artifactId восстановленного дистрибутива

UPLOAD_DISTRIB_VERSION

Версия восстановленного дистрибутива

UPLOAD_CLASSIFIER

classifier восстановленного дистрибутива

CLEANUP

Очистить директорию после выполнения job

Описание работы job#

  1. По переданному URL (OWNED_PART_DOWNLOAD_URL), в коде job за счет замены подстроки owned-distrib.zip на party-distrib.zip и на owned.pom, произойдет скачивание owned-части, party-части и pom-файлов.

  2. Запустится процесс слияния owned-части и party-части дистрибутива средствами утилиты inject3rdParty. Далее запустится процесс дополнительного слияния owned-части и party-части дистрибутива с помощью отдельного sh-скрипта.

  3. Выполнится выгрузка восстановленного дистрибутива по указанным параметрам в Nexus.

Соответствие имен параметров для разных сред и инструментов установки#

Для определения параметров в дистрибутиве присутствуют файлы примеров настроек, которые требуется заполнить необходимыми значениями под конкретный стенд, с учетом требований к системе и используемой инфраструктуры. Файлы примера настроек для установки IAM Proxy на VM(профиль для ansible) располагаются в файлах bin-дистрибутива в папке package/deploy/ansible/inventories/DemoProfile/group_vars.

Файлы примера настроек для установки IAM Proxy в OpenShift (с использованием утилит Platform V DevOps Tools CDJE) располагаются в файле cfg-дистрибутива в папке package/conf/config/parameters.

Описание и соответствие параметров настройки приведены в таблице ниже.

Параметры для контейнера (переменные environment)

Параметры для Platform V DevOps Tools CDJE (установка в OpenShift)

Параметры для профиля ansible (установка на VM)

Описание параметра

STEND_NAME

auth.k8s.stand_name

stend_name

Название стенда\сервиса для отображения в UI

STEND_ABBR

auth.k8s.stand_abbr

stend_abbr

Используется для обозначения стенда в тех.названиях (латиница в нижнем регистре)

STEND_TYPE

auth.k8s.stand_type

stend_type

Тип стенда. Допустимы следующие значения: dev, ift, psi, prom, nt (по умолчанию psi). При развертывании в промышленной среде должно устанавливаться строго prom.

PROXY_SESSION_SECRET

iamproxy.k8s.secret.PROXY_SESSION_SECRET

proxy_session_secret

Секретный ключ для шифрования сессий прокси (произвольный набор символов или мнемофраза на латинице, рекомендуется длина не менее 512 символов)

PROXY_SESSION_IDLETIME

iamproxy.k8s.session_idletime

proxy_session_idletime

Опциональный. Время жизни сессии прокси по не активности в минутах (по умолчанию 180 минут)

PROXY_SESSION_CHECK_ADDR

iamproxy.k8s.session_check_addr

proxy_session_check_addr

Включаем привязку сессии к клиентскому IP True\ False (по умолчанию False)

PROXY_SESSION_NAME

iamproxy.k8s.session_name

proxy_session_name

Опциональный. По умолчанию имеет значение ``. Имя домена для сессионной cookie (может потребоваться при CORS запросах). Значение '…' позволяет задать родительский домен от фронтового fqdn. Применяется только если в iamproxy.k8s.session_name будет задано значение, отличное от значения по умолчанию (PLATFORM_SESSION)

PROXY_SESSION_DOMAIN

iamproxy.k8s.session_domain

proxy_session_domain

Опциональный. По умолчанию имеет значение ``. Имя домена для сессионной cookie (может потребоваться при CORS запросах). Значение '…' позволяет задать родительский домен от фронтового fqdn. Применяется только если в iamproxy.k8s.session_name будет задано значение, отличное от значения по умолчанию (PLATFORM_SESSION)

CORS_HEADER_CONTENT_SECURITY_POLICY

iamproxy.k8s.cors.header_content_security_policy

cors_header_content_security_policy

Опция определяющая содержимое заголовка Сontent-Security-Policy в ответах по ответвлениям с опцией rds-enable-cors.location.conf. Если значение не задано, то заголовок Сontent-Security-Policy не будет добавляться или изменяться (при отправке с backend)

PROXY_WORKER_PROCESSES

iamproxy.k8s.worker_processes

proxy_worker_processes

Сколько worker-процессов прокси(Nginx) запустить для обработки соединений (по умолчанию auto, и будет равно кол-ву CPU)

SYSLOG_SERVER

auth.k8s.syslogng.enabled

proxy_to_syslog_server

Сервер:порт для отправки событий аудита по протоколу syslog (в IAM это syslog-ng)

PROXY_JCT_SSL_NAME

iamproxy.k8s.jct_ssl_name

proxy_jct_ssl_name

По умолчанию при проверке сертификата на проксируемом сервере считаем валидные CN\SAN (из сертификатов backend) c .ru доменом\host

DEBUG

auth.k8s.debug.enabled

debug

Включает отладку

PROXY_METRICS_ENABLE

auth.k8s.monitoring.enabled

proxy_metrics_enable

Опциональный. True/False , по умолчанию False. True - собирать метрики и опубликовать их в формате Prometheus на http://127.0.0.1:10080/metrics/

PROXY_HEALTCHECK_ENABLE

iamproxy.k8s.healthcheck_enable

proxy_healtcheck_enable

Опциональный. True/False, по умолчанию False. True - включение активного healtcheck до серверов backend (ответвления в которых есть строка /rds-healthcheck в applyJctRequestFilter), будет производиться вызов GET /healthcheck каждые 10 секунд, в ответе ожидается HTTP-код 200\302 для живого узла (статус доступен по url http://127.0.0.1:10080/status-healtcheck/)

PROXY_SUPPORT_ISAM_HEADERS

iamproxy.k8s.support_isam_headers

proxy_support_isam_headers

Опциональный. True/False, по умолчанию False. True - добавлять в запросы HTTP-заголовки аналогично ISAM/WebSeal (iv-user, iv-groups, iv-remote-address). Для точечного отключения на ответвлении используйте опцию common/rds-disable-support-isam-headers.location.conf в applyJctRequestFilter.

PROXY_SUPPORT_CUSTOM_CONFIGS

iamproxy.k8s.support_custom_configs

proxy_support_custom_configs

Опциональный. True/False, по умолчанию False. True - разрешить подключение/include файлов конфигурации из каталога custom.d

PROXY_X_FORWARDED_PORT

iamproxy.k8s.x_forwarded_port

proxy_x_forwarded_port

Опциональный. auto/номер порта, gо умолчанию auto. auto - получить номер порта из заголовка X-Forwarded-Port или из $proxy_protocol_port или из заголовка Host или из $scheme (указано в порядке получения)

PROXY_X_FORWARDED_PROTO

iamproxy.k8s.x_forwarded_proto

proxy_x_forwarded_proto

Опциональный. https/http, по умолчанию будет scheme из listener

WAIT_EXIST_FILES

Опциональный. Список файлов через пробел, появления которых необходимо дождаться перед запуском прокси. К примеру это может понадобиться, когда файлы сертификатов доставляются до pod отдельным процессом\контейнером\sidecar, и на момент запуска IAM Proxy файлов еще не будет, и нужно будет дождаться их появления, а потом начать старт IAM Proxy

PROXY_LIMIT_PER_IP_ENABLE

iamproxy.k8s.limit_per_ip_enable

proxy_limit_per_ip_enable

Опциональный. True/False, по умолчанию False. Включение ограничения скорости запросов, определение источника\клиента производится по его IP (на основе нескольких источников - X-Forwaded-For, PROXY Protocol, TCP ip.src)

PROXY_LIMIT_PER_SESSION_ENABLE

iamproxy.k8s.limit_per_session_enable

proxy_limit_per_session_enable

Опциональный. True/False, по умолчанию False. Включение ограничения скорости запросов, определение источника\клиента производится по его сессии аутентификации

PROXY_LIMIT_REQ_PER_SEC

iamproxy.k8s.limit_req_per_sec

proxy_limit_req_per_sec

Опциональный. Количество запросов в секунду, по умолчанию равен 60. Ограничение скорости запросов на backend в количестве запросов допустимых в секунду (допускается всплеск запросов по кол-ву в 4 раза превышающий заданный лимит по r/s, запросы в пределах всплеска будут на время задерживаться, чтобы соблюсти заданную скорость, а по превышению всплеска запросы будут отклоняться с HTTP-кодом 509)

PROXY_LIMIT_REQ_OIDC_PER_MIN

iamproxy.k8s.limit_req_oidc_per_min

proxy_limit_req_oidc_per_min

Запросов/минуту, опциональный, default 2, ограничение скорости запросов по сессии прокси к функциональности OIDC(обращения к провайдеру Open ID Connect) в максимально допустимом количестве запросов в минуту (допускается всплеск в кол-ве 10 запросов, по превышению всплеска запросы будут отклоняться с HTTP-кодом 509)

PROXY_OIDC_CLIENT_ID

iamproxy.k8s.secret.PROXY_OIDC_CLIENT_ID

proxy_oidc_client_id

Используемый на прокси CLIENT_ID для аутентификации по OIDC на IDP

PROXY_OIDC_CLIENT_SECRET

iamproxy.k8s.secret.PROXY_OIDC_CLIENT_SECRET

proxy_oidc_client_secret

Секрет OIDC-клиента CLIENT_ID

PROXY_TO_BACKEND_ACCESS_TOKEN

iamproxy.k8s.backend_access_token

proxy_to_backend_access_token

True/False, True - использовать access token при отправке в backend, вместо id_token

PROXY_SSL_SESSION_CACHE

iamproxy.k8s.proxy_ssl_session_cache

proxy_ssl_session_cache

Опциональный. По умолчанию имеет значение none, настройка использования cache SSL сессий клиентских подключений, в параметре указывается объем памяти выделенный под cache в мегабайтах (в 1 мегабайте может поместиться около 4000 SSL сессий), так же можно указать none(разрешение использования cache на клиенте) или off(запрет использования cache)

PROXY_KEEPALIVE_TIMEOUT

iamproxy.k8s.proxy_keepalive_timeout

proxy_keepalive_timeout

Опциональный. По умолчанию имеет значение 180 170, параметр timeout ограничивающий время клиентских keepalive соединений, второй параметр header_timeout попадет в заголовок ответа в формате: Keep-Alive: timeout=header_timeout (по умолчанию будет заголовок Keep-Alive: timeout=170)

PROXY_DNSNAME

iamproxy.k8s.front.https.host

proxy_dnsname

DNS-имя сервиса IAM Proxy, используемое с front-end\браузера\LB при обращении к прокси

LB_HTTPS_PORT

iamproxy.k8s.lb_https_port

lb_https_port

Порт, используемый с front-end\браузера\LB при обращении к прокси по PROXY_DNSNAME

KEYCLOAK_ADMIN_DNS_NAME

iamproxy.k8s.keycloak.admin_dns_name

DNS-имя сервиса Keycloak для административного интерфейса, используемое с front-end\браузера\LB при обращении к прокси

KEYCLOAK_HTTPS_ADMIN_PORT

iamproxy.k8s.keycloak.https_admin_port

keycloak_https_admin_port

Порт к KEYCLOAK_HTTPS_ADMIN_PORT

OIDC_SSL_VERIFY

auth.k8s.ssl.verify.enabled

oidc_ssl_verify

Определяет необходимость верификации сертификата сервисов OIDC на IDP провайдере. True/False, True - проверять сертификат на endpoint OIDC

OIDC_DISCOVERY_URL

iamproxy.k8s.oidc.discoveryUrl

oidc_discovery_url

Задание URL метаданных OIDC IDP (например, https://all-sh-mycompany.mycompany.mycompany.ru/mga/sps/oauth/oauth20)

OIDC_LOGOUT_URI

iamproxy.k8s.oidc.logoutUri

oidc_logout_uri

Задание URL на который делать redirect при logout (например, https://all-sh-mycompany.mycompany.mycompany.ru/pkmslogout)

OIDC_CLIENT_RSA_PRIVATE_KEY

iamproxy.k8s.oidc.client_rsa_private_key

oidc_client_rsa_private_key

Аутентификация на IDP методом private_key_jwt , где указывается "закрытый клиентский ключ"

OIDC_POST_LOGON_BY_TOKEN_CALL_URI

iamproxy.k8s.oidc.post_logon_by_token_call_uri

oidc_post_logon_by_token_call_uri

Вызвать endpoint на IDP после восстановления по токену сессии на прокси

OIDC_POST_LOGOUT_REDIRECT_PATH

iamproxy.k8s.oidc.post_logout_redirect_path

oidc_post_logout_redirect_path

По умолчанию /openid-connect-auth/logoutSuccessful.html, относительный путь, на который будет перенаправление после успешного logout

OIDC_SCOPE

iamproxy.k8s.oidc.scope

oidc_scope

Задание дополнительных скоупов OIDC при аутентификации basic access

OIDC_USE_IDP_PROVIDER

iamproxy.k8s.use_idp_provider

oidc_use_idp_provider

Вход на Keycloak через заранее указанного внешнего провайдера esia

OIDC_USE_CLIENT_CERT

iamproxy.k8s.use_client_cert

oidc_use_client_cert

True/False, использовать клиентский сертификат на endpoints OIDC

OIDC_HOST_GRAY

iamproxy.k8s.oidc.host_gray

oidc_host_gray

Использовать для подключения к OIDC IDP отдельный ip:port, а не тот который в URL из OIDC_DISCOVERY_URL (может потребоваться при необходимости использовании серых адресов IDP, для включения также необходимо выставить OIDC_USE_CLIENT_CERT в True). Пример 1.1.1.1:8443

OIDC_USE_PKCE

iamproxy.k8s.oidc.use_pkce

oidc_use_pkce

True/False, по умолчанию False, использовать PKCE при аутентификации по OIDC

OIDC_USERNAME_ATTR

iamproxy.k8s.oidc.username_attr

oidc_username_attr

Какой атрибут из jwt-токена использовать в качестве имени\логина пользователя, и будет использоваться в логах, в header iv-user и тому подобное. По умолчанию preferred_username

OIDC_CHANGE_ORG_ENDPOINT

iamproxy.k8s.oidc.change_org_endpoint

oidc_change_org_endpoint

Ссылка на endpoint смены организации на IDP (реализован на KCSE в провайдере ЕСИА). При его вызове передаются параметры client_uuid, redirect_uri, org_id. По умолчанию keycloak_base_url

OIDC_POST_CHANGE_ORG_ENDPOINT

iamproxy.k8s.oidc.post_change_org_endpoint

oidc_post_change_org_endpoint

Ссылка, на которую будет перенаправление после успешной смены организации на IDP. Пример: /portal/start-page

OIDC_MAP_HEADERS

iamproxy.k8s.oidc.map_headers

oidc_map_headers

Добавить HTTP-заголовки по токену, пример: header-with-user-id=sub, user_roles=realm_access.roles , user.audiences=aud, User-FIO=name, user-access-systems=resource_access

OIDC_MAP_ROLES

iamproxy.k8s.oidc.map_roles

oidc_map_roles

Задать мапинг получения ролей из токена, пример: realm_roles=realm_access.roles, root_roles=roles, client_roles=resource_access.${client_id}.roles, esia.roles.from_userinfo=userinfo@esia.roles

OIDC_USERINFO_MAP

iamproxy.k8s.oidc.userinfo_map

oidc_userinfo_map

Задать мапинг получения части userinfo из токена для сохранения\кеширования в сессии, пример: esia.roles=esia.roles, org=upper@organization.org_name, client_roles=resource_access.${client_id}.role. После задания маппинга, к сохраненной части можно будет обратиться через модификатор userinfo в мапингах, пример: org_from_userinfo=userinfo@org

OIDC_ACCESS_TOKEN_EXPIRES_LEEWAY_RAND

iamproxy.k8s.oidc.acces_token_expires_leeway_rand

oidc_access_token_expires_leeway_rand

За сколько секунд до истечения access-токена обновить токены (реальное количество секунд будет выбрано случайным образом от этого числа, а ошибка обновления будет проигнорирована если access-токен действителен). Можно указать проценты от времени действия access-токена, например 20% или 0.2

OIDC_REVOKE_TOKENS_ON_LOGOUT

iamproxy.k8s.oidc.revoke_tokens_on_logout

oidc_revoke_tokens_on_logout

True/False, по умолчанию False. Включить процедуру отзыва токенов при logout (отзываются токены refresh и\или access при их наличии, и при условии что IDP поддерживает отзыв/revoke токенов)

OIDC_DISABLE_LOGOUT_IN_IDP

iamproxy.k8s.oidc.disable_logout_in_idp

oidc_disable_logout_in_idp

True/False, по умолчанию False. Не производить logout сессии пользователя на IDP (logout на IDP обычно закрывает сессии всех клиентов\АС, созданных на данном IDP от имени пользователя)

OIDC_IGNORE_SSO_ON_IDP

iamproxy.k8s.oidc.ignore_sso_on_idp

oidc_ignore_sso_on_idp

True/False, по умолчанию False. Включить принудительный запрос логин/пароля при каждой аутентификации на IDP (игнорируем SSO)

OIDC_REUSE_REFRESH_COUNT

iamproxy.k8s.oidc.reuse_refresh_count

oidc_reuse_refresh_count

Опциональный, по умолчанию -1, определяет количество повторных использований одного refresh токена (значение менее 0 снимает ограничение)

AUTHZ_SPAS_URL

iamproxy.k8s.authz.spas_url

authz_spas_url

URL для обращения в API SPAS/ОСА. Пример: https://10.x.x.10:8443/spas/rest, url для вызова API SPAS

AUTHZ_SPAS_SECRET

iamproxy.k8s.authz.spas_secret

authz_spas_secret

Псевдосекрет для вызова API SPAS. Пример: 123456

AUTHZ_SPAS_TICKET_LIFETIME

iamproxy.k8s.authz.spas_tickeet_lifetime

authz_spas_ticket_lifetime

Частота обновления тикета ОСА/SPAS, в сек. Пример: 3600

AUTHZ_SPAS_TICKET_FAILED_LIFETIME

iamproxy.k8s.authz.spas_tickeet_failed_lifetime

authz_spas_ticket_failed_lifetime

Частота получения тикета ОСА/SPAS, если ранее попытка была неуспешной, в сек. Пример: 5

AUTHZ_SPAS_RIGHTS_LIFETIME

iamproxy.k8s.authz.spas_tickeet_rights_lifetime

authz_spas_rights_lifetime

Частота обновления полномочий из ОСА/SPAS, в сек. Пример: 60

AUTHZ_SPAS_RIGHTS_FAILED_LIFETIME

iamproxy.k8s.authz.spas_tickeet_rights_filed_lifetime

authz_spas_rights_failed_lifetime

Частота обновления полномочий из ОСА/SPAS, если ранее попытка была неуспешной, в сек. Пример: 5

AUTHZ_SPAS_SSL_VERIFY

iamproxy.k8s.authz.spas_ssl_verify

authz_spas_ssl_verify

Проверять сертификат на endpoint authz_spas_url. Пример: False

AUTHZ_OPA_URL

iamproxy.k8s.authz.opa_url

authz_opa_url

URL для вызова API OPA. Пример https://10.x.x.10:8443/ssp-portal/rm/api/v1/check

AUTHZ_OPA_SSL_VERIFY

iamproxy.k8s.authz.opa_ssl_verify

authz_opa_ssl_verify

Проверять сертификат на endpoint authz_spas_url. Пример: False

READ_DATA_FROM_RDS_TIME_IN_SEC

iamproxy.k8s.rdsserver.read_data_from_rds_time_in_sec

read_data_from_rds_time_in_sec

Частота опроса RDS-серверов на наличие изменений. Пример: 10

PROXY_LOG_TO_FLUENT_BIT_ACCESS_LOG

logger_options.proxy_access_log

Опциональный. путь до файла access-логов отправляемых через fluent-bit (можноуказать сервер-syslog, например syslog:server=127.0.0.1:15140)

PROXY_LOG_TO_FLUENT_BIT_ERROR_LOG

logger_options.proxy_error_log

Опциональный. путь до файла error-логов отправляемых через fluent-bit (можно указать сервер-syslog, например syslog:server=127.0.0.1:15141)

logger_options.rds_client_log_dir

Опциональный. По умолчанию logs, путь до каталога логов RDS Client, отправляемых через fluent-bit

PROXY_ROTATE_FILES

proxy_rotate_files

Опциональный. Полные пути до файлов логов (через запятую), которые надо ротировать

PROXY_ROTATE_FILE_SIZE

proxy_rotate_file_size

Опциональный. По умолчанию 4000, максимальный размер одного файла в кб

PROXY_ROTATE_TOTAL_SIZE

proxy_rotate_total_size

Опциональный. По умолчанию 40000, максимальный размер всех файлов в кб, которые под ротацией

PROXY_REQUEST_TO_UI_REGEX

iamproxy.k8s.request_to_ui_regex

proxy_request_to_ui_regex

Опциональный. По умолчанию /$, регулярное выражение применяемое к URI запроса, при совпадении считается что тип запроса - запрос к UI

PROXY_REQUEST_TO_API_REGEX

iamproxy.k8s.request_to_api_regex

proxy_request_to_api_regex

Опциональный. По умолчанию /api/, регулярное выражение применяемое к URI запроса, при совпадении считается что тип запроса - запрос к API

CORS_ALLOW_ORIGINS

iamproxy.k8s.cors.allow_origins

cors_allow_origins

Опциональный. По умолчанию разрешены источники дочерние от fqdn IAM Proxy. Опция задает регулярное выражение определяющее разрешенные источники запроса при CORS (проверка на точное совпадение с заголовком Origin из запроса), с которых разрешается доступ к ответу на запрос (используется для заполнения заголовка Access-Control-Allow-Origin). Значение ** разрешает доступ для любого источника (всегда возвращает значение из заголовка Origin). Применяется для ответвлений с фильтром rds-enable-cors.location.conf

CORS_ALLOW_METHODS

iamproxy.k8s.cors.allow_methods

cors_allow_methods

Опциональный. По умолчанию значения GET, POST, PUT, DELETE, HEAD. Опция определяющая разрешенные методы для запроса при CORS (используется для заполнения заголовка Access-Control-Allow-Methods). Значение ** разрешает использовать все запрошенные методы (возвращается значение из заголовка Access-Control-Request-Method). Применяется для ответвлений с фильтром rds-enable-cors.location.conf

CORS_ALLOW_HEADERS

iamproxy.k8s.cors.allow_headers

cors_allow_headers

Опциональный. По умолчанию значения Origin, Content-Type. Опция определяющая список разрешенных HTTP-заголовков, которые могут использоваться в запросе при CORS. Значение ** разрешает использовать все запрошенные заголовки (возвращается значение из заголовка Access-Control-Request-Headers). Применяется для ответвлений с фильтром rds-enable-cors.location.conf

PROXY_LIMIT_REQ_JCT_IS_PER_SESSION

proxy_limit_req_jct_is_per_session

По умолчанию False, при True ограничения по ответвлениям (заданные в limitRequests) будут действовать по каждой сессии аутентификации отдельно

Примечания#

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