Proxy de autorización de Microsoft Entra

El proxy de autorización de Microsoft Entra es un proxy inverso, que se puede usar para autenticar solicitudes mediante el identificador de Microsoft Entra. El proxy se puede usar para autenticar las solicitudes en cualquier servicio que admita la autenticación de Microsoft Entra. Use este proxy para autenticar solicitudes al servicio administrado de Azure Monitor para Prometheus.

Requisitos previos

  • Un área de trabajo de Azure Monitor. Si no tiene un área de trabajo, puede crear uno mediante Azure Portal.
  • Prometheus instalado en su clúster.

Nota

En el ejemplo de escritura remota de este artículo se usa la escritura remota de Prometheus para escribir datos en Azure Monitor. Al incorporar su clúster de AKS a Prometheus, este se instala automáticamente en su clúster y envía datos a su área de trabajo.

Implementación

El proxy se puede implementar con plantillas personalizadas mediante la imagen de versión o como un gráfico de Helm. Ambas implementaciones contienen los mismos parámetros personalizables. Estos parámetros se describen en la tabla Parámetros.

Para obtener más información, consulte el proyecto de proxy de autenticación de Microsoft Entra.

En los siguientes ejemplos se muestra cómo implementar el proxy para escritura remota y para consultar datos desde Azure Monitor.

Nota

En este ejemplo se muestra cómo usar el proxy para autenticar solicitudes de escritura remota en un servicio administrado de Azure Monitor para Prometheus. La escritura remota de Prometheus tiene un coche lateral dedicado para la escritura remota, que es el método recomendado para implementar la escritura remota.

