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
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.
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.
-
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.
-
Ejecute el siguiente comando para desplegar el servicio de autorización personalizado.
kubectl apply -f ext-authz.yaml -
Ejecute el siguiente comando para comprobar el estado de despliegue del pod.
kubectl get podSalida esperada:
NAME READY STATUS RESTARTS AGE ext-authz-6b5db88f86-2m7c6 2/2 Running 0 79m -
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-authzSalida esperada:
2023/12/20 08:15:39 Starting gRPC server at [::]:9000 2023/12/20 08:15:39 Starting HTTP server at [::]:8000Esta salida indica que la aplicación funciona correctamente y que el servicio de autorización personalizado ya se desplegó.
-
Obtenga el puerto HTTP del servicio ext-authz.
Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.
En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, seleccione .
-
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
-
Cree un archivo llamado httpbin.yaml con el siguiente contenido.
-
Ejecute el siguiente comando para desplegar la aplicación httpbin.
kubectl apply -f httpbin.yaml -
Cree un archivo llamado sleep.yaml con el siguiente contenido.
-
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.
Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione .
En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, seleccione . En la página que aparece, haga clic en Define External Authorization Service.
-
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.
NotaEste 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.
NotaEste 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.
NotaEste 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.
NotaEste 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
NotaLa ú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,acceptyx-ext-authz.Figura 2. Sobrescritura de encabezados tras una autorización exitosa
NotaLa ú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-tokenyx-forwarded-access-token.Figura 3. Sobrescritura de encabezados tras un fallo de autorización
NotaLa última entrada corresponde al nuevo x-ext-authz-check-result.
La lista de encabezados por sobrescribir ya contiene
content-typeyset-cookie. El nuevox-ext-authz-check-resultse 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.
Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione .
En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, seleccione . En la página que aparece, haga clic en Create.
-
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
-
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/ipno coincide con la ruta/headersdefinida en la directiva de autorización, dicha directiva no se aplicó a esta solicitud. -
Ejecute el siguiente comando para acceder a
httpbin.default:8000/headerscon el encabezado de solicitudx-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 -iSalida 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 requestLa 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. -
Ejecute el siguiente comando para acceder a
httpbin.default:8000/headerscon el encabezado de solicitudx-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" -sSalida 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
Para aprender a desarrollar un servicio de autorización personalizado basado en HTTP, consulte Develop an HTTP-based custom authorization service.
Para aprender a desarrollar un servicio de autorización personalizado basado en gRPC, consulte Develop a gRPC-based custom authorization service.
Para aplicar un control de acceso detallado a los servicios que se comunican mediante gRPC, consulte Integrate a gRPC custom authorization service.
Para controlar el acceso a los servicios fuera de la malla, consulte Control egress traffic to external websites y Control egress traffic to external databases.
Puede habilitar la auditoría de la malla para registrar y rastrear las operaciones de los usuarios. También puede configurar alertas de auditoría para las operaciones sobre los recursos de la malla y recibir notificaciones oportunas sobre cambios importantes en dichos recursos. Para obtener más información, consulte Use KubeAPI operation audit y Configure audit alerts for mesh resource operations.