Microsoft Entra 권한 부여 프록시

Microsoft Entra 권한 부여 프록시는 Microsoft Entra ID를 사용하여 요청을 인증하는 데 사용할 수 있는 역방향 프록시입니다. 이 프록시를 사용하여 Microsoft Entra 인증을 지원하는 모든 서비스에 대한 요청을 인증할 수 있습니다. 이 프록시를 사용하여 Azure Monitor Prometheus용 관리 서비스에 대한 요청을 인증합니다.

필수 조건

  • Azure Monitor 작업 영역. 작업 영역이 없는 경우 Azure Portal을 사용하여 만듭니다.
  • 클러스터에 설치된 Prometheus입니다.

참고 항목

이 문서의 원격 쓰기 예제에서는 Prometheus 원격 쓰기를 사용하여 Azure Monitor에 데이터를 씁니다. AKS 클러스터를 Prometheus에 온보딩하면 클러스터에 Prometheus가 자동으로 설치되고 작업 영역에 데이터가 전송됩니다.

배포

릴리스 이미지를 사용하거나 helm 차트로 사용자 지정 템플릿을 사용하여 프록시를 배포할 수 있습니다. 두 배포 모두 동일한 사용자 지정 가능한 매개 변수를 포함합니다. 이러한 매개 변수는 Parameters 테이블에 설명되어 있습니다.

자세한 내용은 Microsoft Entra 인증 프록시 프로젝트를 참조하세요.

다음 예제에서는 원격 쓰기 및 Azure Monitor에서 데이터를 쿼리하기 위해 프록시를 배포하는 방법을 보여 줍니다.

참고 항목

이 예제에서는 프록시를 사용하여 Azure Monitor Prometheus용 관리 서비스에 대한 원격 쓰기 요청을 인증하는 방법을 보여 줍니다. 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. Azure Monitor 작업 영역 데이터 수집 규칙에 쓸 수 있도록 관리 ID의 clientIdMonitoring 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을 제거합니다.

    매개 변수에 대한 자세한 내용은 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. 명령을 사용하여 프록시를 배포합니다.

    # 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. 원격 쓰기 구성을 적용합니다.

참고 항목

최신 프록시 이미지 버전은 릴리스 정보를 참조하세요.

프록시가 데이터를 수집 중인지 확인합니다.

프록시가 Pod의 로그를 확인하거나 Azure Monitor 작업 영역을 쿼리하여 메트릭을 성공적으로 수집하고 있는지 확인합니다.

다음 명령을 실행하여 Pod의 로그를 확인합니다.

# 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 Explorer 타일을 선택합니다. A screenshot showing the workbooks gallery for an Azure Monitor workspace.

  3. 탐색기 페이지에서 쿼리 상자에 up을 입력합니다.

  4. 결과를 보려면 그리드 탭을 선택합니다.

  5. 클러스터 열에서 클러스터가 표시되는지 확인합니다. A screenshot showing the Prometheus explorer query page.

매개 변수

이미지 매개 변수 Helm 차트 매개 변수 이름 설명 지원되는 값 필수
TARGET_HOST targetHost 요청을 전달할 대상 호스트입니다.
Azure Monitor 작업 영역으로 데이터를 보낼 때 작업 영역 개요 페이지의 Metrics ingestion endpoint를 사용합니다.
Azure Monitor 작업 영역에서 데이터를 읽을 때 작업 영역 개요 페이지의 Query endpoint를 사용합니다.
IDENTITY_TYPE identityType 요청을 인증하는 데 사용되는 ID 유형입니다. 이 프록시는 세 가지 유형의 ID를 지원합니다. systemassigned, userassigned, aadapplication
AAD_CLIENT_ID aadClientId 사용되는 ID의 클라이언트 ID입니다. userassignedaadapplication ID 유형에 사용됩니다. az aks show -g <AKS-CLUSTER-RESOURCE-GROUP> -n <AKS-CLUSTER-NAME> --query "identityProfile"을 사용하여 클라이언트 ID 검색 예(userassignedaadapplication의 경우)
AAD_TENANT_ID aadTenantId 사용되는 ID의 테넌트 ID입니다. 테넌트 ID는 aadapplication ID 유형에 사용됩니다. 예(aadapplication의 경우)
AAD_CLIENT_CERTIFICATE_PATH aadClientCertificatePath 프록시가 aadapplication에 대한 인증서를 찾을 수 있는 경로입니다. 이 경로는 프록시로 액세스할 수 있어야 하며 프라이빗 키를 포함하는 pfx 또는 pem 인증서여야 합니다. aadapplication ID 유형에만 해당
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"
    }
    --------------------------------------------------------------------------------