Delen via


Microsoft Entra-autorisatieproxy

De Microsoft Entra-autorisatieproxy is een omgekeerde proxy, die kan worden gebruikt voor het verifiëren van aanvragen met behulp van Microsoft Entra-id. Deze proxy kan worden gebruikt voor het verifiëren van aanvragen voor elke service die ondersteuning biedt voor Microsoft Entra-verificatie. Gebruik deze proxy om aanvragen te verifiëren voor de beheerde Azure Monitor-service voor Prometheus.

Vereisten

  • Een Azure Monitor-werkruimte. Als u geen werkruimte hebt, maakt u er een met behulp van Azure Portal.
  • Prometheus is geïnstalleerd op uw cluster.

Notitie

In het voorbeeld van extern schrijven in dit artikel wordt externe schrijfbewerking van Prometheus gebruikt om gegevens naar Azure Monitor te schrijven. Als u uw AKS-cluster onboardt naar Prometheus, wordt Prometheus automatisch op uw cluster geïnstalleerd en worden gegevens naar uw werkruimte verzonden.

Implementatie

De proxy kan worden geïmplementeerd met aangepaste sjablonen met behulp van een release-installatiekopie of als helm-grafiek. Beide implementaties bevatten dezelfde aanpasbare parameters. Deze parameters worden beschreven in de tabel Parameters .

Zie het Microsoft Entra-verificatieproxyproject voor meer informatie.

In de volgende voorbeelden ziet u hoe u de proxy implementeert voor extern schrijven en voor het opvragen van gegevens uit Azure Monitor.

Notitie

In dit voorbeeld ziet u hoe u de proxy gebruikt voor het verifiëren van aanvragen voor extern schrijven naar een beheerde Azure Monitor-service voor Prometheus. Prometheus remote write heeft een speciale zijauto voor extern schrijven. Dit is de aanbevolen methode voor het implementeren van externe schrijfbewerkingen.