Antes de implementar el proxy, busque la identidad administrada y asígnele el rol Monitoring Metrics Publisher para la regla de recopilación de datos del área de trabajo de Azure Monitor.

  1. Busque la clientId para la identidad administrada del clúster de AKS. La identidad administrada se usa para autenticarse en el área de trabajo de Azure Monitor. La identidad administrada se crea cuando se crea el clúster de AKS.

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

    La salida tiene el siguiente formato:

    {
      "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. Busque el identificador de regla de recopilación de datos (DCR) de su área de trabajo de Azure Monitor.
    El nombre de la regla es el mismo que el nombre del área de trabajo. El nombre del grupo de recursos de la regla de recopilación de datos sigue el formato: MA_<workspace-name>_<REGION>_managed, por ejemplo, MA_amw-proxytest_eastus_managed. Use el siguiente comando para encontrar el ID de la regla de recopilación de datos:

    az monitor data-collection rule show --name <dcr-name> --resource-group <resource-group-name> --query "id"
    
  3. Como alternativa, puede encontrar su ID de DCR y el punto de conexión de ingestión de métricas mediante Azure Portal en la página de información general del área de trabajo de Azure Monitor.

    Seleccione la Regla recopilación de datos en la pestaña Información general del área de trabajo y, después, seleccione vista JSON para ver el identificador de recurso.

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

  4. Asigne el rol Monitoring Metrics Publisher a la clientId de la identidad administrada para que pueda escribir en la regla de recopilación de datos del área de trabajo de Azure Monitor.

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

    Por ejemplo:

    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. Use el siguiente archivo YAML para implementar el proxy para escritura remota. Modifique los parámetros siguientes:

    • TARGET_HOST: host de destino al que desea reenviar la solicitud. Para enviar datos a un área de trabajo de Azure Monitor, use la parte del nombre de host Metrics ingestion endpoint desde la página Información general de las áreas de trabajo. Por ejemplo: http://amw-proxytest-abcd.eastus-1.metrics.ingest.monitor.azure.com
    • AAD_CLIENT_ID: la clientId de la identidad administrada usada que se asignó al rol Monitoring Metrics Publisher.
    • AUDIENCE: para ingerir métricas en el área de trabajo de Azure Monitor, establezca AUDIENCE en https://monitor.azure.com/.default.
    • Elimine OTEL_GRPC_ENDPOINT y OTEL_SERVICE_NAME si no usa OpenTelemetry.

    Para obtener más información acerca de los parámetros, vea la tabla Parámetros.

    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. Implemente el proxy usando los comandos:

    # create the namespace if it doesn't already exist
    kubectl create namespace observability 
    
    kubectl apply -f proxy-ingestion.yaml -n observability
    
  7. Como alternativa, puede implementar el proxy mediante Helm como se indica a continuación:

    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. Configuración URL de la escritura remota.
    El nombre de host de la dirección URL se compone del nombre del servicio de ingesta y del espacio de nombres en el siguiente formato <ingestion service name>.<namespace>.svc.cluster.local. En este ejemplo, el host es azuremonitor-ingestion.observability.svc.cluster.local.
    Configure la ruta de la URL mediante la ruta de Metrics ingestion endpoint desde la página de información general del área de trabajo de Azure Monitor. Por ejemplo, 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. Aplique la configuración de escritura remota.

Nota

Para obtener la versión más reciente de la imagen de proxy, consulte las notas de la versión

Comprobación de que el proxy está ingiriendo datos

Compruebe que el proxy ingiere correctamente las métricas comprobando los registros del pod o consultando el área de trabajo de Azure Monitor.

Ejecute los siguientes comandos para comprobar los registros del 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

La ingesta correcta de métricas genera un registro con StatusCode=200 con aspecto similar al siguiente:

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

Para consultar el área de trabajo de Azure Monitor, siga estos pasos:

  1. En el área de trabajo de Azure Monitor, seleccione Libros.

  2. Seleccione el icono Explorador de Prometheus . A screenshot showing the workbooks gallery for an Azure Monitor workspace.

  3. En la página del explorador, escriba up en el cuadro de consulta.

  4. Seleccione la pestaña Cuadrícula para ver los resultados.

  5. Verifique la columna clúster para ver si se muestra desde su clúster. A screenshot showing the Prometheus explorer query page.

Parámetros

Parámetro de imagen Nombre del parámetro del gráfico de Helm Descripción Valores admitidos Mandatory
TARGET_HOST targetHost Host de destino al que desea reenviar la solicitud.
Para enviar datos a un área de trabajo de Azure Monitor, use Metrics ingestion endpoint desde la página Información general de las áreas de trabajo.
Al leer datos de un área de trabajo de Azure Monitor, use Query endpoint desde la página de Información general de las áreas de trabajo
IDENTITY_TYPE identityType Tipo de identidad que se usa para autenticar solicitudes. Este proxy admite tres tipos de identidades. systemassigned, userassigned, aadapplication
AAD_CLIENT_ID aadClientId ID de cliente de la identidad utilizada. Se usa para userassigned y aadapplication los tipos de identidad . Usar az aks show -g <AKS-CLUSTER-RESOURCE-GROUP> -n <AKS-CLUSTER-NAME> --query "identityProfile" para recuperar el identificador del cliente Sí para userassigned y aadapplication
AAD_TENANT_ID aadTenantId ID de inquilino de la identidad utilizada. El identificador de inquilino se usa para los tipos de identidad aadapplication. Sí para aadapplication
AAD_CLIENT_CERTIFICATE_PATH aadClientCertificatePath Ruta de acceso donde el proxy puede encontrar el certificado para aadapplication. Esta ruta debe ser accesible por proxy y debe ser un certificado pfx o pem que contenga una clave privada. Solo para tipos de identidad aadapplication
AAD_TOKEN_REFRESH_INTERVAL_IN_PERCENTAGE aadTokenRefreshIntervalInMinutes El token se actualiza en función del porcentaje de tiempo hasta que expire el token. El valor predeterminado es un 10 % de tiempo antes de la expiración. No
AUDIENCE audience Audiencia para el token No
LISTENING_PORT listeningPort Proxy escuchando en este puerto
OTEL_SERVICE_NAME otelServiceName Nombre del servicio para seguimientos y métricas de OTEL. Valor predeterminado: aad_auth_proxy No
OTEL_GRPC_ENDPOINT otelGrpcEndpoint El proxy envía la telemetría de OTEL a este punto de conexión. Valor predeterminado: http://localhost:4317 No

Solución de problemas

  • El contenedor proxy no se inicia.
    Ejecute el siguiente comando para mostrar los errores del contenedor de proxy.

    kubectl --namespace <Namespace> describe pod <Prometheus-Pod-Name>`
    
  • El proxy no se inicia: errores de configuración

    El proxy comprueba si hay una identidad válida para capturar un token durante el inicio. Si no se puede recuperar un token, se produce un error en el inicio. Los errores se registran y se pueden ver ejecutando el siguiente comando:

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

    Salida de ejemplo:

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