Прокси-сервер авторизации Microsoft Entra

Прокси-сервер авторизации Microsoft Entra — это обратный прокси-сервер, который можно использовать для проверки подлинности запросов с помощью идентификатора Microsoft Entra. Этот прокси-сервер можно использовать для проверки подлинности запросов к любой службе, поддерживающей проверку подлинности Microsoft Entra. Используйте этот прокси-сервер для проверки подлинности запросов к управляемой службе Azure Monitor для Prometheus.

Необходимые компоненты

  • Рабочая область Azure Monitor. Если у вас нет рабочей области, создайте ее с помощью портал Azure.
  • Prometheus установлен в кластере.

Примечание.

Пример удаленной записи в этой статье использует удаленную запись Prometheus для записи данных в Azure Monitor. Подключение кластера AKS к Prometheus автоматически устанавливает Prometheus в кластере и отправляет данные в рабочую область.

Развертывание

Прокси-сервер можно развернуть с помощью пользовательских шаблонов с помощью образа выпуска или в виде диаграммы helm. Оба развертывания содержат одинаковые настраиваемые параметры. Эти параметры описаны в таблице параметров .

Дополнительные сведения см . в проекте прокси-сервера проверки подлинности Microsoft Entra.

В следующих примерах показано, как развернуть прокси-сервер для удаленной записи и запроса данных из Azure Monitor.

Примечание.

В этом примере показано, как использовать прокси-сервер для проверки подлинности запросов удаленной записи в управляемую службу Azure Monitor для Prometheus. Удаленная запись Prometheus имеет выделенный боковой автомобиль для удаленной записи, который является рекомендуемым методом для реализации удаленной записи.

