Serwer proxy autoryzacji entra firmy Microsoft

Serwer proxy autoryzacji Entra firmy Microsoft jest zwrotnym serwerem proxy, który może służyć do uwierzytelniania żądań przy użyciu identyfikatora Entra firmy Microsoft. Ten serwer proxy może służyć do uwierzytelniania żądań do dowolnej usługi obsługującej uwierzytelnianie firmy Microsoft Entra. Ten serwer proxy służy do uwierzytelniania żądań w usłudze zarządzanej Azure Monitor dla rozwiązania Prometheus.

Wymagania wstępne

  • Obszar roboczy usługi Azure Monitor. Jeśli nie masz obszaru roboczego, utwórz go przy użyciu witryny Azure Portal.
  • Rozwiązanie Prometheus zainstalowane w klastrze.

Uwaga

Przykład zdalnego zapisu w tym artykule używa zdalnego zapisu Prometheus do zapisywania danych w usłudze Azure Monitor. Dołączanie klastra usługi AKS do rozwiązania Prometheus automatycznie instaluje rozwiązanie Prometheus w klastrze i wysyła dane do obszaru roboczego.

Wdrożenie

Serwer proxy można wdrożyć przy użyciu szablonów niestandardowych przy użyciu obrazu wydania lub jako wykresu helm. Oba wdrożenia zawierają te same parametry, które można dostosowywać. Te parametry są opisane w tabeli Parametry .

Aby uzyskać więcej informacji, zobacz Projekt serwera proxy uwierzytelniania entra firmy Microsoft.

W poniższych przykładach pokazano, jak wdrożyć serwer proxy na potrzeby zdalnego zapisu i wykonywania zapytań dotyczących danych z usługi Azure Monitor.

Uwaga

W tym przykładzie pokazano, jak używać serwera proxy do uwierzytelniania żądań zdalnego zapisu w usłudze zarządzanej Azure Monitor dla rozwiązania Prometheus. Rozwiązanie Prometheus remote write ma dedykowany samochód boczny do zdalnego zapisu, który jest zalecaną metodą implementowania zdalnego zapisu.

