Что нужно сделать при обновлении до 2.5

Предварительные условия

  1. Получите релиз с обновлениями. Обновление производится с учетом вашей схемы развертывания и внутренних регламентов обновления ПО.

  2. Выполните резервное копирование БД PAM.

  3. Запланируйте окно обслуживания.

Обновление до 2.5

Шаг 1. Отправка событий login/logout error

Чтобы события аудита операций входа в PAM, выхода и ошибок регистрировались корректно, добавьте в типы событий Login error и Logout error.

  1. Откройте Keycloak и перейдите в окружение pam.

  2. В разделе "Realm Settings" → "Events" → "User events settings" добавьте дополнительные типы событий Event saved types — Login error и Logout error.

  3. Проверьте, что в списке событий перечислены:

    • Login

    • Login error

    • Logout

    • Logout error

Шаг 2. Правила генерации паролей

Чтобы правила генерации паролей в PAM работали корректно, настройте права на изменение парольных политик Vault.

  1. Откройте Vault → ACL Policies → control.

  2. Замените:

    path "sys/policies/password/*" { capabilities = ["read"] }

    на:

    path "sys/policies/password/*" { capabilities = ["create", "update", "read", "delete"] }

Шаг 3. Просмотр пароля ПУЗ

Чтобы просматривать пароль ПУЗ в окне подключения в PAM, добавьте в конфигурационный файл control:

# Service auth SERVICE_AUTH_ALLOWED_USERNAMES=pam_user_web_api

Шаг 4. Настройка парсинга get запросов в traefik

Для корректного парсинга urlencoded GET-запросов через traefik, добавьте

в docker-compose.yml:

... services: ... traefik: ... command: >- --accessLog=true ... --entryPoints.https.http.encodedCharacters.allowEncodedSlash=true

Шаг 5. Исправление статусов сессий

Чтобы статусы активных сессий случайно не были изменены на закрытые в автоматическом режиме, проверьте параметры конфигурации control:

RUNNER_WORKERS_KEEP_ALIVE_CLOSER_CRON_EXPRESSION: "0 */10 * * * *" # Каждые 10 минут RUNNER_WORKERS_KEEP_ALIVE_NOTIFIER_CRON_EXPRESSION: "0 */3 * * * *" # Каждые 3 минуты

Шаг 6. Настройка source-address и MFA Cache

Для корректной работы сертификатов проверьте и добавьте:

  1. В файл config.yml сервиса worker-ssh:

    service: proxy_protocol_enabled: false # enable proxy protocol v1/v2 support
  2. В env:

    SERVICE_FORWARD_X11_ENABLED: true SERVICE_PROXY_PROTOCOL_ENABLED=true
  3. В docker-compose.yml:

    worker-ssh: ... labels: - traefik.tcp.routers.${COMPOSE_PROJECT_NAME:-bpam}-worker-ssh.service=${COMPOSE_PROJECT_NAME:-bpam}-worker-ssh - traefik.tcp.services.${COMPOSE_PROJECT_NAME:-bpam}-worker-ssh.loadbalancer.proxyProtocol.version=2

Шаг 7. Синхронизация ресурсов

