Política de Autorización de Apache APISIX: Protege tus APIs
April 21, 2023
Introducción
Hoy en día, las API se han convertido en el puente que conecta diversos sistemas y aplicaciones en términos de datos y funcionalidad. Mientras disfrutamos de la conveniencia de las API, garantizar la seguridad de los datos y evitar fugas de información y otros problemas de seguridad se han convertido en las principales preocupaciones de los usuarios. En este punto, el control de acceso juega un papel crucial. Al establecer políticas de control de acceso adecuadas para las API, no solo puedes protegerlas de enormes ciberataques y garantizar la seguridad de los datos, sino que también puedes ayudar a las empresas a cumplir con los requisitos de cumplimiento y aumentar la confianza de los clientes.
Apache APISIX es una puerta de enlace API nativa de la nube dinámica, en tiempo real y de alto rendimiento que ofrece un conjunto completo de funciones de gestión de tráfico, como equilibrio de carga, upstream dinámico, lanzamiento canario, interrupción de servicios, autenticación y observabilidad. En este artículo, presentaremos las políticas de control de acceso de Apache APISIX y discutiremos qué estrategias comunes se pueden utilizar para proteger la seguridad de tu API y garantizar el funcionamiento estable de tu sistema.
¿Qué es una Política de Control de Acceso?
Las políticas de control de acceso son mecanismos de seguridad diseñados para proteger datos o recursos sensibles en sistemas informáticos, redes o aplicaciones, asegurando que solo usuarios o aplicaciones autorizados puedan acceder a ellos. Esto ayuda a reducir el riesgo de fugas de datos y vulnerabilidades de seguridad. En una puerta de enlace API, las políticas de control de acceso son un componente esencial. Como punto de entrada para todo el tráfico, la puerta de enlace API es responsable de recibir y reenviar todas las solicitudes de API. Por lo tanto, las políticas de control de acceso de la puerta de enlace API determinan directamente la seguridad y estabilidad de los servicios upstream.
Políticas de Control de Acceso Comunes en Apache APISIX
Apache APISIX ofrece un conjunto completo de políticas de control de acceso, soportando el protocolo de autenticación OAuth 2.0 e integrando varios servicios de autenticación externos como Keycloak, Ory Hydra, Okta, Auth0 y más. Además de soportar servicios de autenticación externos, APISIX también proporciona potentes métodos de autenticación internos. Combinado con el objeto Consumer de APISIX, puedes mezclar y combinar libremente plugins de autenticación, autorización, limitación de tasa, listas negras y listas blancas de IP para proteger tus API y prevenir eficazmente que solicitudes maliciosas dañen tus servicios API.
1. Control de Acceso Basado en IP
El control de acceso basado en IP es el método más simple y directo, que puede restringir el acceso a tu API solo a solicitudes provenientes de direcciones específicas.
Puedes usar el plugin ip-restriction de APISIX para habilitar esta función, que ofrece varias opciones de configuración, como listas de direcciones IP permitidas o denegadas, rangos de direcciones IP y mensajes de error devueltos al denegar solicitudes. Puedes configurar estas opciones según tus necesidades para lograr un control de acceso más granular. Vale la pena mencionar que el control de acceso basado en IP puede tener algunas limitaciones, ya que las direcciones IP pueden ser falsificadas o compartidas. Por lo tanto, al usar el plugin ip-restriction, es mejor combinarlo con otros plugins de control de acceso para mejorar la seguridad y flexibilidad de tu sistema.
2. Control de Acceso Basado en API Key
Este control de acceso es una estrategia muy común para el control de acceso a API. Su principio básico es autenticar y autorizar solicitudes a través de una API Key pregenerada, lo que puede agregar rápidamente mecanismos de autenticación a las API. Sin embargo, es importante proteger la API Key para evitar que se filtre y sufra ataques maliciosos.
El plugin key-auth de APISIX puede agregar fácilmente mecanismos de autenticación a tus API, agregando la clave a la cadena de consulta o encabezado para autenticación al enviar solicitudes. En la versión 3.1 y posteriores de APISIX, también admite el cifrado y almacenamiento de API Keys en etcd utilizando la configuración de campos de almacenamiento cifrado data_encryption
, lo que mejora aún más la seguridad de tu API.
3. Control de Acceso Basado en Token
Este método se implementa agregando un campo de autenticación que contiene un token en el encabezado de la solicitud. Un token es una clave, generalmente una cadena o número, que se utiliza para verificar si el remitente de una solicitud de API tiene permiso para acceder a la API. Normalmente, un token contiene la identidad y los permisos del usuario, lo que permite al servidor determinar si el usuario tiene permiso de acceso cuando inicia una solicitud de API y tomar decisiones de autorización o denegación apropiadas.
APISIX proporciona el plugin jwt-auth para utilizar esta estrategia de control de acceso, que admite opciones de configuración como la ubicación de almacenamiento del token, la validez del token, el algoritmo de firma JWT y las claves. Puedes configurar estas opciones según tus necesidades para cumplir con diferentes requisitos de autenticación.
4. Control de Acceso Basado en Ruta de Solicitud
El control de acceso basado en la ruta de solicitud se logra filtrando y comparando las rutas de solicitud para controlar el acceso a API, servicios o recursos específicos. Esta estrategia se utiliza comúnmente en escenarios que requieren un control de acceso granular sobre los recursos, como proteger datos sensibles o controlar el acceso de usuarios específicos a recursos específicos dentro del sistema.
El plugin uri-blocker de APISIX admite la configuración de listas de reglas regex para interceptar URIs de solicitud de usuarios, y configurar rejected_code
y rejected_msg
para especificar el código de estado HTTP y el cuerpo de respuesta devuelto después de una intercepción exitosa. Esto permite a los administradores controlar finamente los permisos de los usuarios y mejorar la seguridad y controlabilidad de las API.
5. Política de Control de Acceso Basada en ACL
ACL (Lista de Control de Acceso) es una política de control de acceso basada en listas que se utiliza para controlar los permisos de acceso de usuarios o grupos de usuarios a recursos. Su principio básico es definir una lista ACL para cada recurso, enumerando los usuarios o grupos de usuarios que tienen permiso para acceder al recurso. Cuando un usuario solicita acceso al recurso, su acceso se determina en función de la lista ACL correspondiente.
En APISIX, podemos usar el plugin consumer-restriction para habilitar esta función. Los administradores pueden controlar fácilmente qué usuarios o grupos de usuarios pueden acceder a recursos específicos y evitar que usuarios no autorizados envíen solicitudes a áreas sensibles, evitando fugas de datos sensibles.
Introducción al Escenario: Control de Acceso Más Granular
En escenarios de aplicaciones del mundo real, a menudo implementamos un control de acceso más granular para recursos que contienen datos sensibles. Por ejemplo, ahora tenemos dos usuarios, A y B, que utilizan los mismos métodos de autenticación internos, como key-auth o basic-auth. También queremos aplicar un control de acceso más granular al usuario B, prohibiéndole acceder a ciertas API.
Podemos usar el plugin consumer-restriction
de APISIX para un control más granular. Este plugin te permite establecer restricciones de acceso basadas en Route, Service o Consumer, y admite la configuración de cuatro valores de atributo type
:
consumer_name
: Restringe el acceso de Consumer a Route o Service enumerando elusername
del Consumer en una lista blanca o negra.consumer_group_id
: Restringe el acceso de Consumer a Route o Service enumerando elid
del Grupo de Consumer en una lista blanca o negra.service_id
: Restringe el acceso de Consumer a Service enumerando elid
del Service en una lista blanca o negra. Esto debe usarse junto con un plugin de autorización.route_id
: Restringe el acceso de Consumer a Route enumerando elid
de la Route en una lista blanca o negra.
En este escenario, podemos usar dos métodos de configuración para evitar que el usuario B acceda a un recurso API específico.
Configuración de la Política de Control de Acceso en Route
- Primero, necesitamos crear dos objetos Consumer en APISIX y habilitar el plugin
basic-auth
, con nombres userA y userB.
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d '
{
"username": "userA",
"plugins": {
"basic-auth": {
"username":"userA",
"password": "123456"
}
}
}'
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d '
{
"username": "userB",
"plugins": {
"basic-auth": {
"username":"userB",
"password": "123456"
}
}
}'
- Luego habilitamos y configuramos la propiedad
whitelist
deconsumer-restriction
en la ruta donde necesitamos aplicar la restricción y agregamos elusername
del consumer userA creado previamente. De esta manera, la ruta solo aceptará solicitudes de userA.
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -d '
{
"uri": "/get",
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
},
"plugins": {
"basic-auth": {},
"consumer-restriction": {
"whitelist": [
"userA"
]
}
}
}'
- Envía solicitudes de acceso por separado usando userA y userB.
curl -u userA:123456 http://127.0.0.1:9080/get -i
HTTP/1.1 200 OK
curl -u userB:123456 http://127.0.0.1:9080/get -i
HTTP/1.1 403 Forbidden
...
{"message":"The consumer_name is forbidden."}
El resultado indica que userB ha sido restringido de acceder al recurso API.
Configuración de Políticas de Control de Permisos en Consumer
- Primero, configuraremos una ruta cuyo ID es
forbidden-userB
y habilitaremos el pluginbasic-auth
.
curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -d '
{
"id": "forbidden-userB",
"uri": "/get",
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
},
"plugins": {
"basic-auth": {}
}
}'
- Crea dos objetos Consumer y habilita el plugin
basic-auth
. Nota que necesitamos configurar el pluginconsumer-restriction
para refinar las políticas de control de permisos para userB.
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d '
{
"username": "userA",
"plugins": {
"basic-auth": {
"username":"userA",
"password": "123456"
}
}
}'
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d '
{
"username": "userB",
"plugins": {
"basic-auth": {
"username":"userB",
"password": "123456"
},
"consumer-restriction": {
"type": "route_id",
"blacklist": [
"forbidden-userB"
],
"rejected_code": 403
}
}
}'
- Envía solicitudes usando userA y userB por separado.
curl -u userA:123456 http://127.0.0.1:9080/get -i
HTTP/1.1 200 OK
curl -u userB:123456 http://127.0.0.1:9080/get -i
HTTP/1.1 403 Forbidden
...
{"message":"The route_id is forbidden."}
Al examinar los resultados de las pruebas, podemos verificar que las solicitudes de userB han sido efectivamente limitadas.
Conclusión
Este artículo presenta las políticas de control de permisos comúnmente utilizadas en APISIX y muestra cómo habilitarlas y configurarlas en APISIX utilizando un escenario clásico. El control de permisos es una estrategia prevalente en las puertas de enlace API. APISIX no solo ofrece un conjunto completo de plugins listos para usar para autenticación, sino que también proporciona un amplio soporte en áreas como seguridad, gestión de tráfico y observabilidad. Al seleccionar y configurar tus reglas de políticas de control de permisos, puedes fortalecer fácilmente la seguridad de tus API.