Microsoft Entra 認可プロキシ

Microsoft Entra 認可プロキシはリバース プロキシであり、Microsoft Entra ID を使用する要求の認証に使用できます。 このプロキシは、Microsoft Entra 認証をサポートする任意のサービスへの要求を認証するために使用できます。 このプロキシを使用して、Prometheus 用 Azure Monitor マネージド サービスに対する要求を認証します。

前提条件

  • Azure Monitor ワークスペース。 ワークスペースがない場合は、Azure portal を使用して作成します。
  • クラスターにインストールされている Prometheus。

注意

この記事のリモート書き込みの例では、Prometheus リモート書き込みを使用して Azure Monitor にデータを書き込みます。 AKS クラスターを Prometheus にオンボードすると、Prometheus がクラスターに自動的にインストールされ、データがワークスペースに送信されます。

デプロイ

プロキシは、リリース イメージを使用したカスタム テンプレートで、または Helm チャートとしてデプロイできます。 どちらのデプロイにも、同じカスタマイズ可能なパラメーターが含まれています。 これらのパラメーターについては、パラメーター表で説明します。

詳細については、Microsoft Entra 認証プロキシ プロジェクトを参照してください。

リモート書き込みと Azure Monitor のデータのクエリ実行のためのプロキシのデプロイ方法を次の例に示します。

注意

この例は、プロキシを使用して、Prometheus 用 Azure Monitor マネージド サービスにリモート書き込みを行う要求を認証する方法を示しています。 Prometheus リモート書き込みには、リモート書き込みを実装するための推奨される方法であるリモート書き込み専用のサイド カーがあります。