Przed wdrożeniem serwera proxy znajdź tożsamość zarządzaną i przypisz jej Monitoring Metrics Publisher rolę dla reguły zbierania danych obszaru roboczego usługi Azure Monitor.

  1. clientId Znajdź identyfikator tożsamości zarządzanej dla klastra usługi AKS. Tożsamość zarządzana służy do uwierzytelniania w obszarze roboczym usługi Azure Monitor. Tożsamość zarządzana jest tworzona podczas tworzenia klastra usługi AKS.

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

    Dane wyjściowe mają następujący format:

    {
      "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. Znajdź identyfikator reguły zbierania danych obszaru roboczego usługi Azure Monitor (DCR).
    Nazwa reguły jest taka sama jak nazwa obszaru roboczego. Nazwa grupy zasobów dla reguły zbierania danych jest następująca: MA_<workspace-name>_<REGION>_managed, na przykład MA_amw-proxytest_eastus_managed. Użyj następującego polecenia, aby znaleźć identyfikator reguły zbierania danych:

    az monitor data-collection rule show --name <dcr-name> --resource-group <resource-group-name> --query "id"
    
  3. Alternatywnie możesz znaleźć swój punkt końcowy pozyskiwania identyfikatorów i metryk dcR przy użyciu witryny Azure Portal na stronie Przegląd obszaru roboczego usługi Azure Monitor.

    Wybierz regułę zbierania danych na karcie Przegląd obszaru roboczego, a następnie wybierz widok JSON, aby wyświetlić identyfikator zasobu.

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

  4. Monitoring Metrics Publisher Przypisz rolę do tożsamości clientId zarządzanej, aby mogła zapisywać dane w regule zbierania danych obszaru roboczego usługi Azure Monitor.

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

    Na przykład:

    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. Użyj następującego pliku YAML, aby wdrożyć serwer proxy na potrzeby zdalnego zapisu. Zmodyfikuj następujące parametry:

    • TARGET_HOST - Host docelowy, do którego chcesz przekazać żądanie. Aby wysłać dane do obszaru roboczego usługi Azure Monitor, użyj części Metrics ingestion endpoint nazwy hosta na stronie Przegląd obszarów roboczych. Na przykład http://amw-proxytest-abcd.eastus-1.metrics.ingest.monitor.azure.com
    • AAD_CLIENT_ID - Tożsamość clientId zarządzana użyta, która została przypisana Monitoring Metrics Publisher do roli.
    • AUDIENCE — W przypadku pozyskiwania metryk do obszaru roboczego usługi Azure Monitor ustaw wartość AUDIENCEhttps://monitor.azure.com/.default .
    • Usuń OTEL_GRPC_ENDPOINT element i OTEL_SERVICE_NAME jeśli nie używasz biblioteki OpenTelemetry.

    Aby uzyskać więcej informacji na temat parametrów, zobacz tabelę Parametry .

    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. Wdróż serwer proxy przy użyciu poleceń:

    # create the namespace if it doesn't already exist
    kubectl create namespace observability 
    
    kubectl apply -f proxy-ingestion.yaml -n observability
    
  7. Alternatywnie możesz wdrożyć serwer proxy przy użyciu narzędzia Helm w następujący sposób:

    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. Skonfiguruj zdalny adres URL zapisu.
    Nazwa hosta adresu URL składa się z nazwy usługi pozyskiwania i przestrzeni nazw w następującym formacie <ingestion service name>.<namespace>.svc.cluster.local. W tym przykładzie hostem jest azuremonitor-ingestion.observability.svc.cluster.local.
    Skonfiguruj ścieżkę adresu URL przy użyciu ścieżki ze Metrics ingestion endpoint strony Przegląd obszaru roboczego usługi Azure Monitor. Na przykład 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. Zastosuj konfigurację zapisu zdalnego.

Uwaga

Aby uzyskać najnowszą wersję obrazu serwera proxy, zobacz informacje o wersji

Sprawdź, czy serwer proxy pozyska dane

Sprawdź, czy serwer proxy pomyślnie pozyska metryki, sprawdzając dzienniki zasobnika lub wysyłając zapytanie do obszaru roboczego usługi Azure Monitor.

Sprawdź dzienniki zasobnika, uruchamiając następujące polecenia:

# 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

Pomyślnie pozyskiwanie metryk powoduje utworzenie dziennika o StatusCode=200 podobnej do następującej:

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

Aby wykonać zapytanie dotyczące obszaru roboczego usługi Azure Monitor, wykonaj poniższe kroki:

  1. W obszarze roboczym usługi Azure Monitor wybierz pozycję Skoroszyty .

  2. Wybierz kafelek Prometheus Explorer. A screenshot showing the workbooks gallery for an Azure Monitor workspace.

  3. Na stronie eksploratora wprowadź ciąg w polu zapytania.

  4. Wybierz kartę Siatka, aby wyświetlić wyniki.

  5. Sprawdź kolumnę klastra, aby sprawdzić, czy z klastra są wyświetlane. A screenshot showing the Prometheus explorer query page.

Parametry

Parametr obrazu Nazwa parametru wykresu helm opis Obsługiwane wartości Obowiązkowy
TARGET_HOST targetHost Host docelowy, do którego chcesz przekazać żądanie.
Podczas wysyłania danych do obszaru roboczego usługi Azure Monitor użyj Metrics ingestion endpoint strony Przegląd obszarów roboczych.
Podczas odczytywania danych z obszaru roboczego usługi Azure Monitor użyj Query endpoint strony Przegląd obszarów roboczych
Tak
IDENTITY_TYPE identityType Typ tożsamości używany do uwierzytelniania żądań. Ten serwer proxy obsługuje trzy typy tożsamości. systemassigned, userassigned, aadapplication Tak
AAD_CLIENT_ID aadClientId Identyfikator klienta używanej tożsamości. Jest to używane w przypadku userassigned typów tożsamości i aadapplication . Użyj az aks show -g <AKS-CLUSTER-RESOURCE-GROUP> -n <AKS-CLUSTER-NAME> --query "identityProfile" polecenia , aby pobrać identyfikator klienta Tak dla userassigned i aadapplication
AAD_TENANT_ID aadTenantId Identyfikator dzierżawy używanej tożsamości. Identyfikator dzierżawy jest używany dla aadapplication typów tożsamości. Tak dla aadapplication
AAD_CLIENT_CERTIFICATE_PATH aadClientCertificatePath Ścieżka, w której serwer proxy może znaleźć certyfikat dla aadapplication. Ta ścieżka powinna być dostępna przez serwer proxy i powinna być certyfikatem pfx lub pem zawierającym klucz prywatny. Tylko dla aadapplication typów tożsamości
AAD_TOKEN_REFRESH_INTERVAL_IN_PERCENTAGE aadTokenRefreshIntervalInMinutes Token jest odświeżany na podstawie procentu czasu do momentu wygaśnięcia tokenu. Wartość domyślna to 10% czasu przed wygaśnięciem. Nie.
AUDIENCE audience Odbiorcy tokenu Nie.
LISTENING_PORT listeningPort Serwer proxy nasłuchujący na tym porcie Tak
OTEL_SERVICE_NAME otelServiceName Nazwa usługi dla śladów i metryk OTEL. Wartość domyślna: aad_auth_proxy Nie.
OTEL_GRPC_ENDPOINT otelGrpcEndpoint Serwer proxy wypycha dane telemetryczne OTEL do tego punktu końcowego. Wartość domyślna: http://localhost:4317 Nie.

Rozwiązywanie problemów

  • Kontener serwera proxy nie jest uruchomiony.
    Uruchom następujące polecenie, aby wyświetlić wszelkie błędy dla kontenera serwera proxy.

    kubectl --namespace <Namespace> describe pod <Prometheus-Pod-Name>`
    
  • Serwer proxy nie uruchamia się — błędy konfiguracji

    Serwer proxy sprawdza poprawną tożsamość w celu pobrania tokenu podczas uruchamiania. Jeśli nie można pobrać tokenu, uruchomienie zakończy się niepowodzeniem. Błędy są rejestrowane i można je wyświetlić, uruchamiając następujące polecenie:

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

    Przykładowe wyjście:

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