Перейти к содержанию

Развертывание сервисов Marivanna и Calypso

Установка микросервисов в связке с монолитом

Данная инструкция поможет в авторизации и развертывании микросервисов и инфраструктурной обвязки.

  1. Установка начинается с stingray-infra:

    • stingray-infra включает в себя все инфраструктурные зависимости;
    • stingray-stack включает в себя микросервисы.
  2. Необходимо получить от поставщика ключ от сервисного аккаунта (далее authorized_key.json) и авторизоваться с устройства, на котором будет осуществляться развертывание.

  3. На устройстве необходимо установить:

    Примечание

    Если вы используете версию Helm ниже 3.8.0, включите поддержку Open Container Initiative в клиенте Helm:

    export HELM_EXPERIMENTAL_OCI=1
    
  4. Необходимо авторизоваться для получения Helm charts:

    yc config set service-account-key authorized_key.json
    export YC_IAM_TOKEN=$(yc iam create-token)
    echo $YC_IAM_TOKEN | helm registry login cr.yandex -u iam --password-stdin
    
  5. После успешной авторизации получим Helm charts:

    helm pull oci://cr.yandex/crp8p3a3l1ri2431n3ce/microservices/charts/release/calypso:latest --untar
    helm pull oci://cr.yandex/crp8p3a3l1ri2431n3ce/microservices/charts/release/marivanna:latest --untar
    
  6. В Kubernetes в namespace, куда планируется развертка, необходимо создать секрет при авторизации в YCR (authorized_key.json) для пула образов с именем registrypullsecret или заменить на свой в данной секции:

    imagePullSecrets:
    - name: registrypullsecret
    
    apiVersion: v1 
    kind: Secret 
    metadata:
        name: registrypullsecret
        namespace: # где будет установлен stingray-stack 
    data:
        .dockerconfigjson: >-
        # содержимое ключа для авторизации
    type: kubernetes.io/dockerconfigjson
    
  7. Необходимо заполнить все необходимые параметры в values и установить чарт с stingray-infra в необходимый namespace, а далее и в stingray-stack.

stingray-infra

Состоит из:

    dependencies:
    - condition: keycloak.enabled 
      name: keycloak
      repository: oci://registry-1.docker.io/bitnamicharts
    - condition: postgresql.enabled 
      name: postgresql
      repository: oci://registry-1.docker.io/bitnamicharts
    - condition: redis.enabled 
      name: redis
      repository: oci://registry-1.docker.io/bitnamicharts
    - condition: minio.enabled 
      name: minio
      repository: oci://registry-1.docker.io/bitnamicharts
    - condition: kafka.enabled 
      name: kafka
      repository: oci://registry-1.docker.io/bitnamicharts
    - condition: oauth2-proxy.enabled 
      name: oauth2-proxy
      repository: oci://cr.yandex/crp8p3a3l1ri2431n3ce/charts

У каждой инфраструктурной зависимости есть helm-хук для контроля развертывания.

Порядок создания следующий:

  • PostgreSQL.
  • Keycloak / ZooKeeper.
  • Keycloak-provisioning / Kafka / Redis.
  • MinIO.
  • MinIO-provisioning.
  • OAuth2.

Примечание

stingray-infra в дефолтной развертке не имеет PV/PVC. Если это необходимо, укажите для них персистентное хранилище данных. Примеры указания есть в исходных чартах stingray-infra/charts/$SERVICE/values.yaml.

stingray-stack

Состоит из:

    dependencies:
    - condition: marivanna.enabled 
      name: marivanna
      repository: oci://cr.yandex/crp8p3a3l1ri2431n3ce/microservices/charts/release/calypso:latest
    - condition: calypso.enabled
      name: calypso
      repository: oci://cr.yandex/crp8p3a3l1ri2431n3ce/microservices/charts/release/marivanna:latest

Marivanna. Анализ приложений методом байт-код

Описание

Сервис для анализа Android-приложений методом байт-код анализа.

Функциональные возможности

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

Используемые топики

Переменная marivanna.1.0.taskEvents, используется для уведомления о состоянии сканирования.

БД

Redis.

Переменные сервиса

  • REST API container

    С таблицами переменных доступа и настроек логирования можно ознакомиться в разделах «Доступ к S3», «Доступ к Redis», «Доступ к Kafka», «Настройки логирования».

  • Worker container

    С таблицами переменных доступа и настроек логирования можно ознакомиться в разделах «Доступ к S3», «Доступ к Redis», «Доступ к Kafka», «Настройки логирования».

    Настройки сервиса:

    Имя переменной Описание Примечание Варианты значений Обязательно Пример значения Значение в values
    STG_MARIANA_CONF_DIR Директория с конфигами mariana Если не указывать, будет применяться дефолтный путь - /app/mariana-trench - Нет /app/mariana-trench -

Схема интеграции сервиса Marivanna

Шаг 1. Получение авторизационного токена. Бэкенд монолита, используя переданные ему client_id и client_secret, авторизуется в Keycloak и получает access_token.

Шаг 2. Отправка запроса в сервис Marivanna. Запрос снабжается Authorization-заголовком, содержащим полученный access_token.

Шаг 3. Проверка входящего запроса на наличие валидного Authorization-заголовка.

Шаг 4.1. Запрос далее перенаправляется в целевой сервис (Marivanna).

Шаг 4.2. В случае невалидного Authorization-заголовка (или его отсутствия), монолиту возвращается HTTP 401.

Организация сетевого доступа

Необходимо настроить сетевую инфраструктуру таким образом, чтобы монолиту были доступны следующие ресурсы:

  1. Keycloak/Platform V IAM.
  2. Ingress (MinIO-api, OAuth2, Keycloak, а также микросервис, который закрыт backend-auth аннотацией).

Эти ресурсы должны быть доступны по протоколам и портам, соответствующим тем URL, которые были переданы в переменные окружения MARIVANNA_BASE_URL и STINGRAY_SERVICES_AUTH_URL, см. раздел «Stingray (действующий монолит)».

Первичная настройка

Дефолтные значения представлены в документации с чартом README.md.

Настройка Redis

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

  1. FQDN сервера.
  2. TCP порт для подключения.
  3. Redis namespace.
  4. Имя пользователя.
  5. Пароль.

Значения параметров 1, 2, 3 и 4 необходимо включить в файл values.yaml нашего Helm chart, параметры:

  1. marivanna.redis.stgRedisUser.
  2. marivanna.redis.stgRedisHost.
  3. marivanna.redis.stgRedisPort.
  4. marivanna.redis.stgRedisNamespace.

