Что нужно сделать при обновлении до 2.5
Предварительные условия
Получите релиз с обновлениями. Обновление производится с учетом вашей схемы развертывания и внутренних регламентов обновления ПО.
Выполните резервное копирование БД PAM.
Запланируйте окно обслуживания.
Обновление до 2.5
Шаг 1. Отправка событий login/logout error
Чтобы события аудита операций входа в PAM, выхода и ошибок регистрировались корректно, добавьте в типы событий Login error и Logout error.
Откройте Keycloak и перейдите в окружение pam.
В разделе "Realm Settings" → "Events" → "User events settings" добавьте дополнительные типы событий Event saved types — Login error и Logout error.
Проверьте, что в списке событий перечислены:
Login
Login error
Logout
Logout error
Шаг 2. Правила генерации паролей
Чтобы правила генерации паролей в PAM работали корректно, настройте права на изменение парольных политик Vault.
Откройте Vault → ACL Policies → control.
Замените:
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
Для корректной работы сертификатов проверьте и добавьте:
В файл
config.ymlсервисаworker-ssh:service: proxy_protocol_enabled: false # enable proxy protocol v1/v2 supportВ
env:SERVICE_FORWARD_X11_ENABLED: true SERVICE_PROXY_PROTOCOL_ENABLED=trueВ
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. Чтобы настроить их работу:
Проверьте, что в Vault политике (ACL) роли
controlесть права наpam_int/import_configuration/*:path "pam_int/import_configuration/*" { capabilities = ["read", "create", "update", "delete"] }Добавьте новый конфигурационный файл —
worker-import-target.env.###Main config # Additional configuration for worker-import-target serviceИзмените
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 пользователей для аудита событий:
Добавьте в Keycloak:
KC_PROXY: edge KC_HOSTNAME_STRICT: "false" KC_LOG_LEVEL: INFOВ настройки
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. Проверка закрытых сессий
Чтобы система автоматически закрывала сессии, у которых таймаут переподключения больше последнего времени взаимодействия, настройте:
Конфигурационный файл
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.Конфигурационный файл
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.Конфигурационный файл
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:
Добавьте в
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Замените настройки 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",
настройте:
Базу данных:
ALTER TABLE pam.policy REPLICA IDENTITY FULL; CREATE PUBLICATION policy FOR table pam.policy; SELECT pg_create_logical_replication_slot('policy', 'pgoutput');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: pgoutputevent-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 отправка события просмотра пароляПроверьте
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}Проверьте, что в control есть настройка:
##### Service auth SERVICE_AUTH_ALLOWED_USERNAMES=pam_user_web_api
Шаг 15. Проверка настроек direct grant OTP и аутентификации в Keycloak
Проверьте, что аутентификация настроена аутентификация в Keycloak и PAM.
Шаг 16. Аудит событий аутентификации
Чтобы корректно работал аудит событий под администратором PAM:
В конфигурационный файл
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Включите внутренний аудит событий в Keycloak. Откройте окружение master.
Перейдите в Realm settings → Events → User Events Settings.
Включите Save events.
Укажите Expiration больше 1 дня
Нажмите кнопку Add saved types и добавьте все доступные типы событий.
Перейдите на вкладку Admin Events Settings.
Включите Save events и Include representation.
Укажите Expiration больше 1 дня. Сохраните изменения
После этого события входа под администратором в Keycloak будут отслеживаться и отправляться в топик event_entity, а после обработки event-sender события будут уходить в топик admin_login-PKB.
Шаг 17. Исправление sonarqube, deptrack
Чтобы audit-log-sender получал информацию о секретах для S3 из control:
Измените параметры
audit-log-sender:STORAGE_S3_USE_SSL=false STORAGE_S3_MTLS_ENABLED=falseна:
S3_USE_SSL=false S3_MTLS_ENABLED=falseИзмените параметры
control:KEYCLOAK_REALM=pamна:
KEYCLOAK_MAIN_REALM_NAME=pamИзмените
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}Измените
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Измените конфигурацию
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:
Удалите настройку
refreshиз конфигурационного файлаcontrol:keycloak: ... refresh: 15mУдалите настройку
refreshиз конфигурационного файлаweb-api:auth: ... keycloak: ... refresh: 1000sУдалите настройку
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.
Укажите параметры:
потребителей:
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продюсеров:
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
Добавьте новый топик для битых сообщений:
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/v2supportworker-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