Для настройки синхронизации ресурсов используются новые сервисы — temporal-server и worker-import-target. Чтобы настроить их работу:

  1. Проверьте, что в Vault политике (ACL) роли control есть права на pam_int/import_configuration/*:

    path "pam_int/import_configuration/*" { capabilities = ["read", "create", "update", "delete"] }
  2. Добавьте новый конфигурационный файл — worker-import-target.env.

    ###Main config # Additional configuration for worker-import-target service
  3. Измените docker-compose.yml для control, temporal-server и worker-import-target:

    control: ... environment: TEMPORAL_HOST_PORT: temporal-server:7233 ... ... temporal-server: <<: *container image: ${IMAGE_PRIVATE_REGISTRY_SERVICE?err}/temporal-server:$TEMPORAL_SERVER_VERSION ports: - "7233:7233" environment: - DB=postgres12 - DB_PORT=$DB_PORT - POSTGRES_USER=$DB_USERNAME - POSTGRES_PWD=$DB_PASSWORD - POSTGRES_SEEDS=$DB_HOST - TEMPORAL_ADDRESS=temporal-server:7233 - TEMPORAL_CLI_ADDRESS=temporal-server:7233 - TEMPORAL_START_WORKFLOW_DISABLED=false - TEMPORAL_HOME=/etc/temporal - BIND_ON_IP=0.0.0.0 - TEMPORAL_CONFIG_DIR=/etc/temporal/config labels: - traefik.enable=true - traefik.http.routers.${COMPOSE_PROJECT_NAME:-bpam}-temporal.rule=Host(`temporal.${VIRTUAL_HOST:?err}`) - traefik.http.routers.${COMPOSE_PROJECT_NAME:-bpam}-temporal.entrypoints=https - traefik.http.routers.${COMPOSE_PROJECT_NAME:-bpam}-temporal.tls=true - traefik.http.services.${COMPOSE_PROJECT_NAME:-bpam}-temporal.loadbalancer.server.port=7233 - traefik.http.services.${COMPOSE_PROJECT_NAME:-bpam}-temporal.loadbalancer.server.scheme=h2c - traefik.http.routers.${COMPOSE_PROJECT_NAME:-bpam}-temporal-http.rule=Host(`temporal.${VIRTUAL_HOST:?err}`) - traefik.http.routers.${COMPOSE_PROJECT_NAME:-bpam}-temporal-http.entrypoints=http - traefik.http.routers.${COMPOSE_PROJECT_NAME:-bpam}-temporal-http.middlewares=default-https-redirect@docker expose: - 7233 depends_on: postgres: condition: service_healthy worker-import-target: <<: *container image: ${IMAGE_PRIVATE_REGISTRY_SERVICE?err}/worker-import-target:${WORKER_IMPORT_TARGET_VERSION} environment: TZ: $TZ TEMPORAL_HOST_PORT: temporal-server:7233 CONTROL_GRPC_ADDRESS: ${CONTROL_HOST:?err}:${CONTROL_GRPC_PORT:?err} env_file: - worker-import-target.env depends_on: control: condition: service_started

Шаг 8. Исправление прерываний длительной RDP-сессии

Чтобы исправить проблему с сессиями, которые длятся больше 30 минут и не разрываются из интерфейса PAM, добавьте в конфигурационный файл control:

RUNNER_WORKERS_KEEP_ALIVE_CLOSER_CRON_EXPRESSION: "0 */10 * * * *" RUNNER_WORKERS_KEEP_ALIVE_CLOSER_CRON_ENABLED: false RUNNER_WORKERS_SESSION_TERMINATOR_CRON_ENABLED: false

Шаг 9. Проброс заголовка x-forwarded-for

Чтобы Keycloak корректно регистрировал real ip пользователей для аудита событий:

  1. Добавьте в Keycloak:

    KC_PROXY: edge KC_HOSTNAME_STRICT: "false" KC_LOG_LEVEL: INFO
  2. В настройки traefik:

    services: traefik: command: --entryPoints.https.forwardedHeaders.trustedIPs=0.0.0.0/0 --entryPoints.http.forwardedHeaders.trustedIPs=0.0.0.0/0

Шаг 10. Исправление списка "Все подключения"

Чтобы отобразить подключения в разделе Все подключения для локальных групп пользователей контейнера, внесите правки в control и web-api:

EXTERNAL_DATABASES_KEYCLOAK_DATABASE_SCHEMA=pam_auth

Шаг 11. Проверка закрытых сессий

Чтобы система автоматически закрывала сессии, у которых таймаут переподключения больше последнего времени взаимодействия, настройте:

  1. Конфигурационный файл control:

    runner: workers: ... keep_alive_closer: # Воркер проверки просроченных keep-alive по сессиям cron: enabled: true # Включает или выключает воркер expression: "* 0 * * * *" # Расписание запуска (6-field cron format) (every hour) params: timeout: 10m                # Таймаут на выполнение одного запуска acquire_timeout: 1m         # Время ожидания блокировки (lock), должно быть больше locker.lease_duration.
  2. Конфигурационный файл worker-ssh:

    runner: workers: keep_alive_notifier: # Воркер отправки keep-alive в control cron: enabled: true # Включает или выключает воркер expression: "* */10 * * * *" # Расписание запуска (6-field cron format) (every 10 min) params: timeout: 5m                  # Таймаут на отправку keep-alive по открытым сессиям acquire_timeout: 1m            # Время ожидания блокировки (lock), должно быть больше locker.lease_duration.
  3. Конфигурационный файл worker-rdp. Пример из шаблона rdpctl.ini:

    # Период отправки keep-alive в control keepAliveIntervalSec = {{ env.Getenv "RDPCTL_KEEP_ALIVE_INTERVAL_SEC" "1800" }}