Примечание

Значение параметра 5 необходимо включить в состав секретов.

У пользователя должны быть включены следующие права доступа: GET, SET, DELETE, RPOP, BRPOP, LPUSH.

Настройка Kafka

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

  1. Если Kafka имеет анонимный доступ, то:

    • адреса брокеров Kafka;
    • топик для нотификаций S3.
  2. Если Kafka имеет авторизацию, то:

    • адреса брокеров Kafka;
    • топик для нотификаций S3;
    • имя пользователя Kafka;
    • пароль пользователя Kafka;
    • SASL mechanism.

Настройка S3

Для настройки S3 необходимо развернуть S3-хранилище.

Примечание

В данной документации предполагается использование MinIO.

При установке MinIO необходимо задать параметры нотификаций о событиях в Kafka, а именно переменные окружения:

  1. Если Kafka имеет анонимный доступ, то:

    • MINIO_NOTIFY_KAFKA_ENABLE_NO_AUTH=on.
    • MINIO_NOTIFY_KAFKA_BROKERS_NO_AUTH - адреса брокеров Kafka.
    • MINIO_NOTIFY_KAFKA_TOPIC_NO_AUTH - топик для нотификаций S3.
  2. Если Kafka имеет авторизацию, то:

    • MINIO_NOTIFY_KAFKA_ENABLE=on.
    • MINIO_NOTIFY_KAFKA_BROKERS - адреса брокеров Kafka.
    • MINIO_NOTIFY_KAFKA_TOPIC - топик для нотификаций S3.
    • MINIO_NOTIFY_KAFKA_SASL_USERNAME - имя пользователя Kafka.
    • MINIO_NOTIFY_KAFKA_SASL_PASSWORD - пароль пользователя Kafka.
    • MINIO_NOTIFY_KAFKA_SASL_MECHANISM - SASL mechanism.

Также необходимо создать бакет и ключи для авторизации в S3 API.

Необходимо предоставить доступ к S3-сервису, развёрнутому в инфраструктуре и включающему следующие параметры:

  1. URL для подключений к S3 API.
  2. Название бакета.
  3. Название региона.
  4. AWS access key.
  5. AWS secret key.

Значения параметров 1, 2 и 3 необходимо включить в файл values.yaml нашего Helm chart, параметры:

  • marivanna.s3.stgS3EndpointUrl;
  • marivanna.s3.stgS3Bucket;
  • marivanna.s3.stgS3Region.

Примечание

Значение параметров 4 и 5 необходимо включить в состав секретов.

Настройка OAuth2-proxy

Шаги по настройке OAuth2-proxy описаны в соответствующем разделе.

Примечание

Настройка OAuth2-proxy не входит непосредственно в установку сервиса Marivanna. При этом правильная настройка OAuth2-proxy является необходимым условием для интеграции сервиса Marivanna.

Настройка авторизации

Шаги по настройке авторизации описаны в соответствующем разделе.

Настройка Ingress

Для настройки Ingress на проксирование трафика к OAuth2-proxy и Marivanna сервису необходимо внести следующие изменения в values.yaml:

marivanna:
    ingress:
        enabled: true
        className: nginx-internal
        annotations:
            nginx.ingress.kubernetes.io/preserve-trailing-slash: "true"
            nginx.ingress.kubernetes.io/auth-url: https://oauth2-proxy.cluster.local/oauth2/auth
            nginx.ingress.kubernetes.io/auth-response-headers: x-authrequest-access-token
            nginx.ingress.kubernetes.io/proxy-buffer-size: 16k
            nginx.ingress.kubernetes.io/proxy-body-size: 500m
            nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
            nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
        hosts:
            - host: marivanna.cluster.local
              paths:
                - path: /
                  pathType: ImplementationSpecific
        tls:
            - secretName: XXX
              hosts:
                - marivanna.cluster.local
-------------------------------------------------------------------------------------------------
oauth2-proxy:
    ingress:
        enabled: true
        className: nginx-internal
        annotations:
            nginx.ingress.kubernetes.io/proxy-buffer-size: 16k
        hosts:
            - host: oauth2-proxy.cluster.local
              paths:
                - path: /
                  pathType: ImplementationSpecific
        tls:
            - secretName: k8s-secret
              hosts:
                - oauth2-proxy.cluster.local

Необходимо указать актуальный ingress class, tls secrets для https, актуальные hosts, в аннотации marivanna auth-url указать Ingress oauth2-proxy host и /oauth2/auth.

Конфигурация сервисов

Stingray (действующий монолит)

