Todos los productos
Search
Centro de documentos

Alibaba Cloud Service Mesh:Integración de un servicio de autorización HTTP personalizado

Última actualización: Sep 21, 2026

La función de servicio de autorización personalizado proporciona un control de acceso detallado para los servicios que se comunican mediante HTTP. Al agregar una comprobación de autorización personalizada a la comunicación entre servicios, se garantiza que solo las solicitudes autenticadas y autorizadas accedan a los recursos del servicio, lo cual mejora la seguridad. En este tema se utilizan las aplicaciones sleep y httpbin para demostrar cómo integrar un servicio de autorización HTTP personalizado.

Requisitos previos

The cluster is added to the ASM instance..

Paso 1: Desplegar un servicio de autorización personalizado

Despliegue un servicio de autorización personalizado en su clúster de ACK. Este servicio debe cumplir con la especificación de API de Istio para servicios de autorización personalizados. Además, debe admitir los protocolos HTTP y gRPC para implementar su lógica de autorización personalizada. El servicio de ejemplo que se utiliza en este tema requiere que la solicitud incluya el encabezado x-ext-authz: allow para superar la comprobación de autorización.

Nota

También puede usar el código de esta aplicación de ejemplo como referencia para crear su propio servicio de autorización personalizado. Para obtener más información, consulte Autorización personalizada.

  1. Conéctese a su clúster mediante kubectl y cree un archivo llamado ext-authz.yaml que contenga el siguiente contenido.

    Para obtener más información sobre cómo conectarse a un clúster mediante kubectl, consulte Obtain the KubeConfig of a cluster and use kubectl to connect to the cluster.

    ext-authz.yaml

    # Copyright Istio Authors
    #
    #   Licensed under the Apache License, Version 2.0 (the "License");
    #   you may not use this file except in compliance with the License.
    #   You may obtain a copy of the License at
    #
    #       http://www.apache.org/licenses/LICENSE-2.0
    #
    #   Unless required by applicable law or agreed to in writing, software
    #   distributed under the License is distributed on an "AS IS" BASIS,
    #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    #   See the License for the specific language governing permissions and
    #   limitations under the License.
    
    # Example configurations for deploying ext-authz server separately in the mesh.
    
    apiVersion: v1
    kind: Service
    metadata:
      name: ext-authz
      labels:
        app: ext-authz
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 8000
      - name: grpc
        port: 9000
        targetPort: 9000
      selector:
        app: ext-authz
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ext-authz
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ext-authz
      template:
        metadata:
          labels:
            app: ext-authz
        spec:
          containers:
          - image: istio/ext-authz:0.6
            imagePullPolicy: IfNotPresent
            name: ext-authz
            ports:
            - containerPort: 8000
            - containerPort: 9000
    ---
  2. Ejecute el siguiente comando para desplegar el servicio de autorización personalizado.

    kubectl apply -f ext-authz.yaml
  3. Ejecute el siguiente comando para comprobar el estado de despliegue del pod.

    kubectl get pod

    Salida esperada:

    NAME                         READY   STATUS    RESTARTS   AGE
    ext-authz-6b5db88f86-2m7c6   2/2     Running   0          79m
  4. Ejecute el siguiente comando para comprobar que la aplicación funciona correctamente.

    kubectl logs "$(kubectl get pod -l app=ext-authz -n default -o jsonpath={.items..metadata.name})" -n default -c ext-authz

    Salida esperada:

    2023/12/20 08:15:39 Starting gRPC server at [::]:9000
    2023/12/20 08:15:39 Starting HTTP server at [::]:8000

    Esta salida indica que la aplicación funciona correctamente y que el servicio de autorización personalizado ya se desplegó.

  5. Obtenga el puerto HTTP del servicio ext-authz.

    1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.

    2. En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, seleccione Network > Services.

    3. En la página Services, haga clic en ext-authz.

      En la sección Endpoint, tenga en cuenta que el puerto HTTP es 8000. La dirección de acceso de este servicio es ext-authz.default.svc.cluster.local:8000.