Шаг 12. Расписание доступа

Для настройки доступа к ресурсу по расписанию, добавьте в конфигурационный файл control:

runner: workers: ... session_terminator: # Воркер, который следит, за просроченными по расписанию доступа, сессиями cron: enabled: true # Включает или выключает воркер expression: "0 */10 * * * *" # Расписание запуска (6-field cron format) (every 10 min) params: timeout: 1m                  # Таймаут на выполнение каждого запуска воркера acquire_timeout: 1m            # Время ожидания блокировки (lock), должно быть больше locker.lease_duration. limit: 100                   # Максимальный размер пачки сессий, которая будет обработана за 1 раз

Шаг 13. Секреты для подключения к S3

Чтобы получать секреты для S3 из control для audit-log-sender:

  1. Добавьте в audit-log-sender настройки подключения к control:

    external_clients: control: grpc: address: 127.0.0.1:9080 security: enabled: false ca_cert: deploy/config/local/certs/client.cert.pem use_mtls: false cert: deploy/config/local/certs/test.crt key: deploy/config/local/certs/test.key keep_alive_params: enabled: false time: 41s timeout: 42s permit_without_stream: false connect_params: enabled: false min_connect_timeout: 30s backoff: base_delay: 43s multiplier: 44 jitter: 45 max_delay: 46s
  2. Замените настройки S3:

    storage: type: s3 local: destination_path: local/storage s3: endpoint: storage.yandexcloud.net bucket_name: demopam-s3-records access_key_id: some_access_key_id secret_access_key: some_secret_access_key use_ssl: true timeout: 15m shutdown_wait_duration: 30s mtls: cacert: /opt/bpam/audit-log-sender/certs/s3/ca.pem client_cacert: /opt/bpam/audit-log-sender/certs/s3/client.cert.pem client_cacert_key: /opt/bpam/audit-log-sender/certs/s3/client.key.pem enabled: false

    на:

    storage: type: s3 s3: bucket_name: demopam-s3-records timeout: 15m s3: endpoint: storage.yandexcloud.net bucket_name: demopam-s3-records use_ssl: true shutdown_wait_duration: 30s mtls: cacert: /opt/bpam/audit-log-sender/certs/s3/ca.pem client_cacert: /opt/bpam/audit-log-sender/certs/s3/client.cert.pem client_cacert_key: /opt/bpam/audit-log-sender/certs/s3/client.key.pem enabled: false

Шаг 14. Добавление событий по политикам доступа

Для отправки новых событий:

"B_VendorEventID":"credential_view_password", ... "B_VendorEventID":"policy_insert", "B_VendorEventID":"policy_update", "B_VendorEventID":"policy_delete",

настройте:

  1. Базу данных:

    ALTER TABLE pam.policy REPLICA IDENTITY FULL; CREATE PUBLICATION policy FOR table pam.policy; SELECT pg_create_logical_replication_slot('policy', 'pgoutput');
  2. debezium-connectors:

    name: policy config: connector.class: io.debezium.connector.postgresql.PostgresConnector database.hostname: "{{ _pam_postgres_host }}" database.port: "{{ _pam_postgres_port }}" database.user: "{{ _pam_postgres_user }}" database.password: "{{ _pam_postgres_password }}" database.dbname: "{{ _pam_postgres_db }}" table.include.list: pam.policy topic.prefix: check_policy topic.creation.default.replication.factor: 1 topic.creation.default.partitions: 1 topic.creation.enable: true offset.storage.replication.factor: 1 transforms: routeToCustomTopic transforms.routeToCustomTopic.type: org.apache.kafka.connect.transforms.RegexRouter transforms.routeToCustomTopic.regex: .* transforms.routeToCustomTopic.replacement: policy publication.name: policy slot.name: policy plugin.name: pgoutput
  3. event-sender — consumers:

    kafka: streamgate: tables: policy: "pam.policy" pam: consumers: consumer_policy_pkb: group_id: "policy-pkb" #kafka group_id topic: "policy" enable_send_to_pkb: true enable_send_to_log: false pkb: producers: producer_policy_update: topic: "policy_update-PKB" # kafka topic отправка события изменения policy producer_policy_insert: topic: "policy_insert-PKB" # kafka topic отправка события создания policy producer_policy_delete: topic: "policy_delete-PKB" # kafka topic отправка события удаления policy producer_credential_view_password: topic: "credential_view_password-PKB" # kafka topic отправка события просмотра пароля
  4. Проверьте env для event-sender:

    API_INTEGRATION_KEYCLOAK_HOST=http://auth:8080 API_INTEGRATION_KEYCLOAK_CLIENT_ID=${WEB_API_KEYCLOAK_USER_INTEGRATION?err} API_INTEGRATION_KEYCLOAK_CLIENT_SECRET=${WEB_API_KEYCLOAK_USER_INTEGRATION_PASSWORD?err}
  5. Проверьте, что в control есть настройка:

    ##### Service auth SERVICE_AUTH_ALLOWED_USERNAMES=pam_user_web_api

