Share via


Proxy di autorizzazione di Microsoft Entra

Il proxy di autorizzazione Di Microsoft Entra è un proxy inverso, che può essere usato per autenticare le richieste tramite Microsoft Entra ID. Questo proxy può essere usato per autenticare le richieste a qualsiasi servizio che supporta l'autenticazione di Microsoft Entra. Usare questo proxy per autenticare le richieste al servizio gestito di Monitoraggio di Azure per Prometheus.

Prerequisiti

  • Un'area di lavoro di Monitoraggio di Azure. Se non si ha un'area di lavoro, crearne una usando il portale di Azure.
  • Prometheus installato nel cluster.

Nota

L'esempio di scrittura remota in questo articolo usa la scrittura remota Prometheus per scrivere dati in Monitoraggio di Azure. L'onboarding del cluster del servizio Azure Kubernetes in Prometheus installa automaticamente Prometheus nel cluster e invia i dati all'area di lavoro.

Distribuzione

Il proxy può essere distribuito con modelli personalizzati usando l'immagine di rilascio o come grafico helm. Entrambe le distribuzioni contengono gli stessi parametri personalizzabili. Questi parametri sono descritti nella tabella Parametri .

Per altre informazioni, vedere Progetto proxy di autenticazione di Microsoft Entra.

Gli esempi seguenti illustrano come distribuire il proxy per la scrittura remota e per l'esecuzione di query sui dati da Monitoraggio di Azure.

Nota

Questo esempio illustra come usare il proxy per autenticare le richieste di scrittura remota in un servizio gestito di Monitoraggio di Azure per Prometheus. Prometheus remote write ha un'auto laterale dedicata per la scrittura remota, che è il metodo consigliato per implementare la scrittura remota.

