Proxy de autorização do Microsoft Entra
O proxy de autorização do Microsoft Entra é um proxy reverso, que pode ser usado para autenticar solicitações usando o Microsoft Entra ID. Esse proxy pode ser usado para autenticar solicitações para qualquer serviço que ofereça suporte à autenticação do Microsoft Entra. Use esse proxy para autenticar solicitações no serviço gerenciado do Azure Monitor para Prometheus.
Atenção
Este é um artigo aposentado.
A imagem do contêiner proxy e o gráfico de leme não são mais mantidos ou suportados.
Pré-requisitos
- Um espaço de trabalho do Azure Monitor. Se você não tiver um espaço de trabalho, crie um usando o portal do Azure.
- Prometheus instalado no seu cluster.
Nota
O exemplo de gravação remota neste artigo usa a gravação remota do Prometheus para gravar dados no Azure Monitor. A integração do cluster AKS no Prometheus instala automaticamente o Prometheus no cluster e envia dados para o seu espaço de trabalho.
Implementação
O proxy pode ser implantado com modelos personalizados usando a imagem de liberação ou como um gráfico de leme. Ambas as implantações contêm os mesmos parâmetros personalizáveis. Esses parâmetros são descritos na tabela Parâmetros .
Para obter mais informações, consulte Projeto de proxy de autenticação do Microsoft Entra.
Os exemplos a seguir mostram como implantar o proxy para gravação remota e para consultar dados do Azure Monitor.
Nota
Este exemplo mostra como usar o proxy para autenticar solicitações de gravação remota em um serviço gerenciado do Azure Monitor para Prometheus. Prometheus remote write tem um carro lateral dedicado para escrita remota, que é o método recomendado para implementar a escrita remota.
Antes de implantar o proxy, localize sua identidade gerenciada e atribua-lhe a Monitoring Metrics Publisher
função para a regra de coleta de dados do espaço de trabalho do Azure Monitor.
Encontre a
clientId
identidade gerenciada para seu cluster AKS. A identidade gerenciada é usada para autenticar no espaço de trabalho do Azure Monitor. A identidade gerenciada é criada quando o cluster AKS é criado.# Get the identity client_id az aks show -g <AKS-CLUSTER-RESOURCE-GROUP> -n <AKS-CLUSTER-NAME> --query "identityProfile"
A saída tem o seguinte formato:
{ "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" }
Encontre a ID da regra de coleta de dados (DCR) do espaço de trabalho do Azure Monitor.
O nome da regra é igual ao nome do espaço de trabalho. O nome do grupo de recursos para sua regra de coleta de dados segue o formato: , por exemploMA_amw-proxytest_eastus_managed
,MA_<workspace-name>_<REGION>_managed
. Use o seguinte comando para localizar o ID da regra de coleta de dados:az monitor data-collection rule show --name <dcr-name> --resource-group <resource-group-name> --query "id"
Como alternativa, você pode encontrar seu ponto de extremidade de ingestão de ID DCR e Métricas usando o portal do Azure na página Visão geral do espaço de trabalho do Azure Monitor.
Selecione a regra de coleta de dados na guia Visão geral do espaço de trabalho e, em seguida, selecione Exibição JSON para ver a ID do recurso.
Atribua a
Monitoring Metrics Publisher
função à identidade gerenciada para que ela possa gravar na regra declientId
coleta de dados do espaço de trabalho do Azure Monitor.az role assignment create / --assignee <clientid> / --role "Monitoring Metrics Publisher" / --scope <workspace-dcr-id>
Por exemplo:
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
Use o seguinte arquivo YAML para implantar o proxy para gravação remota. Modifique os parâmetros seguintes:
TARGET_HOST
- O host de destino para onde você deseja encaminhar a solicitação. Para enviar dados para um espaço de trabalho do Azure Monitor, use a parte do nome do host daMetrics ingestion endpoint
página Visão geral dos espaços de trabalho. Por exemplo,http://amw-proxytest-abcd.eastus-1.metrics.ingest.monitor.azure.com
AAD_CLIENT_ID
- AclientId
da identidade gerenciada usada que foi atribuída aMonitoring Metrics Publisher
função.AUDIENCE
- Para ingerir métricas para o Azure Monitor Workspace, definaAUDIENCE
comohttps://monitor.azure.com/.default
.- Remova
OTEL_GRPC_ENDPOINT
eOTEL_SERVICE_NAME
se você não estiver usando OpenTelemetry.
Para obter mais informações sobre os parâmetros, consulte a tabela Parâmetros .
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
Implante o proxy usando comandos:
# create the namespace if it doesn't already exist kubectl create namespace observability kubectl apply -f proxy-ingestion.yaml -n observability
Como alternativa, você pode implantar o proxy usando helm da seguinte maneira:
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
Configure a URL de gravação remota.
O nome do host da URL é composto pelo nome do serviço de ingestão e namespace no seguinte formato<ingestion service name>.<namespace>.svc.cluster.local
. Neste exemplo, o host éazuremonitor-ingestion.observability.svc.cluster.local
.
Configure o caminho da URL usando o caminho daMetrics ingestion endpoint
página Visão geral do espaço de trabalho do Azure Monitor. Por exemplo,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"
Aplique a configuração de gravação remota.
Nota
Para obter a versão mais recente da imagem proxy, consulte as notas de versão
Verifique se o proxy está ingerindo dados
Verifique se o proxy está ingerindo métricas com êxito verificando os logs do pod ou consultando o espaço de trabalho do Azure Monitor.
Verifique os logs do pod executando os seguintes comandos:
# 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
A ingestão bem-sucedida de métricas produz um log semelhante StatusCode=200
ao seguinte:
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
Para consultar seu espaço de trabalho do Azure Monitor, siga as etapas abaixo:
Parâmetros
Parâmetro de imagem | Gráfico de leme Nome do parâmetro | Description | Valores suportados | Obrigatório |
---|---|---|---|---|
TARGET_HOST |
targetHost |
Host de destino para onde você deseja encaminhar a solicitação. Ao enviar dados para um espaço de trabalho do Azure Monitor, use a Metrics ingestion endpoint página Visão geral dos espaços de trabalho. Ao ler dados de um espaço de trabalho do Azure Monitor, use a Query endpoint página Visão geral dos espaços de trabalho |
Sim | |
IDENTITY_TYPE |
identityType |
Tipo de identidade usado para autenticar solicitações. Este proxy suporta três tipos de identidades. | systemassigned , userassigned , aadapplication |
Sim |
AAD_CLIENT_ID |
aadClientId |
ID do cliente da identidade usada. Isso é usado para userassigned e aadapplication tipos de identidade. Use az aks show -g <AKS-CLUSTER-RESOURCE-GROUP> -n <AKS-CLUSTER-NAME> --query "identityProfile" para recuperar a ID do Cliente |
Sim para userassigned e aadapplication |
|
AAD_TENANT_ID |
aadTenantId |
ID do locatário da identidade usada. A ID do locatário é usada para aadapplication tipos de identidade. |
Sim para aadapplication |
|
AAD_CLIENT_CERTIFICATE_PATH |
aadClientCertificatePath |
O caminho onde o proxy pode encontrar o certificado para aadapplication. Esse caminho deve ser acessível por proxy e deve ser um certificado pfx ou pem contendo chave privada. | Apenas para aadapplication tipos de identidade |
|
AAD_TOKEN_REFRESH_INTERVAL_IN_PERCENTAGE |
aadTokenRefreshIntervalInMinutes |
O token é atualizado com base na porcentagem de tempo até a expiração do token. O valor padrão é 10% de tempo antes do vencimento. | Não | |
AUDIENCE |
audience |
Audiência para o token | Não | |
LISTENING_PORT |
listeningPort |
Escuta de proxy nesta porta | Sim | |
OTEL_SERVICE_NAME |
otelServiceName |
Nome do serviço para rastreamentos e métricas OTEL. Valor padrão: aad_auth_proxy | Não | |
OTEL_GRPC_ENDPOINT |
otelGrpcEndpoint |
O proxy envia a telemetria OTEL para esse ponto de extremidade. Valor predefinido: http://localhost:4317 | Não |
Resolução de Problemas
O contêiner de proxy não inicia.
Execute o seguinte comando para mostrar quaisquer erros para o contêiner de proxy.kubectl --namespace <Namespace> describe pod <Prometheus-Pod-Name>`
O proxy não inicia - erros de configuração
O proxy verifica se há uma identidade válida para buscar um token durante a inicialização. Se ele não conseguir recuperar um token, a inicialização falhará. Os erros são registrados e podem ser visualizados executando o seguinte comando:
kubectl --namespace <Namespace> logs <Proxy-Pod-Name>
Saída de exemplo:
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" } --------------------------------------------------------------------------------