Шаг 15. Проверка настроек direct grant OTP и аутентификации в Keycloak

Проверьте, что аутентификация настроена аутентификация в Keycloak и PAM.

Шаг 16. Аудит событий аутентификации

Чтобы корректно работал аудит событий под администратором PAM:

  1. В конфигурационный файл event-sender добавляются новый consumer и producer для таких событий:

    consumer_admin_login_pkb: group_id: "admin_login-pkb" #kafka group_id topic: "event_entity" #kafka topic Регистрация входов администраторов в системы PAM и KEYCLOAK enable_send_to_pkb: true enable_send_to_log: false ... producer_admin_login: topic: "admin_login-PKB" # kafka topic Регистрация входов администраторов в системы PAM и KEYCLOAK
  2. Включите внутренний аудит событий в Keycloak. Откройте окружение master.

  3. Перейдите в Realm settings → Events → User Events Settings.

  4. Включите Save events.

  5. Укажите Expiration больше 1 дня

  6. Нажмите кнопку Add saved types и добавьте все доступные типы событий.

  7. Перейдите на вкладку Admin Events Settings.

  8. Включите Save events и Include representation.

  9. Укажите Expiration больше 1 дня. Сохраните изменения

После этого события входа под администратором в Keycloak будут отслеживаться и отправляться в топик event_entity, а после обработки event-sender события будут уходить в топик admin_login-PKB.

Шаг 17. Исправление sonarqube, deptrack

Чтобы audit-log-sender получал информацию о секретах для S3 из control:

  1. Измените параметры audit-log-sender:

    STORAGE_S3_USE_SSL=false STORAGE_S3_MTLS_ENABLED=false

    на:

    S3_USE_SSL=false S3_MTLS_ENABLED=false
  2. Измените параметры control:

    KEYCLOAK_REALM=pam

    на:

    KEYCLOAK_MAIN_REALM_NAME=pam
  3. Измените docker-compose.yml для control:

    control: environment: ... KEYCLOAK_CLIENT_ID: ${KEYCLOAK_CLIENT_ID?err} KEYCLOAK_CLIENT_SECRET: ${KEYCLOAK_CLIENT_SECRET:?err}

    на:

    control: environment: ... KEYCLOAK_MAIN_REALM_CLIENT_ID: ${KEYCLOAK_CLIENT_ID?err} KEYCLOAK_MAIN_REALM_CLIENT_SECRET: ${KEYCLOAK_CLIENT_SECRET:?err}
  4. Измените docker-compose.yml для audit-log-sender-*:

    audit-log-sender-*: environment: ... STORAGE_S3_ENDPOINT: ${MINIO_HOST:?err}:9000 STORAGE_S3_ACCESS_KEY_ID: ${MINIO_ROOT_USER:?err} STORAGE_S3_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:?err}

    на:

    audit-log-sender-*: environment: ... S3_ENDPOINT: ${MINIO_HOST:?err}:9000 EXTERNAL_CLIENTS_CONTROL_GRPC_ADDRESS: ${CONTROL_HOST:?err}:${CONTROL_GRPC_PORT:?err} EXTERNAL_CLIENTS_CONTROL_GRPC_SECURITY_ENABLED: false
  5. Измените конфигурацию event-sender:

    WEB_API_INTEGRATION_KEYCLOAK_HOST=http://auth:8080 WEB_API_INTEGRATION_KEYCLOAK_CLIENT_ID=${WEB_API_KEYCLOAK_USER_INTEGRATION?err} WEB_API_INTEGRATION_KEYCLOAK_CLIENT_SECRET=${WEB_API_KEYCLOAK_USER_INTEGRATION_PASSWORD?err}

    на:

    KEYCLOAK_HOST=http://auth:8080 KEYCLOAK_MAIN_REALM_NAME=pam KEYCLOAK_MAIN_REALM_CLIENT_ID=${WEB_API_KEYCLOAK_USER_INTEGRATION?err} KEYCLOAK_MAIN_REALM_CLIENT_SECRET=${WEB_API_KEYCLOAK_USER_INTEGRATION_PASSWORD?err}