Paso 2: Desplegar las aplicaciones de ejemplo

  1. Cree un archivo llamado httpbin.yaml con el siguiente contenido.

    httpbin.yaml

    # Copyright Istio Authors
    #
    #   Licensed under the Apache License, Version 2.0 (the "License");
    #   you may not use this file except in compliance with the License.
    #   You may obtain a copy of the License at
    #
    #       http://www.apache.org/licenses/LICENSE-2.0
    #
    #   Unless required by applicable law or agreed to in writing, software
    #   distributed under the License is distributed on an "AS IS" BASIS,
    #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    #   See the License for the specific language governing permissions and
    #   limitations under the License.
    ##################################################################################################
    # httpbin service
    ##################################################################################################
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
                            
  2. Ejecute el siguiente comando para desplegar la aplicación httpbin.

    kubectl apply -f httpbin.yaml
  3. Cree un archivo llamado sleep.yaml con el siguiente contenido.

    sleep.yaml

    # Copyright Istio Authors
    #
    #   Licensed under the Apache License, Version 2.0 (the "License");
    #   you may not use this file except in compliance with the License.
    #   You may obtain a copy of the License at
    #
    #       http://www.apache.org/licenses/LICENSE-2.0
    #
    #   Unless required by applicable law or agreed to in writing, software
    #   distributed under the License is distributed on an "AS IS" BASIS,
    #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    #   See the License for the specific language governing permissions and
    #   limitations under the License.
    ##################################################################################################
    # Sleep service
    ##################################################################################################
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: sleep
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sleep
      labels:
        app: sleep
        service: sleep
    spec:
      ports:
      - port: 80
        name: http
      selector:
        app: sleep
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sleep
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sleep
      template:
        metadata:
          labels:
            app: sleep
        spec:
          terminationGracePeriodSeconds: 0
          serviceAccountName: sleep
          containers:
          - name: sleep
            image: curlimages/curl
            command: ["/bin/sleep", "3650d"]
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - mountPath: /etc/sleep/tls
              name: secret-volume
          volumes:
          - name: secret-volume
            secret:
              secretName: sleep-secret
              optional: true
    ---
                            
  4. Ejecute el siguiente comando para desplegar la aplicación sleep.

    kubectl apply -f sleep.yaml

Paso 3: Registrar el servicio de autorización personalizado