Перед развертыванием прокси-сервера найдите управляемое удостоверение и назначьте ей Monitoring Metrics Publisher роль для правила сбора данных рабочей области Azure Monitor.

  1. Найдите управляемое clientId удостоверение для кластера AKS. Управляемое удостоверение используется для проверки подлинности в рабочей области Azure Monitor. Управляемое удостоверение создается при создании кластера AKS.

    # Get the identity client_id
    az aks show -g <AKS-CLUSTER-RESOURCE-GROUP> -n <AKS-CLUSTER-NAME> --query "identityProfile"
    

    Выходные данные будут иметь следующий формат:

    {
      "kubeletidentity": {
        "clientId": "abcd1234-1243-abcd-9876-1234abcd5678",
        "objectId": "12345678-abcd-abcd-abcd-1234567890ab",
        "resourceId": "/subscriptions/def0123-1243-abcd-9876-1234abcd5678/resourcegroups/MC_rg-proxytest-01_proxytest-01_eastus/providers/Microsoft.ManagedIdentity/userAssignedIdentities/proxytest-01-agentpool"
      }
    
  2. Найдите идентификатор правила сбора данных рабочей области Azure Monitor (DCR).
    Имя правила совпадает с именем рабочей области. Имя группы ресурсов для правила сбора данных соответствует формату: MA_<workspace-name>_<REGION>_managedнапример MA_amw-proxytest_eastus_managed. Используйте следующую команду, чтобы найти идентификатор правила сбора данных:

    az monitor data-collection rule show --name <dcr-name> --resource-group <resource-group-name> --query "id"
    
  3. Кроме того, вы можете найти конечную точку приема данных DCR и метрик с помощью портал Azure на странице обзора рабочей области Azure Monitor.

    Выберите правило сбора данных на вкладке "Обзор рабочей области", а затем выберите представление JSON, чтобы просмотреть идентификатор ресурса.

    A screenshot showing the overview page for an Azure Monitor workspace.

  4. Monitoring Metrics Publisher Назначьте роль управляемому удостоверениюclientId, чтобы она смогла записать в правило сбора данных рабочей области Azure Monitor.

    az role assignment create /
    --assignee <clientid>  /
    --role "Monitoring Metrics Publisher" /
    --scope <workspace-dcr-id>
    

    Например:

    az role assignment create \
    --assignee abcd1234-1243-abcd-9876-1234abcd5678  \
    --role "Monitoring Metrics Publisher" \
    --scope /subscriptions/ef0123-1243-abcd-9876-1234abcd5678/resourceGroups/MA_amw-proxytest_eastus_managed/providers/Microsoft.Insights/dataCollectionRules/amw-proxytest
    
  5. Используйте следующий файл YAML для развертывания прокси-сервера для удаленной записи. Измените значения следующих параметров.

    • TARGET_HOST — целевой узел, в который вы хотите перенаправить запрос. Чтобы отправить данные в рабочую область Azure Monitor, используйте часть Metrics ingestion endpoint имени узла на странице обзора рабочих областей. Пример: http://amw-proxytest-abcd.eastus-1.metrics.ingest.monitor.azure.com
    • AAD_CLIENT_IDclientId— Управляемое удостоверение, используемое для назначения Monitoring Metrics Publisher роли.
    • AUDIENCE — Для приема метрик в рабочую область Azure Monitor установите значение AUDIENCEhttps://monitor.azure.com/.default .
    • Удалите OTEL_GRPC_ENDPOINT и OTEL_SERVICE_NAME не используете OpenTelemetry.

    Дополнительные сведения о параметрах см. в таблице "Параметры ".

    proxy-ingestion.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
        labels:
            app: azuremonitor-ingestion
        name: azuremonitor-ingestion
        namespace: observability
    spec:
        replicas: 1
        selector:
            matchLabels:
                app: azuremonitor-ingestion
        template:
            metadata:
                labels:
                    app: azuremonitor-ingestion
                name: azuremonitor-ingestion
            spec:
                containers:
                - name: aad-auth-proxy
                  image: mcr.microsoft.com/azuremonitor/auth-proxy/prod/aad-auth-proxy/images/aad-auth-proxy:0.1.0-main-05-24-2023-b911fe1c
                  imagePullPolicy: Always
                  ports:
                  - name: auth-port
                    containerPort: 8081
                  env:
                  - name: AUDIENCE
                    value: https://monitor.azure.com/.default
                  - name: TARGET_HOST
                    value: http://<workspace-endpoint-hostname>
                  - name: LISTENING_PORT
                    value: "8081"
                  - name: IDENTITY_TYPE
                    value: userAssigned
                  - name: AAD_CLIENT_ID
                    value: <clientId>
                  - name: AAD_TOKEN_REFRESH_INTERVAL_IN_PERCENTAGE
                    value: "10"
                  - name: OTEL_GRPC_ENDPOINT
                    value: <YOUR-OTEL-GRPC-ENDPOINT> # "otel-collector.observability.svc.cluster.local:4317"
                  - name: OTEL_SERVICE_NAME
                    value: <YOUE-SERVICE-NAME>
                  livenessProbe:
                    httpGet:
                      path: /health
                      port: auth-port
                    initialDelaySeconds: 5
                    timeoutSeconds: 5
                  readinessProbe:
                    httpGet:
                      path: /ready
                      port: auth-port
                    initialDelaySeconds: 5
                    timeoutSeconds: 5
    ---
    apiVersion: v1
    kind: Service
    metadata:
        name: azuremonitor-ingestion
        namespace: observability
    spec:
        ports:
            - port: 80
              targetPort: 8081
        selector:
            app: azuremonitor-ingestion
    
  6. Разверните прокси-сервер с помощью команд:

    # create the namespace if it doesn't already exist
    kubectl create namespace observability 
    
    kubectl apply -f proxy-ingestion.yaml -n observability
    
  7. Кроме того, можно развернуть прокси-сервер с помощью helm следующим образом:

    helm install aad-auth-proxy oci://mcr.microsoft.com/azuremonitor/auth-proxy/prod/aad-auth-proxy/helmchart/aad-auth-proxy \
    --version 0.1.0-main-05-24-2023-b911fe1c \
    -n observability \
    --set targetHost=https://proxy-test-abc123.eastus-1.metrics.ingest.monitor.azure.com \
    --set identityType=userAssigned \
    --set aadClientId= abcd1234-1243-abcd-9876-1234abcd5678 \
    --set audience=https://monitor.azure.com/.default
    
  8. Настройка URL-адреса удаленной записи.
    Имя узла URL-адреса состоит из имени службы приема и пространства имен в следующем формате <ingestion service name>.<namespace>.svc.cluster.local. В этом примере узел имеет значение azuremonitor-ingestion.observability.svc.cluster.local.
    Настройте путь URL-адреса с помощью пути из Metrics ingestion endpoint страницы обзора рабочей области Azure Monitor. Например, dataCollectionRules/dcr-abc123d987e654f3210abc1def234567/streams/Microsoft-PrometheusMetrics/api/v1/write?api-version=2021-11-01-preview.

    prometheus:
      prometheusSpec:
        externalLabels:
          cluster: <cluster name to be used in the workspace>
        ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
        ##
        remoteWrite:
        - url: "http://azuremonitor-ingestion.observability.svc.cluster.local/dataCollectionRules/dcr-abc123d987e654f3210abc1def234567/streams/Microsoft-PrometheusMetrics/api/v1/write?api-version=2021-11-01-preview" 
    
  9. Примените конфигурацию удаленной записи.

Примечание.

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

Убедитесь, что прокси-сервер прием данных

Убедитесь, что прокси-сервер успешно выполняет прием метрик, проверка журналов pod или запросив рабочую область Azure Monitor.

Проверьте журналы pod, выполнив следующие команды:

# Get the azuremonitor-ingestion pod ID
 kubectl get pods -A | grep azuremonitor-ingestion
 #Using the returned pod ID, get the logs
 kubectl logs --namespace observability <pod ID> --tail=10

Успешное прием метрик создает журнал со StatusCode=200 следующими параметрами:

time="2023-05-16T08:47:27Z" level=info msg="Successfully sent request, returning response back." ContentLength=0 Request="https://amw-proxytest-05-t16w.eastus-1.metrics.ingest.monitor.azure.com/dataCollectionRules/dcr-688b6ed1f2244e098a88e32dde18b4f6/streams/Microsoft-PrometheusMetrics/api/v1/write?api-version=2021-11-01-preview" StatusCode=200

Чтобы запросить рабочую область Azure Monitor, выполните следующие действия.

  1. В рабочей области Azure Monitor выберите книги .

  2. Выберите плитку Prometheus Обозреватель. A screenshot showing the workbooks gallery for an Azure Monitor workspace.

  3. На странице обозревателя введите в поле запроса.

  4. Выберите вкладку "Сетка", чтобы просмотреть результаты.

  5. Проверьте столбец кластера, чтобы узнать, отображается ли из кластера. A screenshot showing the Prometheus explorer query page.

Параметры

Параметр image Имя параметра диаграммы Helm Description Поддерживаемые значения Обязательный
TARGET_HOST targetHost Целевой узел, в который вы хотите перенаправить запрос.
При отправке данных в рабочую область Azure Monitor используйте Metrics ingestion endpoint страницу обзора рабочих областей.
При чтении данных из рабочей области Azure Monitor используйте Query endpoint страницу обзора рабочих областей
Да
IDENTITY_TYPE identityType Тип удостоверения, используемый для проверки подлинности запросов. Этот прокси-сервер поддерживает три типа удостоверений. systemassigned, userassigned, aadapplication Да
AAD_CLIENT_ID aadClientId Идентификатор клиента используемого удостоверения. Используется для userassigned типов удостоверений и aadapplication типов удостоверений. Использование az aks show -g <AKS-CLUSTER-RESOURCE-GROUP> -n <AKS-CLUSTER-NAME> --query "identityProfile" для получения идентификатора клиента Да и userassignedaadapplication
AAD_TENANT_ID aadTenantId Идентификатор клиента используемого удостоверения. Идентификатор клиента используется для aadapplication типов удостоверений. Да для aadapplication
AAD_CLIENT_CERTIFICATE_PATH aadClientCertificatePath Путь, по которому прокси-сервер может найти сертификат для aadapplication. Этот путь должен быть доступен прокси-сервером и должен быть PFX-сертификатом или pem, содержащим закрытый ключ. Только для aadapplication типов удостоверений
AAD_TOKEN_REFRESH_INTERVAL_IN_PERCENTAGE aadTokenRefreshIntervalInMinutes Маркер обновляется на основе процента времени до истечения срока действия маркера. Значение по умолчанию — 10 % времени до истечения срока действия. No
AUDIENCE audience Аудитория маркера No
LISTENING_PORT listeningPort Прослушивание прокси-сервера на этом порту Да
OTEL_SERVICE_NAME otelServiceName Имя службы для трассировок и метрик OTEL. Значение по умолчанию: aad_auth_proxy No
OTEL_GRPC_ENDPOINT otelGrpcEndpoint Прокси-сервер отправляет данные телеметрии OTEL в эту конечную точку. Значение по умолчанию: http://localhost:4317 No

Устранение неполадок

  • Контейнер прокси-сервера не запускается.
    Выполните следующую команду, чтобы отобразить все ошибки для контейнера прокси-сервера.

    kubectl --namespace <Namespace> describe pod <Prometheus-Pod-Name>`
    
  • Прокси-сервер не запускается — ошибки конфигурации

    Прокси-сервер проверка для допустимого удостоверения для получения маркера во время запуска. Если не удается получить маркер, запуск завершается ошибкой. Ошибки регистрируются и могут просматриваться, выполнив следующую команду:

    kubectl --namespace <Namespace> logs <Proxy-Pod-Name>
    

    Пример результата:

    time="2023-05-15T11:24:06Z" level=info msg="Configuration settings loaded:" AAD_CLIENT_CERTIFICATE_PATH= AAD_CLIENT_ID=abc123de-be75-4141-a1e6-abc123987def AAD_TENANT_ID= AAD_TOKEN_REFRESH_INTERVAL_IN_PERCENTAGE=10 AUDIENCE="https://prometheus.monitor.azure.com" IDENTITY_TYPE=userassigned LISTENING_PORT=8082 OTEL_GRPC_ENDPOINT= OTEL_SERVICE_NAME=aad_auth_proxy TARGET_HOST=proxytest-01-workspace-orkw.eastus.prometheus.monitor.azure.com
    2023-05-15T11:24:06.414Z [ERROR] TokenCredential creation failed:Failed to get access token: ManagedIdentityCredential authentication failed
    GET http://169.254.169.254/metadata/identity/oauth2/token
    --------------------------------------------------------------------------------
    RESPONSE 400 Bad Request
    --------------------------------------------------------------------------------
    {
      "error": "invalid_request",
      "error_description": "Identity not found"
    }
    --------------------------------------------------------------------------------