Шаг 18. Обновление access-токена

Чтобы access-токен для сервисов обновлялся корректно, когда expire_date берется не из конфигурационного файла, а из выданного JWT:

  1. Удалите настройку refresh из конфигурационного файла control:

    keycloak: ... refresh: 15m
  2. Удалите настройку refresh из конфигурационного файла web-api:

    auth: ... keycloak: ... refresh: 1000s
  3. Удалите настройку refresh из конфигурационного файла event-sender:

    keycloak: ... refresh: 15m

Шаг 19. Исправление ошибки проверки внешних тикетов

Чтобы запрос во внешнюю тикет систему отправлялся корректно, добавьте в

external-tickets-sorg-adapter блок common в секцию grpc_server:

grpc_server: common: port: 9090 reflection: true security: cert: enabled: false key: use_mtls: false ca_cert:

Обновление до 2.5.1

Шаг 20. Исправление повторной обработки сообщений event-sender

Чтобы корректно обрабатывать битые сообщения, внесите изменения в файл config.yaml сервиса event-sender.

  1. Укажите параметры:

    1. потребителей:

      retry_backoff: 5s #  number of seconds to wait before retrying a Kafka message fetch(such as after EOF or temporary network errors) heartbeat_interval: 3s # frequency (in seconds) at which the consumer sends heartbeat signals to the group coordinator session_timeout: 30s  # time (in seconds) after which a consumer is considered dead if no heartbeat is received
    2. продюсеров:

      max_attempts: 3 # maximum number of times the producer retries sending a message before giving up write_timeout: 10s # timeout in seconds for a single write attempt to Kafka
  2. Добавьте новый топик для битых сообщений:

    producer_dlq: topic: "dead-letter" #  kafka topic битых сообщений, что не получилось обработать

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

Обновление до 2.5.2

Шаг 21. Исправление списка подключений для контейнеров с импортированными группами пользователей

Чтобы список раздела Все подключения корректно формировал подключения для всех контейнеров, которые содержат импортированные из AD группы пользователей, добавьте в конфигурационный файл в web-api параметр:

EXTERNAL_DATABASES_KEYCLOAK_DATABASE_SCHEMA: pam_auth

Обновление до 2.5.3

Шаг 22. Добавление набора атрибутов в конфигурационный файл Vault для Tacacs Plugin

Если вы используете Tacacs Plugin для хранилища секретов, добавьте в файл Vault config.yaml набор атрибутов user_attributes_for_remove. Это нужно для удаления cisco acs пользователя при обновлении параметров.

acs: ... http_user_operations: update: xml_transformer: enabled:true user_attributes_for_remove: # Набор атрибутов, которые удаляются у cisco acs пользователя) -"priv_lvl" -"max_priv_lvl"

Обновление до 2.5.4

Шаг 23. Проброс IP-адресов на воркерах и увеличение таймаута worker-rdp

Чтобы исправить проблему с пробросом реальных IP-адресов на воркерах добавьте поддержку proxy_protocol в файлах:

  • worker-ssh — config.yaml.

    service: ... proxy_protocol_enabled:false# enable proxy protocol v1/v2support
  • worker-rdp — rdpproxy.ini.

    [globals] # Read the PROXY protocol header to get the real client address behind a L4 load balancer proxy_protocol_enabled = false

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

Дополнительно, для worker-rdp вы можете увеличить таймаут, если в логах прокси встречаются ошибки.

[globals] ... handshake_timeout =90