Declare ante el Service Mesh el servicio que se desplegó en Step 1. De este modo, el Service Mesh podrá utilizarlo para la autenticación.

  1. Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione Service Mesh > Mesh Management.

  2. En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, seleccione Mesh Security Center > External Authorization Service. En la página que aparece, haga clic en Define External Authorization Service.

  3. En la página Register External Authorization Service, haga clic en la pestaña Custom authorization service (HTTP or gRPC protocol) implemented based on envoy.ext_authz, configure los parámetros y, a continuación, haga clic en Create.

    Tipo

    Parámetro

    Descripción

    Parámetros obligatorios

    Protocol

    Seleccione el protocolo del servicio de autorización personalizado. En este ejemplo, seleccione HTTP.

    Name

    El nombre del servicio de autorización personalizado. En este ejemplo, introduzca test4http.

    Service Address

    Introduzca la dirección de servicio de la aplicación de autorización personalizada. La dirección debe ser un nombre de dominio completo con el formato <Application Name>.<Namespace>.svc.<Cluster Domain>. Para este ejemplo, introduzca ext-authz.default.svc.cluster.local.

    Port(1 - 65535)

    Introduzca el puerto de servicio de la aplicación de autorización personalizada. En este ejemplo, introduzca 8000.

    Timeout(second)

    Si la aplicación de autorización no responde dentro de este periodo, el servicio se considera no disponible. En este ejemplo, establezca el tiempo de espera en 10 segundos.

    Parámetros opcionales

    Skip authentication while authorization service is unavailable

    Si se habilita, se permiten las solicitudes cuando el servicio de autorización no está disponible. En este ejemplo, esta opción permanece deshabilitada.

    Error code returned by asm proxy while Auth-Service is not available

    Esta opción solo está disponible cuando Skip authentication while authorization service is unavailable está deshabilitada. Si la habilita, debe introducir un código de error. Este código se devuelve al cliente cuando el servicio de autorización no está disponible. En este ejemplo, la opción permanece deshabilitada.

    Carry origin header within auth request [includeRequestHeadersInCheck]

    Cuando se habilita, debe especificar las claves de los encabezados que desea incluir. Los encabezados coincidentes se incluyen en la solicitud enviada al servicio de autorización personalizado. Para este ejemplo, consulte la configuración en Include headers in the authorization request.

    Nota

    Este parámetro solo se configura cuando Protocol se establece en HTTP.

    Add a header in the authentication request (if a header with the same name already exists, the original value will be overwritten) [includeAdditionalHeadersInCheck]

    Cuando se habilita, debe especificar las claves y los valores de los encabezados que se agregarán a la solicitud de autorización.

    Si ya existe un encabezado con el mismo nombre, su valor se sobrescribe. En este ejemplo, esta opción permanece deshabilitada.

    Nota

    Este parámetro solo se configura cuando Protocol se establece en HTTP.

    Overwrite Header when authentication passes (overwrite Header in the request to the target service by using Header in the authentication request Response) [headersToUpstreamOnAllow]

    Si se habilita, especifique qué claves de encabezado se sobrescribirán. Cuando la autorización es exitosa, los encabezados coincidentes de la respuesta de autorización sobrescriben los encabezados correspondientes en la solicitud hacia el servicio de destino. Para este ejemplo, consulte la configuración en Overwrite headers on successful authorization.

    Nota

    Este parámetro solo se configura cuando Protocol se establece en HTTP.

    Overwrite Header when authentication fails (overwrite Header in Response using Header in authentication request Response) [headersToDownstreamOnDeny]

    Si se habilita, especifique qué claves de encabezado se sobrescribirán. Cuando la autorización falla, los encabezados coincidentes de la respuesta de autorización sobrescriben los encabezados correspondientes en la respuesta hacia el servicio llamante. Para este ejemplo, consulte la configuración en Overwrite headers on failed authorization.

    Nota

    Este parámetro solo se configura cuando Protocol se establece en HTTP.

    Carry origin request body within auth request

    Si se habilita, especifique el tamaño máximo del cuerpo de la solicitud que se incluirá en la comprobación de autorización. Si también habilita Allow send incomplete message to Auth-Service(HTTP 413 will be returned if request body size beyond limitation and this option is disabled), los cuerpos que superen el límite se truncan antes de enviarse. De lo contrario, las solicitudes con cuerpos demasiado grandes se rechazan con un error HTTP 413.

    Figura 1. Inclusión de encabezados en la solicitud de autorización

    Nota

    La última entrada corresponde al nuevo x-ext-authz.

    Los encabezados que se deben incluir son: cookie, x-forwarded-access-token, x-forwarded-user, x-forwarded-email, authorization, x-forwarded-proto, proxy-authorization, user-agent, x-forwarded-host, from, x-forwarded-for, accept y x-ext-authz.

    Figura 2. Sobrescritura de encabezados tras una autorización exitosa

    Nota

    La última entrada corresponde al nuevo x-ext-authz-check-result.

    Esta lista también incluye los cinco campos existentes: authorization, cookie, path, x-auth-request-access-token y x-forwarded-access-token.

    Figura 3. Sobrescritura de encabezados tras un fallo de autorización

    Nota

    La última entrada corresponde al nuevo x-ext-authz-check-result.

    La lista de encabezados por sobrescribir ya contiene content-type y set-cookie. El nuevo x-ext-authz-check-result se agrega al final de la lista.