Voordat u de proxy implementeert, zoekt u uw beheerde identiteit en wijst u deze toe aan de Monitoring Metrics Publisher rol voor de gegevensverzamelingsregel van de Azure Monitor-werkruimte.

  1. Zoek de clientId beheerde identiteit voor uw AKS-cluster. De beheerde identiteit wordt gebruikt om te verifiëren bij de Azure Monitor-werkruimte. De beheerde identiteit wordt gemaakt wanneer het AKS-cluster wordt gemaakt.

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

    De uitvoer heeft de volgende indeling:

    {
      "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. Zoek de DCR-id (Data Collection Rule) van uw Azure Monitor-werkruimte.
    De regelnaam is hetzelfde als de naam van de werkruimte. De naam van de resourcegroep voor de regel voor gegevensverzameling volgt de indeling: MA_<workspace-name>_<REGION>_managedbijvoorbeeld MA_amw-proxytest_eastus_managed. Gebruik de volgende opdracht om de regel-id voor gegevensverzameling te vinden:

    az monitor data-collection rule show --name <dcr-name> --resource-group <resource-group-name> --query "id"
    
  3. U kunt ook uw DCR-id en opname-eindpunt voor metrische gegevens vinden met behulp van Azure Portal op de overzichtspagina van de Azure Monitor-werkruimte.

    Selecteer de regel voor gegevensverzameling op het tabblad Overzicht van de werkruimte en selecteer vervolgens de JSON-weergave om de resource-id weer te geven.

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

  4. Wijs de Monitoring Metrics Publisher rol toe aan de beheerde identiteiten clientId , zodat deze kan schrijven naar de regel voor het verzamelen van gegevens in de Azure Monitor-werkruimte.

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

    Voorbeeld:

    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. Gebruik het volgende YAML-bestand om de proxy te implementeren voor extern schrijven. Wijzig de volgende parameters:

    • TARGET_HOST - De doelhost waarnaar u de aanvraag wilt doorsturen. Als u gegevens naar een Azure Monitor-werkruimte wilt verzenden, gebruikt u het hostnaamgedeelte van de Metrics ingestion endpoint werkruimtenoverzichtspagina. Bijvoorbeeld http://amw-proxytest-abcd.eastus-1.metrics.ingest.monitor.azure.com
    • AAD_CLIENT_ID - De clientId beheerde identiteit waaraan de Monitoring Metrics Publisher rol is toegewezen.
    • AUDIENCE - Voor het opnemen van metrische gegevens naar Azure Monitor Workspace, ingesteld op AUDIENCEhttps://monitor.azure.com/.default .
    • Verwijder OTEL_GRPC_ENDPOINT en OTEL_SERVICE_NAME als u Geen OpenTelemetry gebruikt.

    Zie de tabel Parameters voor meer informatie over de 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. Implementeer de proxy met behulp van opdrachten:

    # create the namespace if it doesn't already exist
    kubectl create namespace observability 
    
    kubectl apply -f proxy-ingestion.yaml -n observability
    
  7. U kunt de proxy ook als volgt implementeren met 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. Configureer de URL voor externe schrijfbewerkingen.
    De URL-hostnaam bestaat uit de naam en naamruimte van de opnameservice in de volgende indeling <ingestion service name>.<namespace>.svc.cluster.local. In dit voorbeeld is azuremonitor-ingestion.observability.svc.cluster.localde host .
    Configureer het URL-pad met behulp van het pad vanaf de Metrics ingestion endpoint overzichtspagina van de Azure Monitor-werkruimte. Bijvoorbeeld: 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. Pas de externe schrijfconfiguratie toe.

Notitie

Zie de releaseopmerkingen voor de nieuwste versie van de proxyinstallatiekopieën

Controleer of de proxy gegevens opneemt

Controleer of de proxy metrische gegevens kan opnemen door de logboeken van de pod te controleren of door een query uit te voeren op de Azure Monitor-werkruimte.

Controleer de logboeken van de pod door de volgende opdrachten uit te voeren:

# 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

Als u metrische gegevens opneemt, wordt er een logboek gemaakt dat StatusCode=200 er ongeveer als volgt uitziet:

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

Volg de onderstaande stappen om een query uit te voeren op uw Azure Monitor-werkruimte:

  1. Selecteer Werkmappen in uw Azure Monitor-werkruimte.

  2. Selecteer de tegel Prometheus Explorer . A screenshot showing the workbooks gallery for an Azure Monitor workspace.

  3. Voer op de pagina Explorer het queryvak in.

  4. Selecteer het tabblad Raster om de resultaten te bekijken.

  5. Controleer de clusterkolom om te zien of uw cluster wordt weergegeven. A screenshot showing the Prometheus explorer query page.

Parameters

Afbeeldingsparameter Naam van helm-grafiekparameter Beschrijving Ondersteunde waarden Verplicht
TARGET_HOST targetHost Doelhost waarnaar u de aanvraag wilt doorsturen.
Wanneer u gegevens naar een Azure Monitor-werkruimte verzendt, gebruikt u de Metrics ingestion endpoint pagina Overzicht van werkruimten.
Wanneer u gegevens uit een Azure Monitor-werkruimte leest, gebruikt u de Query endpoint pagina Overzicht van werkruimten
Ja
IDENTITY_TYPE identityType Identiteitstype dat wordt gebruikt voor het verifiëren van aanvragen. Deze proxy ondersteunt drie typen identiteiten. systemassigned, userassigned, aadapplication Ja
AAD_CLIENT_ID aadClientId Client-id van de gebruikte identiteit. Dit wordt gebruikt voor userassigned en aadapplication identiteitstypen. Gebruiken az aks show -g <AKS-CLUSTER-RESOURCE-GROUP> -n <AKS-CLUSTER-NAME> --query "identityProfile" om de client-id op te halen Ja voor userassigned en aadapplication
AAD_TENANT_ID aadTenantId Tenant-id van de gebruikte identiteit. Tenant-id wordt gebruikt voor aadapplication identiteitstypen. Ja voor aadapplication
AAD_CLIENT_CERTIFICATE_PATH aadClientCertificatePath Het pad waar de proxy het certificaat voor aadapplication kan vinden. Dit pad moet toegankelijk zijn via een proxy en moet een PFX- of PEM-certificaat met een persoonlijke sleutel zijn. Alleen voor aadapplication identiteitstypen
AAD_TOKEN_REFRESH_INTERVAL_IN_PERCENTAGE aadTokenRefreshIntervalInMinutes Het token wordt vernieuwd op basis van het tijdspercentage totdat het token verloopt. De standaardwaarde is 10% tijd voordat deze verloopt. Nee
AUDIENCE audience Doelgroep voor het token Nee
LISTENING_PORT listeningPort Proxy luisteren op deze poort Ja
OTEL_SERVICE_NAME otelServiceName Servicenaam voor OTEL-traceringen en metrische gegevens. Standaardwaarde: aad_auth_proxy Nee
OTEL_GRPC_ENDPOINT otelGrpcEndpoint De proxy pusht telemetrie van OTEL naar dit eindpunt. Standaardwaarde: http://localhost:4317 Nee

Problemen oplossen

  • De proxycontainer wordt niet gestart.
    Voer de volgende opdracht uit om eventuele fouten voor de proxycontainer weer te geven.

    kubectl --namespace <Namespace> describe pod <Prometheus-Pod-Name>`
    
  • Proxy wordt niet gestart - configuratiefouten

    De proxy controleert op een geldige identiteit om een token op te halen tijdens het opstarten. Als het ophalen van een token mislukt, mislukt het opstarten. Fouten worden vastgelegd en kunnen worden weergegeven door de volgende opdracht uit te voeren:

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

    Voorbeelduitvoer:

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