Partilhar via


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.

  1. 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"
      }
    
  2. 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"
    
  3. 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.

    Uma captura de tela mostrando a página de visão geral de um espaço de trabalho do Azure Monitor.

  4. Atribua a Monitoring Metrics Publisher função à identidade gerenciada para que ela possa gravar na regra de clientId 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
    
  5. 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 da Metrics 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 - A clientId da identidade gerenciada usada que foi atribuída a Monitoring Metrics Publisher função.
    • AUDIENCE - Para ingerir métricas para o Azure Monitor Workspace, defina AUDIENCE como https://monitor.azure.com/.default .
    • Remova OTEL_GRPC_ENDPOINT e OTEL_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
    
  6. 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
    
  7. 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
    
  8. 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 da Metrics 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" 
    
  9. 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:

  1. No seu espaço de trabalho do Azure Monitor, selecione Pastas de trabalho .

  2. Selecione o bloco Prometheus Explorer . Uma captura de tela mostrando a galeria de pastas de trabalho de um espaço de trabalho do Azure Monitor.

  3. Na página do explorador, introduza na caixa de consulta.

  4. Selecione a guia Grade para ver os resultados.

  5. Verifique a coluna do cluster para ver se do seu cluster são exibidos. Uma captura de tela mostrando a página de consulta do explorador Prometheus.

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"
    }
    --------------------------------------------------------------------------------