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
역할을 할당합니다.
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" }
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"
또는 Azure Monitor 작업 영역 개요 페이지의 Azure Portal을 사용하여 DCR ID 및 메트릭 수집 엔드포인트를 찾을 수 있습니다.
작업 영역 개요 탭에서 데이터 수집 규칙을 선택한 다음, JSON 보기를 선택하여 리소스 ID를 확인합니다.
Azure Monitor 작업 영역 데이터 수집 규칙에 쓸 수 있도록 관리 ID의
clientId
에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
다음 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 작업 영역에 메트릭을 수집하려면AUDIENCE
를https://monitor.azure.com/.default
로 설정합니다.- OpenTelemetry를 사용하지 않는 경우
OTEL_GRPC_ENDPOINT
및OTEL_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
명령을 사용하여 프록시를 배포합니다.
# create the namespace if it doesn't already exist kubectl create namespace observability kubectl apply -f proxy-ingestion.yaml -n observability
또는 다음과 같이 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
원격 쓰기 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"
원격 쓰기 구성을 적용합니다.
참고 항목
최신 프록시 이미지 버전은 릴리스 정보를 참조하세요.
프록시가 데이터를 수집 중인지 확인합니다.
프록시가 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 작업 영역을 쿼리하려면 아래 단계를 수행합니다.
매개 변수
이미지 매개 변수 | 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입니다. userassigned 및 aadapplication ID 유형에 사용됩니다. az aks show -g <AKS-CLUSTER-RESOURCE-GROUP> -n <AKS-CLUSTER-NAME> --query "identityProfile" 을 사용하여 클라이언트 ID 검색 |
예(userassigned 및 aadapplication 의 경우) |
|
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" } --------------------------------------------------------------------------------