Prima di distribuire il proxy, trovare l'identità gestita e assegnarla il Monitoring Metrics Publisher ruolo per la regola di raccolta dati dell'area di lavoro di Monitoraggio di Azure.

  1. Trovare per clientId l'identità gestita per il cluster del servizio Azure Kubernetes. L'identità gestita viene usata per eseguire l'autenticazione nell'area di lavoro di Monitoraggio di Azure. L'identità gestita viene creata quando viene creato il cluster del servizio Azure Kubernetes.

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

    L'output presenta il formato seguente:

    {
      "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. Trovare l'ID della regola di raccolta dati (DCR) dell'area di lavoro di Monitoraggio di Azure.
    Il nome della regola è uguale al nome dell'area di lavoro. Il nome del gruppo di risorse per la regola di raccolta dati segue il formato , MA_<workspace-name>_<REGION>_managedad esempio MA_amw-proxytest_eastus_managed. Usare il comando seguente per trovare l'ID regola di raccolta dati:

    az monitor data-collection rule show --name <dcr-name> --resource-group <resource-group-name> --query "id"
    
  3. In alternativa, è possibile trovare l'ENDPOINT di inserimento DCR e Metrica usando il portale di Azure nella pagina Panoramica dell'area di lavoro di Monitoraggio di Azure.

    Selezionare la regola raccolta dati nella scheda Panoramica dell'area di lavoro, quindi selezionare visualizzazione JSON per visualizzare l'ID risorsa.

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

  4. Assegnare il Monitoring Metrics Publisher ruolo all'identità gestita in modo che possa scrivere nella regola di raccolta dati dell'area clientId di lavoro di Monitoraggio di Azure.

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

    Ad esempio:

    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. Usare il file YAML seguente per distribuire il proxy per la scrittura remota. Modificare i parametri seguenti:

    • TARGET_HOST - Host di destinazione a cui si vuole inoltrare la richiesta. Per inviare dati a un'area di lavoro di Monitoraggio di Azure, usare la parte nome host della Metrics ingestion endpoint pagina Panoramica delle aree di lavoro. Ad esempio, http://amw-proxytest-abcd.eastus-1.metrics.ingest.monitor.azure.com
    • AAD_CLIENT_ID - Oggetto clientId dell'identità gestita usata a cui è stato assegnato il Monitoring Metrics Publisher ruolo.
    • AUDIENCE - Per l'inserimento delle metriche nell'area di lavoro di Monitoraggio di Azure, impostare su AUDIENCEhttps://monitor.azure.com/.default .
    • Rimuovere OTEL_GRPC_ENDPOINT e OTEL_SERVICE_NAME se non si usa OpenTelemetry.

    Per altre informazioni sui parametri, vedere la tabella Parameters .

    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. Distribuire il proxy usando i comandi:

    # create the namespace if it doesn't already exist
    kubectl create namespace observability 
    
    kubectl apply -f proxy-ingestion.yaml -n observability
    
  7. In alternativa, è possibile distribuire il proxy usando helm come indicato di seguito:

    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. Configurare l'URL di scrittura remoto.
    Il nome host URL è costituito dal nome del servizio di inserimento e dallo spazio dei nomi nel formato <ingestion service name>.<namespace>.svc.cluster.localseguente. In questo esempio l'host è azuremonitor-ingestion.observability.svc.cluster.local.
    Configurare il percorso URL usando il percorso dalla pagina Panoramica dell'area Metrics ingestion endpoint di lavoro di Monitoraggio di Azure. Ad esempio: 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. Applicare la configurazione di scrittura remota.

Nota

Per la versione più recente dell'immagine proxy, vedere le note sulla versione

Verificare che il proxy stia inseriscendo i dati

Verificare che il proxy inserisca correttamente le metriche controllando i log del pod o eseguendo una query sull'area di lavoro monitoraggio di Azure.

Controllare i log del pod eseguendo i comandi seguenti:

# 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

L'inserimento delle metriche genera un log simile StatusCode=200 al seguente:

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

Per eseguire query sull'area di lavoro di Monitoraggio di Azure, seguire questa procedura:

  1. Nell'area di lavoro di Monitoraggio di Azure selezionare Cartelle di lavoro .

  2. Selezionare il riquadro Prometheus Explorer . A screenshot showing the workbooks gallery for an Azure Monitor workspace.

  3. Nella pagina Explorer immettere nella casella query.

  4. Selezionare la scheda Griglia per visualizzare i risultati.

  5. Controllare la colonna del cluster per verificare se dal cluster sono visualizzati. A screenshot showing the Prometheus explorer query page.

Parametri

Parametro Image Nome parametro del grafico Helm Descrizione Valori supportati Obbligatorio
TARGET_HOST targetHost Host di destinazione a cui si vuole inoltrare la richiesta.
Quando si inviano dati a un'area di lavoro di Monitoraggio di Azure, usare dalla Metrics ingestion endpoint pagina Panoramica delle aree di lavoro.
Quando si legge i dati da un'area di lavoro di Monitoraggio di Azure, usare dalla Query endpoint pagina Panoramica delle aree di lavoro
IDENTITY_TYPE identityType Tipo di identità usato per autenticare le richieste. Questo proxy supporta tre tipi di identità. systemassigned, userassigned, aadapplication
AAD_CLIENT_ID aadClientId ID client dell'identità usata. Viene usato per userassigned i tipi di identità e aadapplication . Usare az aks show -g <AKS-CLUSTER-RESOURCE-GROUP> -n <AKS-CLUSTER-NAME> --query "identityProfile" per recuperare l'ID client Sì per userassigned e aadapplication
AAD_TENANT_ID aadTenantId ID tenant dell'identità usata. L'ID tenant viene usato per aadapplication i tipi di identità. Sì per aadapplication
AAD_CLIENT_CERTIFICATE_PATH aadClientCertificatePath Percorso in cui il proxy può trovare il certificato per aadapplication. Questo percorso deve essere accessibile dal proxy e deve essere un certificato pfx o pem contenente una chiave privata. Solo per aadapplication i tipi di identità
AAD_TOKEN_REFRESH_INTERVAL_IN_PERCENTAGE aadTokenRefreshIntervalInMinutes Il token viene aggiornato in base alla percentuale di tempo fino alla scadenza del token. Il valore predefinito è 10% di tempo prima della scadenza. No
AUDIENCE audience Destinatari per il token No
LISTENING_PORT listeningPort Proxy in ascolto su questa porta
OTEL_SERVICE_NAME otelServiceName Nome del servizio per le tracce e le metriche ROUTE. Valore predefinito: aad_auth_proxy No
OTEL_GRPC_ENDPOINT otelGrpcEndpoint Il proxy esegue il push dei dati di telemetria ROUTE a questo endpoint. Valore predefinito: http://localhost:4317 No

Risoluzione dei problemi

  • Il contenitore proxy non viene avviato.
    Eseguire il comando seguente per visualizzare eventuali errori per il contenitore proxy.

    kubectl --namespace <Namespace> describe pod <Prometheus-Pod-Name>`
    
  • Il proxy non viene avviato- errori di configurazione

    Il proxy verifica la presenza di un'identità valida per recuperare un token durante l'avvio. Se non riesce a recuperare un token, l'avvio ha esito negativo. Gli errori vengono registrati e possono essere visualizzati eseguendo il comando seguente:

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

    Output di esempio:

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