Paso 4: Definir una directiva de autorización

Cree una directiva de autorización para especificar qué operaciones requieren autorización.

  1. Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione Service Mesh > Mesh Management.

  2. En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, seleccione Mesh Security Center > AuthorizationPolicy. En la página que aparece, haga clic en Create.

  3. En la página Create, configure los parámetros y, a continuación, haga clic en Create.

    Parámetro

    Descripción

    Name

    El nombre de la directiva de autorización personalizada. En este ejemplo, introduzca test1.

    Policy Type

    Seleccione Custom Authorization Service.

    Custom Authorization Service

    Seleccione httpextauth-test4http(HTTP).

    Namespace

    En la pestaña Workload Scope, seleccione el namespace default.

    Effective Scope

    Seleccione Service.

    Workload

    Seleccione httpbin.

    Request Matching Rules

    En la sección Add Request Target, habilite Paths y establezca el valor en /headers.

Paso 5: Comprobar la autorización personalizada

  1. Ejecute el siguiente comando para acceder a httpbin.default:8000/ip.

    kubectl exec "$(kubectl get pod -l app=sleep -n default -o jsonpath={.items..metadata.name})" -c sleep -n default -- curl "http://httpbin.default:8000/ip" -s -o /dev/null -w "%{http_code}\n"

    Se devuelve un código de estado 200, lo cual indica que la autorización no se activó. Como la ruta de la solicitud /ip no coincide con la ruta /headers definida en la directiva de autorización, dicha directiva no se aplicó a esta solicitud.

  2. Ejecute el siguiente comando para acceder a httpbin.default:8000/headers con el encabezado de solicitud x-ext-authz: deny.

    kubectl exec "$(kubectl get pod -l app=sleep -n default -o jsonpath={.items..metadata.name})" -c sleep -ndefault -- curl "http://httpbin.default:8000/headers" -H "x-ext-authz: deny" -s -i

    Salida esperada:

    HTTP/1.1 403 Forbidden
    x-ext-authz-check-result: denied
    content-length: 76
    content-type: text/plain; charset=utf-8
    date: Wed, 20 Dec 2023 09:53:28 GMT
    server: envoy
    x-envoy-upstream-service-time: 10
    denied by ext_authz for not found header `x-ext-authz: allow` in the request

    La salida muestra que la solicitud se rechazó porque activó la directiva de autorización. La respuesta incluye el encabezado x-ext-authz-check-result: denied, tal como se configuró para los fallos de autorización. La directiva se aplicó porque la ruta de la solicitud es /headers.

  3. Ejecute el siguiente comando para acceder a httpbin.default:8000/headers con el encabezado de solicitud x-ext-authz: allow.

    kubectl exec "$(kubectl get pod -l app=sleep -n default -o jsonpath={.items..metadata.name})" -c sleep -n default -- curl "http://httpbin.default:8000/headers" -H "x-ext-authz: allow" -s

    Salida esperada:

    {
      "headers": {
        "Accept": "*/*",
        "Host": "httpbin.default:8000",
        "User-Agent": "curl/8.5.0",
        "X-Envoy-Attempt-Count": "1",
        "X-Ext-Authz": "allow",
        "X-Ext-Authz-Check-Result": "allowed",
        "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/default/sa/httpbin;Hash=c3e5364e87add0f4f69e6b0d029f5961b404c8f209bf9004b3d21a82cf67****;Subject=\"\";URI=spiffe://cluster.local/ns/default/sa/sleep"
      }
    }

    La salida muestra que la solicitud se permitió porque activó la directiva de autorización y superó la comprobación. La respuesta incluye el encabezado "X-Ext-Authz-Check-Result": "allowed", tal como se configuró para las autorizaciones exitosas. La directiva se aplicó porque la ruta de la solicitud es /headers.

Operaciones relacionadas