プロキシをデプロイする前に、自分のマネージド ID を見つけて、Azure Monitor ワークスペースのデータ収集ルールに対する Monitoring Metrics Publisher ロールを割り当てます。

  1. ご使用の AKS クラスターのマネージド ID の clientId を見つけます。 マネージド ID は、Azure Monitor ワークスペースに対する認証に使用されます。 マネージド ID は、AKS クラスターの作成時に作成されます。

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

    出力の形式は次のとおりです。

    {
      "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. ご使用の Azure Monitor ワークスペースのデータ収集ルール (DCR) ID を見つけます。
    ルール名はワークスペース名と同じです。 データ収集ルールのリソース グループ名は、MA_<workspace-name>_<REGION>_managed の形式に従います (例: MA_amw-proxytest_eastus_managed)。 次のコマンドを使用して、データ収集ルール ID を見つけます。

    az monitor data-collection rule show --name <dcr-name> --resource-group <resource-group-name> --query "id"
    
  3. 別の方法として、Azure Monitor ワークスペースの [概要] ページで Azure portal を使用して、DCR ID とメトリック インジェスト エンドポイントを見つけることができます。

    ワークスペースの [概要] タブで [データ収集ルール] を選択し、[JSON ビュー] を選択して [リソース ID] を表示します。

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

  4. マネージド ID の clientId が Azure Monitor ワークスペースのデータ収集ルールに書き込むことができるように Monitoring Metrics Publisher ロールを割り当てます。

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

    次に例を示します。

    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. 次の YAML ファイルを使用して、リモート書き込みのためのプロキシをデプロイします。 次のパラメーターを変更します。

    • TARGET_HOST - 要求の転送先のターゲット ホスト。 Azure Monitor ワークスペースにデータを送信するには、ワークスペースの [概要] ページから Metrics ingestion endpoint のホスト名部分を使用します。 たとえば、http://amw-proxytest-abcd.eastus-1.metrics.ingest.monitor.azure.com のように指定します。
    • AAD_CLIENT_ID - Monitoring Metrics Publisher ロールが割り当てられた、使用されるマネージド ID の clientId
    • AUDIENCE - メトリックを Azure Monitor ワークスペースに取り込むには、AUDIENCEhttps://monitor.azure.com/.default に設定します。
    • OpenTelemetry を使用しない場合は、OTEL_GRPC_ENDPOINTOTEL_SERVICE_NAME を削除します。

    パラメーターの詳細については、パラメーター表を参照してください。

    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. 次のようにコマンドを使用してプロキシをデプロイします。

    # create the namespace if it doesn't already exist
    kubectl create namespace observability 
    
    kubectl apply -f proxy-ingestion.yaml -n observability
    
  7. 別の方法として、次のように 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. リモート書き込み URL を構成します。
    URL ホスト名は、インジェスト サービス名と名前空間から形式 <ingestion service name>.<namespace>.svc.cluster.local で構成されます。 この例では、ホストは azuremonitor-ingestion.observability.svc.cluster.local です。
    Azure Monitor ワークスペースの [概要] ページの Metrics ingestion endpoint のパスを使用して URL パスを構成します。 たとえば、「 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. リモート書き込み構成を適用します。

注意

最新のプロキシ イメージ バージョンについては、リリース ノートを参照してください

プロキシがデータを取り込むことを確認する

ポッドのログを確認するか、Azure Monitor ワークスペースに対してクエリを実行して、プロキシがメトリックを正常に取り込むことを確認します。

次のコマンドを実行して、ポッドのログを確認します。

# 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

メトリックを正常に取り込むと、StatusCode=200 が含まれている次のようなログが生成されます。

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

Azure Monitor ワークスペースに対してクエリを実行するには、以下の手順に従います。

  1. Azure Monitor ワークスペースで [ブック] を選択します。

  2. [Prometheus エクスプローラー] タイルを選択します。 A screenshot showing the workbooks gallery for an Azure Monitor workspace.

  3. エクスプローラー ページで、クエリ ボックスに「up」と入力します。

  4. [グリッド] タブを選択して、結果を表示します。

  5. [クラスター] 列を確認して、ご使用のクラスターから表示されているかどうかを確認します。 A screenshot showing the Prometheus explorer query page.

パラメーター

イメージのパラメーター Helm チャートのパラメーター名 説明 サポート状況の値 Mandatory
TARGET_HOST targetHost 要求の転送先のターゲット ホスト。
Azure Monitor ワークスペースにデータを送信するときは、ワークスペースの [概要] ページから Metrics ingestion endpoint を使用します。
Azure Monitor ワークスペースからデータを読み取るときは、ワークスペースの [概要] ページから Query endpoint を使用します
はい
IDENTITY_TYPE identityType 要求の認証に使用される ID の種類。 このプロキシは、3 種類の ID をサポートします。 はい
AAD_CLIENT_ID aadClientId 使用される ID のクライアント ID。 これは、ID の種類 userassignedaadapplication に使用されます。 クライアント ID の取得には az aks show -g <AKS-CLUSTER-RESOURCE-GROUP> -n <AKS-CLUSTER-NAME> --query "identityProfile" を使用します userassignedaadapplication については、はい
AAD_TENANT_ID aadTenantId 使用される ID のテナント ID。 テナント ID は、ID の種類 aadapplication に使用されます。 aadapplication については、はい
AAD_CLIENT_CERTIFICATE_PATH aadClientCertificatePath プロキシが aadapplication の証明書を検索できるパス。 このパスはプロキシからアクセスでき、秘密キーを含む pfx または pem 証明書である必要があります。 ID の種類 aadapplication についてのみ
AAD_TOKEN_REFRESH_INTERVAL_IN_PERCENTAGE aadTokenRefreshIntervalInMinutes トークンは、トークンの有効期限までの時間の割合に基づいて更新されます。 既定値は、有効期限の 10% 前です。 いいえ
AUDIENCE audience トークンの対象ユーザー いいえ
LISTENING_PORT listeningPort このポートでリッスンしているプロキシ はい
OTEL_SERVICE_NAME otelServiceName OTEL トレースとメトリックのサービス名。 既定値: aad_auth_proxy いいえ
OTEL_GRPC_ENDPOINT otelGrpcEndpoint プロキシは、このエンドポイントに OTEL テレメトリをプッシュします。 既定値:http://localhost:4317 いいえ

トラブルシューティング

  • プロキシ コンテナーが起動しない。
    次のコマンドを実行して、プロキシ コンテナーのエラーを表示します。

    kubectl --namespace <Namespace> describe pod <Prometheus-Pod-Name>`
    
  • プロキシが起動しない - 構成エラー

    プロキシは、起動時にトークンをフェッチするための有効な ID を確認します。 トークンの取得に失敗した場合、起動は失敗します。 エラーはログに記録され、次のコマンドを実行して表示できます。

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

    出力例:

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