Прокси-сервер авторизации Microsoft Entra
Прокси-сервер авторизации Microsoft Entra — это обратный прокси-сервер, который можно использовать для проверки подлинности запросов с помощью идентификатора Microsoft Entra. Этот прокси-сервер можно использовать для проверки подлинности запросов к любой службе, поддерживающей проверку подлинности Microsoft Entra. Используйте этот прокси-сервер для проверки подлинности запросов к управляемой службе Azure Monitor для Prometheus.
Внимание
Это статья с выходом на пенсию.
Образ контейнера прокси-сервера и диаграмма helm больше не поддерживаются или не поддерживаются.
Необходимые компоненты
- Рабочая область Azure Monitor. Если у вас нет рабочей области, создайте ее с помощью портал Azure.
- Prometheus установлен в кластере.
Примечание.
Пример удаленной записи в этой статье использует удаленную запись Prometheus для записи данных в Azure Monitor. Подключение кластера AKS к Prometheus автоматически устанавливает Prometheus в кластере и отправляет данные в рабочую область.
Развертывание
Прокси-сервер можно развернуть с помощью пользовательских шаблонов с помощью образа выпуска или в виде диаграммы helm. Оба развертывания содержат одинаковые настраиваемые параметры. Эти параметры описаны в таблице параметров .
Дополнительные сведения см . в проекте прокси-сервера проверки подлинности Microsoft Entra.
В следующих примерах показано, как развернуть прокси-сервер для удаленной записи и запроса данных из Azure Monitor.
Примечание.
В этом примере показано, как использовать прокси-сервер для проверки подлинности запросов удаленной записи в управляемую службу Azure Monitor для Prometheus. Удаленная запись Prometheus имеет выделенный боковой автомобиль для удаленной записи, который является рекомендуемым методом для реализации удаленной записи.
Перед развертыванием прокси-сервера найдите управляемое удостоверение и назначьте ей Monitoring Metrics Publisher
роль для правила сбора данных рабочей области Azure Monitor.
Найдите управляемое
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" }
Найдите идентификатор правила сбора данных рабочей области 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"
Кроме того, вы можете найти конечную точку приема данных DCR и метрик с помощью портал Azure на странице обзора рабочей области Azure Monitor.
Выберите правило сбора данных на вкладке "Обзор рабочей области", а затем выберите представление JSON, чтобы просмотреть идентификатор ресурса.
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
Используйте следующий файл YAML для развертывания прокси-сервера для удаленной записи. Измените значения следующих параметров.
TARGET_HOST
— целевой узел, в который вы хотите перенаправить запрос. Чтобы отправить данные в рабочую область Azure Monitor, используйте частьMetrics ingestion endpoint
имени узла на странице обзора рабочих областей. Например:http://amw-proxytest-abcd.eastus-1.metrics.ingest.monitor.azure.com
AAD_CLIENT_ID
clientId
— Управляемое удостоверение, используемое для назначенияMonitoring Metrics Publisher
роли.AUDIENCE
— Для приема метрик в рабочую область Azure Monitor установите значениеAUDIENCE
https://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
Разверните прокси-сервер с помощью команд:
# create the namespace if it doesn't already exist kubectl create namespace observability kubectl apply -f proxy-ingestion.yaml -n observability
Кроме того, можно развернуть прокси-сервер с помощью 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
Настройка 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"
Примените конфигурацию удаленной записи.
Убедитесь, что прокси-сервер прием данных
Убедитесь, что прокси-сервер успешно выполняет прием метрик, проверяя журналы 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, выполните следующие действия.
Параметры
Параметр 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" для получения идентификатора клиента |
Да и userassigned aadapplication |
|
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" } --------------------------------------------------------------------------------