Необходимо пробросить следующие переменные окружения в backend-контейнер:

  1. MARIVANNA_CLIENT_ID - client_id OAUTH2-клиента, созданного для авторизации доступа из монолита к Marivanna-сервису.

  2. MARIVANNA_CLIENT_SECRET - client_secret OAUTH2-клиента, созданного для авторизации доступа из монолита к Marivanna-сервису.

  3. MARIVANNA_BASE_URL - URL, запросы на который проксируются с помощью Ingress в Marivanna-сервис.

  4. STINGRAY_SERVICES_AUTH_URL - URL, запросы на который проксируются с помощью Ingress в Keycloak token API (например, https://keycloak.dev.company.ru/realms/stingray/protocol/openid-connect/token) / Platform V IAM.

После этого необходимо выполнить перезапуск:

docker exec stingray-maintenance django-admin maintenance engines preserve
docker-compose down
docker-compose up -d
docker exec stingray-maintenance django-admin maintenance engines recreate

Деплой сервисов

Для деплоя сервисов необходимо заполнить следующие параметры в values.yaml:

marivanna:
    # marivanna.enabled -- Enable/Disable marivanna service
    enabled: true
    # marivanna.replicaCount -- Number of replica marivanna service
    replicaCount: 1

    image:
        # marivanna.image.registry -- Registry place image marivanna service
        registry: cr.yandex
        # marivanna.image.repository -- Repository place image marivanna service
        repository: stingray/marivanna
        # marivanna.image.tag -- Tag image marivanna service
        tag: latest
        # marivanna.image.pullPolicy -- Pull policy marivanna service (IfNotPresent / Always / Never )
        pullPolicy: IfNotPresent
        # marivanna.image.debug -- Enable/Disable debug mode
        debug: 0

    redis:
        # marivanna.redis.stgRedisHost -- FQDN Redis server
        stgRedisHost: redis.cluster.local
        # marivanna.redis.stgRedisPort -- Redis port (default 6379)
        stgRedisPort: 6379
        # marivanna.redis.stgRedisNamespace -- Redis namespace (default 0)
        stgRedisNamespace: 0
        # marivanna.redis.stgRedisUser -- Redis username connect
        stgRedisUser: stingray-user
        # marivanna.redis.stgRedisPass -- Redis password secrets from env
        stgRedisPass: XXX

    s3:
        # marivanna.s3.stgS3EndpointURL -- URL adress API S3 storage
        stgS3EndpointURL: https://minio-api.cluster.local
        # marivanna.s3.stgS3Bucket -- Default Bucket s3 work
        stgS3Bucket: stingray
        # marivanna.s3.stgS3AccessKey -- Access Key API compliant s3 storage aka AWS_ACCESS_KEY_ID
        stgS3AccessKey: XX
        # marivanna.s3.stgS3SecretKey -- Secret Key API compliant s3 storage aka AWS_SECRET_ACCESS_KEY
        stgS3SecretKey: XXXX
        # marivanna.s3.stgS3Region -- The Default region name identifies the AWS Region whose servers you want to send your requests to by default. aka AWS_DEFAULT_REGION default values us-west-2
        stgS3Region: yandex-stingray-1
    # marivanna.imagePullSecrets -- Secrets of extracting an image from a private registry
    # imagePullSecrets:
        # - name: registrypullsecret
        mode:
            file:
                enabled: true
                config:
                    name: "conf.cfg"
                    path: "/configs"
                secrets:
                    name: "secrets.cfg"
                    path: "/secrets"
            env:
                enabled: false # marivanna.serviceAccount -- Default service account
    serviceAccount:
        create: true
        automount: true
        annotations: {}
        name: ""
    # marivanna.podAnnotations -- Custom pod annotations
    podAnnotations: {}
    # marivanna.podLabels -- Custom pod labels
    podLabels: {}
    # marivanna.podSecurityContext -- Custom pod security context
    podSecurityContext: {}
    securityContext:
        capabilities:
            drop:
                - ALL
        readOnlyRootFilesystem: true
        runAsNonRoot: true
        runAsUser: 1000
    service:
        # marivanna.service.type -- Service type marivanna
        type: ClusterIP
        # marivanna.service.port -- Port forward service
        port: 8000
    ingress:
        # marivanna.ingress.enable -- Enable/Disable ingress marivanna service
        enabled: true
        # marivanna.className Ingress class use marivanna service
        className: nginx-internal
        annotations:
            nginx.ingress.kubernetes.io/preserve-trailing-slash: "true"
            nginx.ingress.kubernetes.io/auth-url: https://oauth2-proxy.k8s.stingray.dev/oauth2/auth
            nginx.ingress.kubernetes.io/auth-response-headers: x-authrequest-access-token
            nginx.ingress.kubernetes.io/proxy-buffer-size: 16k
            nginx.ingress.kubernetes.io/proxy-body-size: 500m
            nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
            nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
        hosts:
            - host: marivanna.cluster.local
              paths:
                - path: /
                  pathType: ImplementationSpecific
        tls:
            - secretName: XXX
              hosts:
                - marivanna.cluster.local
    resources:
        rest:
            limits:
                cpu: 200m
                memory: 1Gi
            requests:
                cpu: 100m
                memory: 256Mi
        worker:
            limits:
                cpu: 3000m
                memory: 14Gi
            requests:
                cpu: 300m
                memory: 6Gi

    nodeSelector:
        # marivanna.nodeSelector.node-group -- Example node selector
        node-group: internal

oauth2-proxy:
    # oauth2-proxy.enable -- Enable/Disable oauth2-proxy service
    enabled: true
    namespaceOverride: ""
    # oauth2-proxy.kubeVersion -- Force the target Kubernetes version (it uses Helm `.Capabilities` if not set).
    kubeVersion: null
    # oauth2-proxy.config -- Oauth client configuration specifics
    config:
        annotations: {}
        clientID: "client-id-keycloak-client-oauth2"
        clientSecret: "client-secret-keycloak-client-oauth2"
        cookieSecret: "(сгенерировать с помощью команды openssl rand -base64 32 | head -c 32 | base64 )"
        configFile: |-
            provider = "keycloak-oidc"
            provider_display_name = "Keycloak"
            oidc_issuer_url = "https://keycloak.cluster.local/realms/stingray"
            email_domains = [ "*" ]
            insecure_oidc_allow_unverified_email = true
            skip_jwt_bearer_tokens = true
            code_challenge_method = "S256"
            set_xauthrequest = true
            set_authorization_header = true
            cookie_secure = true
            cookie_domains = [ ".cluster.local" ]
            whitelist_domains = [ "*.cluster.local:*" ]
            skip_auth_routes = [ "/internal/.*" ]
            cookie_refresh = "1m"
            cookie_expire = "10m"
    alphaConfig:
        # oauth2-proxy.alphaConfig.enabled -- Enable/Disable oauth2-proxy alphaConfig
        enabled: false
        # oauth2-proxy.alphaConfig.annotations -- Add config annotations annotations: {}
        # oauth2-proxy.alphaConfig.serverConfigData -- Arbitrary configuration data to append to the server section
        serverConfigData: {}
        # oauth2-proxy.alphaConfig.metricsConfigData -- Arbitrary configuration data to append to the metrics section
        metricsConfigData: {}
        # oauth2-proxy.alphaConfig.configData -- Arbitrary configuration data to append
        configData: {}
        # oauth2-proxy.alphaConfig.configFile -- Arbitrary configuration to append
        # This is treated as a Go template and rendered with the root context
        configFile: ""
        # oauth2-proxy.alphaConfig.existingConfig -- Use an existing config map (see secret-alpha.yaml for required fields)
        existingConfig: null
        # oauth2-proxy.alphaConfig.existingSecret -- Use an existing secret
        existingSecret: null
    image:
        # oauth2-proxy.image.repository -- Repository place image oauth2-proxy service
        repository: quay.io/oauth2-proxy/oauth2-proxy
        # oauth2-proxy.image.tag -- Tag image oauth2-proxy service
        tag: ""
        # oauth2-proxy.image.pullPolicy -- Pull policy image oauth2-proxy service
        pullPolicy: IfNotPresent
    # oauth2-proxy.extraArgs -- Extra arguments for oauth2-proxy service
    extraArgs:
        - "--config=/etc/oauth2_proxy/oauth2_proxy.cfg"
    # oauth2-proxy.extraEnv -- Extra environment variables for oauth2-proxy
    service
    extraEnv: []
    # oauth2-proxy.customLabels -- Custom labels to add into metadata
    customLabels: {}
    # To authorize individual email addresses
    # That is part of extraArgs but since this needs special treatment we
    need to do a separate section
    authenticatedEmailsFile:
        enabled: false
        # oauth2-proxy.authenticatedEmailsFile.persistence -- Defines how the email addresses file will be projected, via a configmap or secret
        persistence: configmap
        # oauth2-proxy.authenticatedEmailsFile.template -- template is the name of the configmap what contains the email user list but has been configured without this chart.
        template: ""
        # oauth2-proxy.authenticatedEmailsFile.restrictedUserAccessKey -- The configmap/secret key under which the list of email access is stored
        # Defaults to "restricted_user_access" if not filled-in, but can be overridden to allow flexibility
        restrictedUserAccessKey: ""
        # oauth2-proxy.authenticatedEmailsFile.restricted_access -- If you override the config with restricted_access it will configure a user list within this chart what takes care of the
        # config map resource.
        restricted_access: ""
        annotations: {}
        # helm.sh/resource-policy: keep
    service:
        # oauth2-proxy.service.type -- Service type oauth2-proxy
        type: ClusterIP
        # oauth2-proxy.service.portNumber -- Service port number oauth2-proxy
        portNumber: 80
        # oauth2-proxy.service.appProtocol -- Protocol set on the oauth2-
        proxy service
        appProtocol: http
        # oauth2-proxy.service.annotations -- Service annotations
        annotations: {}
    # oauth2-proxy.serviceAccount -- Create or use ServiceAccount
    serviceAccount:
        # oauth2-proxy.serviceAccount.enabled -- Specifies whether a ServiceAccount should be created
        enabled: true
        # oauth2-proxy.serviceAccount.name -- The name of the ServiceAccount to use.
        ## If not set and create is true, a name is generated using the fullname template
        name: service-account
        automountServiceAccountToken: true
        annotations: {}
    ingress:
        # oauth2-proxy.ingress.enabled -- Enable/Disable ingress oauth2-proxy service
        enabled: true
        # oauth2-proxy.ingress.className -- Class name ingress oauth2-proxy service
        className: nginx-internal
        # oauth2-proxy.ingress.path -- Path to oauth2-proxy service 
        path: /
        # oauth2-proxy.ingress.pathType -- Only used if API capabilities (networking.k8s.io/v1) allow it
        pathType: ImplementationSpecific
        # oauth2-proxy.ingress.hosts -- Used to create an Ingress record.
        hosts:
            - oauth2-proxy.cluster.local
        # oauth2-proxy.ingress.annotations -- Ingress annotations oauth2-proxy service
        annotations:
            nginx.ingress.kubernetes.io/proxy-buffer-size: 16k
        # oauth2-proxy.ingress.tls -- TLS config for ingress oauth2-proxy service
        tls:
            # oauth2-proxy.ingress.tls.secretName -- Secret name with certificate
            - secretName: XXX
              hosts:
                - oauth2-proxy.cluster.local
    # oauth2-proxy.resources -- Resources config for oauth2-proxy service
    resources:
        # oauth2-proxy.resources.limits -- Resource limits for oauth2-proxy service
        limits:
            # oauth2-proxy.resources.limits.cpu -- CPU limits
            cpu: 100m
            # oauth2-proxy.resources.limits.memory -- Memory limits
            memory: 300Mi
        # oauth2-proxy.resources.requests -- Resource requests for oauth2-proxy service
        requests:
            # oauth2-proxy.resources.requests.cpu -- CPU requests
            cpu: 100m
            # oauth2-proxy.resources.requests.memory -- Memory requests
            memory: 300Mi
    # oauth2-proxy.extraVolumes -- Extra volumes for oauth2-proxy service
    extraVolumes: []
    # - name: ca-bundle-cert
    #   secret:
    #       secretName: <secret-name>

    # oauth2-proxy.extraVolumeMounts -- Extra volume mounts for oauth2-proxy service
    extraVolumeMounts: []
    # - mountPath: /etc/ssl/certs/
    #   name: ca-bundle-cert
    # oauth2-proxy.extraContainers -- Additional containers to be added to the pod.
    extraContainers: []
    # - name: my-sidecar
    #   image: nginx:latest
    priorityClassName: ""
    # oauth2-proxy.hostAliases -- hostAliases is a list of aliases to be added to /etc/hosts for network name resolution
    hostAliases: []
    # oauth2-proxy.topologySpreadConstraints - Topology Spread Constraints configuration
    topologySpreadConstraints: []
    # oauth2-proxy.affinity -- Affinity for pod assignment affinity: {}
    # oauth2-proxy.tolerations -- Tolerations for pod assignment
    tolerations: []
    # oauth2-proxy.nodeSelector -- Node labels for pod assignment
    nodeSelector:
        node-group: external
    # oauth2-proxy.proxyVarsAsSecrets -- Whether to use secrets instead of environment values for setting up OAUTH2_PROXY variables
    proxyVarsAsSecrets: true
    # oauth2-proxy.livenessProbe -- Configure Kubernetes liveness probes.
    livenessProbe:
        enabled: true
        initialDelaySeconds: 0
        timeoutSeconds: 1
    # oauth2-proxy.readinessProbe -- Configure Kubernetes readiness probes.
    readinessProbe:
        enabled: true
        initialDelaySeconds: 0
        timeoutSeconds: 5
        periodSeconds: 10
        successThreshold: 1
    # oauth2-proxy.securotyContext -- Configure Kubernetes security context for container
    securityContext:
        enabled: true
        allowPrivilegeEscalation: false
        capabilities:
            drop:
                - ALL
        readOnlyRootFilesystem: true
        runAsNonRoot: true
        runAsUser: 2000
        runAsGroup: 2000
        seccompProfile:
            type: RuntimeDefault
    deploymentAnnotations: {}
    # oauth2-proxy.podAnnotations -- Custom pod annotations
    podAnnotations: {}
    # oauth2-proxy.podLabels -- Custom pod labels
    podLabels: {}
    # oauth2-proxy.replicaCount -- Number of replica marivanna service
    replicaCount: 1
    revisionHistoryLimit: 10
    strategy: {}
    # oauth2-proxy.podDisruptionBudget -- PodDisruptionBudget settings
    podDisruptionBudget:
        enabled: true
        minAvailable: 1
    # oauth2-proxy.podSecurityContext -- Configure Kubernetes security context for pod
    podSecurityContext: {}
    # oauth2-proxy.httpScheme -- whether to use http or https
    httpScheme: http
    initContainers:
        # if the redis sub-chart is enabled, wait for it to be ready
        # before starting the proxy
        # creates a role binding to get, list, watch, the redis master pod
        # if service account is enabled
        waitForRedis:
            enabled: true
            image:
                repository: docker.io/bitnami/kubectl
                pullPolicy: IfNotPresent
            # uses the kubernetes version of the cluster
            # the chart is deployed on, if not set
            kubectlVersion: ""
            securityContext:
                enabled: true
                allowPrivilegeEscalation: false
                capabilities:
                    drop:
                        - ALL
                readOnlyRootFilesystem: true
                runAsNonRoot: true
                runAsUser: 65534
                runAsGroup: 65534
                seccompProfile:
                    type: RuntimeDefault
            timeout: 180
            resources: {}
            # limits:
            # cpu: 100m
            # memory: 300Mi
            # requests:
            # cpu: 100m
            # memory: 300Mi
    # oauth2-proxy.htpasswdFile -- Additionally authenticate against a htpasswd file. Entries must be created with "htpasswd -B" for bcrypt encryption.
    # Alternatively supply an existing secret which contains the required information.
    htpasswdFile:
        enabled: false
        existingSecret: ""
        entries: []
        # One row for each user
        # example:
        # entries:
        #   - testuser:$2y$05$gY6dgXqjuzFhwdhsiFe7seM9q9Tile4Y3E.CBpAZJffkeiLaC21Gy
    # oauth2-proxy.sessionStorage -- Configure the session storage type, between cookie and redis
    sessionStorage:
        # oauth2-proxy.sessionStorage.type -- Can be one of the supported session storage cookie|redis
        type: cookie
        redis:
            # oauth2-proxy.sessionStorage.redis.existingSecret -- Name of the Kubernetes secret containing the redis & redis sentinel password values (see also `sessionStorage.redis.passwordKey`)
            existingSecret: ""
            # oauth2-proxy.sessionStorage.redis.password -- Redis password value. Applicable for all Redis configurations. Taken from redis subchart secret if not set. `sessionStorage.redis.existingSecret` takes precedence
            password: ""
            # oauth2-proxy.sessionStorage.redis.passwordKey -- Key of the Kubernetes secret data containing the redis password value
            passwordKey: redis-password
            # oauth2-proxy.sessionStorage.redis.clientType -- Can be one of standalone|cluster|sentinel
            clientType: standalone
            standalone:
                # oauth2-proxy.sessionStorage.redis.standalone.conectionUrl -- URL of redis standalone server for redis session storage (e.g. `redis://HOST[:PORT]`). Automatically generated if not set
                connectionUrl: ""
            cluster:
                # oauth2-proxy.sessionStorage.redis.connectionUrls -- List of Redis cluster connection URLs (e.g. `["redis://127.0.0.1:8000", "redis://127.0.0.1:8000"]`)
                connectionUrls: []
            sentinel:
                # oauth2-proxy.sessionStorage.redis.sentinel.existingSecret -- Name of the Kubernetes secret containing the redis sentinel password value (see also `sessionStorage.redis.sentinel.passwordKey`). Default: `sessionStorage.redis.existingSecret`
                existingSecret: ""
                # oauth2-proxy.sessionStorage.redis.sentinel.password -- Redis sentinel password. Used only for sentinel connection; any redis node passwords need to use `sessionStorage.redis.password`
                password: ""
                # oauth2-proxy.sessionStorage.redis.sentinel.passwordKey -- Key of the Kubernetes secret data containing the redis sentinel password value
                passwordKey: redis-sentinel-password
                # oauth2-proxy.sessionStorage.redis.sentinel.masterName -- Redis sentinel master name
                masterName: ""
                # oauth2-proxy.sessionStorage.redis.sentinel.connectionUrls -- List of Redis sentinel connection URLs (e.g. `["redis://127.0.0.1:8000", "redis://127.0.0.1:8000"]`)
                connectionUrls: []
    # oauth2-proxy.redis -- Enables and configure the automatic deployment of the redis subchart
    redis:
        # oauth2-proxy.redis.enabled -- provision an instance of the redis sub-chart
        enabled: false
    # oauth2-proxy.checkDeprecation -- Enables apiVersion deprecation checks
    checkDeprecation: true
    metrics:
        # oauth2-proxy.metrics.enabled -- Enable Prometheus metrics endpoint
        enabled: true
        # oauth2-proxy.metrics.port -- Serve Prometheus metrics on this port
        port: 44180
        # when service.type is NodePort ...
        # nodePort: 44180
        # oauth2-proxy.metrics.service -- Protocol set on the service for the
        metrics port
        service:
            appProtocol: http
        serviceMonitor:
            # oauth2-proxy.metrics.serviceMonitor.enabled – Enable Prometheus Operator ServiceMonitor
            enabled: false
            # oauth2-proxy.metrics.serviceMonitor.namespace -- Define the namespace where to deploy the ServiceMonitor resource
            namespace: ""
            # oauth2-proxy.metrics.serviceMonitor.prometheusInstance -- Prometheus Instance definition
            prometheusInstance: default
            # oauth2-proxy.metrics.serviceMonitor.interval – Prometheus scrape interval
            interval: 60s
            # oauth2-proxy.metrics.serviceMonitor.scrapeTimeout -- Prometheus scrape timeout
            scrapeTimeout: 30s
            # oauth2-proxy.metrics.serviceMonitor.labels -- Add custom labels to the ServiceMonitor resource
            labels: {}
            # oauth2-proxy.metrics.serviceMonitor.scheme -- HTTP scheme to use for scraping. Can be used with `tlsConfig` for example if using istio mTLS.
            scheme: ""
            # oauth2-proxy.metrics.serviceMonitor.tlsConfig -- TLS configuration to use when scraping the endpoint. For example if using istio mTLS.
            tlsConfig: {}
            # oauth2-proxy.metrics.serviceMonitor.bearerTokenFile -- Path to bearer token file.
            bearerTokenFile: ""
            # oauth2-proxy.metrics.serviceMonitor.annotations -- Used to pass annotations that are used by the Prometheus installed in your cluster to select Service Monitors to work with
            annotations: {}
            # oauth2-proxy.metrics.serviceMonitor.metricRelabelings -- Metric relabel configs to apply to samples before ingestion.
            metricRelabelings: []
            # oauth2-proxy.metrics.serviceMonitor.relabelings -- Relabel configs to apply to samples before ingestion.
            relabelings: []
    # oauth2-proxy.extraObjects -- Extra K8s manifests to deploy
    extraObjects: []

Calypso. Сравнение трассы вызовов

Описание

Сервис для построения и сравнения трассы вызов. Используется для проверки целостности модуля цифрового рубля.

Функциональные возможности

  • Построение проектов.
  • Построение трасс вызов на основе проектов.
  • Сравнение трасс вызовов.

Используемые топики Kafka

calypso.1.0.testUpdated - сообщения об статусе тестирования.

БД

  • PostgreSQL (схема: calypso).
  • test - общая таблица с информацией о тестировании.

Переменные сервиса

  • REST API container

Внешние зависимости

  1. Ingress.
  2. Redis.
  3. S3 (MinIO).
  4. Kafka.
  5. PostgreSQL.
  6. Keycloak.
  7. OAuth2.

Переменные сервиса

  • REST API container

    С таблицами переменных доступа и настроек логирования можно ознакомиться в разделах «Доступ к S3», «Доступ к PostgreSQL», «Доступ к Kafka», «Настройки логирования».

  • Async API container

    С таблицами переменных доступа и настроек логирования можно ознакомиться в разделах «Доступ к S3», «Доступ к Redis», «Доступ к PostgreSQL», «Доступ к Kafka», «Настройки логирования».

    Настройки сервиса:

    Имя переменной Описание Примечание Варианты значений Обязательно Пример значения Значение в values
    STG_S3_TOPIC Содержит имя Kafka-топика, на который нужно подписаться этому сервису для получения событий создания/удаления файлов в бакетах с приложениями - - Да minio .Values.kafka.stgS3Topic
    STG_APPLICATION_CREATED_TOPIC Содержит имя Kafka-топика, в который будут отправляться сообщения о создании нового экземпляра модели Application - - Да apricot/1/0/applications/event/applicationCreated .Values.kafka.stgNotifyTopic
    STG_S3_APPLICATION_FOLDER Содержит имя папки внутри бакета, куда будут располагаться данные работы сервиса - - Нет applications .Values.s3.pathBucket
  • Migrate Job container

    С таблицами переменных доступа и настроек логирования можно ознакомиться в разделах «Доступ к PostgreSQL», «Настройки логирования».

    Настройки сервиса:

    Имя переменной Описание Примечание Варианты значений Обязательно Пример значения Значение в values
    ALEMBIC_CONFIG Файл для настройки миграций - путь до файла true /app/alembic.ini .Values.alembicConfig

Схема интеграции сервиса Calypso

Шаг 1. Получение авторизационного токена. Бэкенд монолита, используя переданные ему client_id и client_secret, авторизуется в Keycloak и получает access_token.

Шаг 2. Отправка запроса в сервис Calypso. Запрос снабжается Authorization-заголовком, содержащим полученный access_token.

Шаг 3. Проверка входящего запроса на наличие валидного Authorization-заголовка.

Шаг 4.1. Запрос далее перенаправляется в целевой сервис (Calypso).

Шаг 4.2. В случае невалидного Authorization-заголовка (или не его отсутствия), монолиту возвращается HTTP 401.

В монолите в файл settings/prod.env необходимо добавить следующие переменные:

  • STINGRAY_SERVICES_AUTH_URL (https://keycloak.cluster.local/realms/stingray/protocol/openid- connect/token)
  • STINGRAY_SERVICES_CLIENT_ID (prod)
  • STINGRAY_SERVICES_CLIENT_SECRET (****)
  • CALYPSO_BASE_URL (https://calypso.cluster.local)

Организация сетевого доступа

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

  1. Keycloak.
  2. Ingress.

Эти ресурсы должны быть доступны по протоколам и портам, соответствующим тем URL, которые были переданы в переменные окружения CALYPSO_BASE_URL и STINGRAY_SERVICES_AUTH_URL.

Настройка Kafka

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

  • Для Kafka с анонимным доступом:

    Параметр Значение в values
    Адреса брокеров Kafka global.kafka.stgKafkaBrokerUrl
    Топик для нотификаций S3 kafka.stgKafkaGroupId
  • Для Kafka с авторизацией:

    Параметр Значение в values
    Адреса брокеров Kafka global.kafka.stgKafkaBrokerUrl
    Имя пользователя Kafka global.kafka.stgKafkaUser
    Пароль пользователя Kafka global.kafka.stgKafkaPassword
    Протокол безопасности global.kafka.stgKafkaSecurityProtocol
    SASL механизм global.kafka.stgKafkaSaslMechanism
    JAAS конфигурация global.kafka.SaslJaasConfig
    Топик для нотификаций S3 kafka.stgKafkaGroupId

Примечание

Значения параметров global.kafka.stgKafkaPassword и global.kafka.SaslJaasConfig необходимо включить в состав секретов.

Настройка Redis

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

  1. FQDN сервера.
  2. TCP порт для подключения.
  3. Redis namespace.
  4. Имя пользователя.
  5. Пароль.

Значения параметров 1, 2, 3 и 4 необходимо включить в файл values.yaml нашего Helm chart, параметры:

  1. global.redis.stgRedisUser.
  2. global.redis.stgRedisHost.
  3. global.redis.stgRedisPort.
  4. global.redis.stgRedisNamespace.

Примечание

Значение параметра 5 (global.redis.stgRedisPass) необходимо включить в состав секретов.

У пользователя должны быть включены следующие права доступа: GET, SET, DELETE, RPOP, BRPOP, LPUSH.

Настройка S3

Для настройки S3 необходимо развернуть S3-хранилище (в данной документации предполагается использование MinIO).

При установке MinIO задать параметры нотификаций о событиях в Kafka, а именно переменные окружения:

  1. Если Kafka имеет анонимный доступ, то:

    • MINIO_NOTIFY_KAFKA_ENABLE_NO_AUTH=on.
    • MINIO_NOTIFY_KAFKA_BROKERS_NO_AUTH - адреса брокеров Kafka.
    • MINIO_NOTIFY_KAFKA_TOPIC_NO_AUTH - топик для нотификаций S3.
  2. Если Kafka имеет авторизацию, то:

    • MINIO_NOTIFY_KAFKA_ENABLE=on.
    • MINIO_NOTIFY_KAFKA_BROKERS - адреса брокеров Kafka.
    • MINIO_NOTIFY_KAFKA_TOPIC - топик для нотификаций S3.
    • MINIO_NOTIFY_KAFKA_SASL_USERNAME - имя пользователя Kafka.
    • MINIO_NOTIFY_KAFKA_SASL_PASSWORD - пароль пользователя Kafka.
    • MINIO_NOTIFY_KAFKA_SASL_MECHANISM - SASL mechanism.

Также необходимо создать бакет и ключи для авторизации в S3 API.

Необходимо предоставить доступ к S3-сервису, развёрнутому в инфраструктуре и включающему следующие параметры:

  1. URL для подключений к S3 API.
  2. Название бакета.
  3. Название региона.
  4. AWS access key.
  5. AWS secret key.

Значения параметров 1, 2 и 3 необходимо включить в файл values.yaml нашего Helm chart, параметры:

  1. global.s3.stgS3EndpointUrl.
  2. global.s3.stgS3Bucket.
  3. global.s3.stgS3Region.
  4. global.s3.stgS3AccessKey.
  5. global.s3.stgS3SecretKey.

Примечание

Значение параметров 4 и 5 необходимо включить в состав секретов.

Настройка БД PostgreSQL

Для настройки БД PostgreSQL необходимо предоставить доступ к PostgreSQL, развёрнутому в инфраструктуре и включающему следующие параметры:

  1. FQDN сервера.
  2. TCP порт для подключения.
  3. Название базы данных.
  4. Имя пользователя.
  5. Пароль.
  6. Имя пользователя для миграций.
  7. Пароль от пользователя миграций.

Значения параметров 1, 2, 3, 4, 6 необходимо включить в файл values.yaml нашего Helm chart, параметры:

  1. global.postgresql.stgPostgresHost.
  2. global.postgresql.stgPostgresPort.
  3. global.postgresql.stgPostgresDb.
  4. global.postgresql.stgPostgresUser.
  5. global.postgresql.stgPostgresPass.
  6. global.postgresql.stgPostgresMigrateUser.
  7. global.postgresql.stgPostgresMigratePassword.

Примечание

Значение параметров 5 и 7 необходимо включить в состав секретов.

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

  • PostgreSQL (схема: calypso).
  • test - общая таблица с информацией о тестировании.

Настройка OAuth2-proxy

Шаги по настройке OAuth2-proxy описаны в соответствующем разделе.

Примечание

Настройка OAuth2-proxy не входит непосредственно в установку сервиса Calypso. При этом правильная настройка OAuth2-proxy является необходимым условием для интеграции сервиса Calypso.

Настройка авторизации

Шаги по настройке авторизации описаны в соответствующем разделе.

Настройка Ingress

Для настройки Ingress на проксирование трафика к OAuth2-proxy и Calypso сервису необходимо внести следующие изменения в values.yaml:

calypso:
    ingress:
        enabled: true
        className: nginx-internal #класс ингресса
        annotations:
            nginx.ingress.kubernetes.io/preserve-trailing-slash: "true" nginx.ingress.kubernetes.io/auth-url: https://oauth2-proxy.cluster.local/oauth2/auth
            nginx.ingress.kubernetes.io/auth-response-headers: x-auth-request- access-token
            nginx.ingress.kubernetes.io/proxy-buffer-size: 16k nginx.ingress.kubernetes.io/proxy-body-size: 500m
            nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
            nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
        hosts:
            - host: calypso.cluster.local
              paths:
                - path: /
                  pathType: ImplementationSpecific
        tls:
            - secretName: XXX
              hosts:
                - calypso.cluster.local
-------------------------------------------------------------------------------------
oauth2-proxy:
    ingress:
        enabled: true
        className: nginx-internal annotations:
            nginx.ingress.kubernetes.io/proxy-buffer-size: 16k
        hosts:
            - host: oauth2-proxy.cluster.local
              paths:
                - path: /
                  pathType: ImplementationSpecific
        tls:
            - secretName: k8s-secret
              hosts:
                - oauth2-proxy.cluster.local

Описание переменных сервиса

Доступ к S3

Имя переменной Описание Варианты значений Обязательно ConfigMap или секрет Пример значения Значение в values
STG_S3_ENDPOINT_URL Базовый URL для подключения к S3 - Да cm https://minio-api.k8s.stingray-mobile.ru .Values.global.s3.stgS3EndpointUrl
STG_S3_ACCESS_KEY Ключ доступа для S3 - Да secret **** .Values.global.s3.stgS3AccessKey
STG_S3_SECRET_KEY Секретный ключ для доступа к S3 - Да secret **** .Values.global.s3.stgS3SecretKey
STG_S3_REGION Значение региона для Bucket S3 - Нет cm yandex-stingray-1 .Values.global.s3.stgS3Region
STG_S3_BUCKET Содержит имя S3-бакета, который этот сервис будет использовать для создания ссылок для загрузки приложений пользователями - Да cm stingray .Values.global.s3.stgS3Bucket

Доступ к Redis

Имя переменной Описание Варианты значений Обязательно ConfigMap или секрет Пример значения Значение в values
STG_REDIS_HOST Сервер Redis для подключения - Да cm redis.k8s.stingray-mobile.ru .Values.global.redis.stgRedisHost
STG_REDIS_PORT Порт для подключения к Redis - Да cm 6379 .Values.global.redis.stgRedisPort
STG_REDIS_NAMESPACE Неймспейс в конце URL для подключения (например в redis://localhost:6379/0 неймспейсом является 0) - Да cm 0 .Values.global.redis.stgRedisNamespace
STG_REDIS_USER Имя пользователя для подключения в Redis - Да cm stingray-user .Values.global.redis.stgRedisUser
STG_REDIS_PASS Пароль пользователя для подключения в Redis - Да secret stingray-password .Values.global.redis.stgRedisPass

Доступ к PostgreSQL

Имя переменной Описание Примечание Варианты значений Обязательно ConfigMap или секрет Пример значения Значение в values
STG_POSTGRES_HOST Адрес PostgreSQL-базы данных - - Да cm postgresql.k8s.stingray-mobile.ru .Values.global.postgresql.stgPostgresHost
STG_POSTGRES_PORT Порт для подключения По умолчанию значение 5432 - Да cm 5432 .Values.global.postgresql.stgPostgresPort
STG_POSTGRES_DB БД для работы - - Да cm stingray .Values.global.postgresql.stgPostgresDb
STG_POSTGRES_USER Пользователь для подключения к БД - - Да cm approcot_user .Values.global.postgresql.stgPostgresUser
STG_POSTGRES_PASS Пароль пользователя для подключения к БД - - Да secret approcot_password .Values.global.postgresql.stgPostgresPass
STG_POSTGRES_SCHEMA Схема, в которой будет работать сервис При отсутствии сервис будет определять схему по умолчанию - Нет cm approcot .Values.postgresql.schema

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

Значение в values Обязательно ConfigMap или секрет
.Values.global.postgresql.stgPostgresMigrateUser Да cm
.Values.global.postgresql.stgPostgresMigratePassword Да secret

Доступ к Kafka

Имя переменной Описание Примечание Варианты значений Обязательно ConfigMap/секрет Пример значения Значение в values
STG_KAFKA_BROKER_URL URL, где находится Kafka-брокер - - Да cm kafka-broker-0.k8s.stingray-mobile.ru .Values.global.kafka.stgKafkaBrokerUrl
STG_KAFKA_USER Пользователь для подключения к брокеру При аутентификации по сертификатам не указывается - Нет cm stingray-user .Values.global.kafka.stgKafkaUser
STG_KAFKA_PASSWORD Пароль пользователя для подключения к брокеру При аутентификации по сертификатам не указывается - Нет secret stingray-password .Values.global.kafka.stgKafkaPassword
STG_KAFKA_SASL_JAAS_CONFIG Настройка для SASL аутентификации - Нет secret org.apache.kafka.common.security.scram.ScramLoginModule required username="stingray-user" password=""; .Values.global.kafka.stgKafkaSaslJaasConfig
STG_KAFKA_SECURITY_PROTOCOL Протокол аутентификации в Kafka-брокере SCRAM-SHA-512 Нет cm SCRAM-SHA-512 .Values.global.kafka.stgKafkaSecurityProtocol
STG_KAFKA_SASL_MECHANISM Способ аутентификации в Kafka-брокере PLAINTEXT / SASL_PLAINTEXT / SSL Нет cm SASL_PLAINTEXT .Values.global.kafka.stgKafkaSaslMechanism
STG_KAFKA_GROUP_ID Потребительская группа в Kafka - - Да cm rose-group .Values.kafka.stgKafkaGroupId

Настройки логирования

Имя переменной Описание Примечание Варианты значений Обязательно ConfigMap/секрет Пример значения Значение в values
STG_LOG_LEVEL Определяет уровень логирования сервиса. Каждый следующий уровень включает значения предыдущего и расширяет их дополнительными сообщениями. Значение по умолчанию - WARNING CRITICAL / ERROR / WARNING / INFO / DEBUG Нет cm INFO .Values.log.level
STG_LOG_FILE Определяет файл, куда выводится лог для сервиса Если значения нет, в файл не выводится, только в консоль - Нет cm /var/log/$SERVICE-async.log .Values.log.path.$SERVICE

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

log:
    level: DEBUG
    path:
        async: /var/log/$SERVICE-async.log
        rest: /var/log/$SERVICE-rest.log
        migrate: /var/log/$SERVICE-migrate.log

Шаги по настройке OAuth2-proxy

Для настройки OAuth2-proxy необходимо добавить в values.yaml чарта OAuth2-proxy следующие значения:

config:
    annotations: {}
    clientID: "client-id-keycloak-client-oauth2"
    clientSecret: "client-secret-keycloak-client-oauth2"
    cookieSecret: "(сгенерировать с помощью команды openssl rand -base64 32 | head -c 32 | base64 )"
    configFile: |-
        provider = "keycloak-oidc"
        provider_display_name = "Keycloak"
        oidc_issuer_url = "https://keycloak.cluster.local/realms/stingray" email_domains = [ "*" ]
        insecure_oidc_allow_unverified_email = true
        skip_jwt_bearer_tokens = true
        code_challenge_method = "S256"
        set_xauthrequest = true
        set_authorization_header = true
        cookie_secure = true
        cookie_domains = [ ".cluster.local" ]
        whitelist_domains = [ "*.cluster.local:*" ]
        skip_auth_routes = [ "/internal/.*" ]
        cookie_refresh = "1m"
        cookie_expire = "10m"

Примечание

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

ssl_insecure_skip_verify = true

Шаги по настройке авторизации

Для настройки авторизации необходимо в IAM-сервисе (Keycloak/Platform V IAM) создать два сервисных аккаунта:

  1. Для авторизации монолита.
  2. Для авторизации OAuth2-proxy.

Примечание

Ниже приведен пример настройки Keycloak. Описывается необходимая последовательность действий для корректной настройки созданных клиентов.

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

  1. Вкладка Settings:

    • Client authentication – Enabled.
    • Authorization – Enabled.
    • Authentication flow - Service accounts roles.
    • Сохранить настройки.
  2. Вкладка Credentials:

    • Client Authenticator - Client Id and Secret.
    • Сгенерировать Client secret.
    • Сохранить настройки.
  3. Вкладка Client scopes:

    • Если есть скоуп email, то выбрать для него тип Optional.
    • Зайти в *-dedicated:
      • Добавить By configuration mapper с названием Audience. Для параметра Included Client Audience выбрать клиента, созданного для авторизации OAuth2-proxy.
      • Add to ID token и Add to access token выставить в true.
  4. Вкладка Advanced:

    • Установить значение Access Token Lifespan в Expires in: 365 days.

Настройка клиента для авторизации OAuth2-proxy

  1. Вкладка Settings:

    • Client authentication – Enabled.
    • Authorization – Enabled.
    • Authentication flow - Service accounts roles.
    • Сохранить настройки.
  2. Вкладка Credentials:

    • Client Authenticator - Client Id and Secret.
    • Сгенерировать Client secret.
    • Сохранить настройки.
  3. Вкладка Client scopes:

    • Если есть скоуп email, то выбрать для него тип Optional.
    • Зайти в *-dedicated:
      • Добавить By configuration mapper с названием Audience. Для параметра Included Client Audience выбрать клиента самого себя.
      • Add to ID token и Add to access token выставить в true.
  4. Вкладка Advanced:

    • Установить значение Access Token Lifespan в Expires in: 365 days.
К началу