Autenticación de API Gateway

Yong Qian

November 25, 2022

Technology

Importancia de la Autenticación y Autorización para las Pasarelas de API

La función principal de una pasarela de API se puede resumir como conectar a los consumidores de API con los proveedores de API.

En la práctica, excepto por algunas API que permiten acceso anónimo, los proveedores suelen restringir a los consumidores: solo los consumidores elegibles pueden acceder a la API. Además, los proveedores pueden no tener la misma política de acceso para diferentes consumidores, por ejemplo, los consumidores A y B pueden acceder a la API /send_mail, pero la frecuencia de llamadas por minuto debe calcularse de manera diferente.

A partir de los dos puntos anteriores, podemos ver que es crucial identificar y verificar la identidad de los consumidores de API a nivel de la pasarela de API. A continuación, presentaremos cómo la pasarela de API de código abierto Apache APISIX implementa la autenticación para los consumidores y los métodos de autenticación ampliamente adoptados por las empresas, y luego explicaremos cómo el sistema de autenticación de usuarios de APISIX puede usarse en conjunto con otras características de seguridad para mejorar aún más la protección de seguridad de las pasarelas de API.

Autenticación de la pasarela de API

Autenticación y Autorización de Apache APISIX

Los proxies HTTP tradicionales solo pueden identificar al solicitante basándose en medios rudimentarios como el dominio de la solicitud y la IP del cliente, lo cual no es suficiente para una pasarela de API. Necesitamos métodos de autenticación más refinados para abordar requisitos comerciales cada vez más complejos. Una de las principales ventajas de APISIX sobre los proxies tradicionales es su capacidad flexible de extensión mediante plugins, incluyendo una colección de plugins para la autenticación de usuarios que se pueden dividir en dos categorías según el método de implementación:

  1. Interfaz con Servicios de Autenticación Externos

Servicio de autenticación externa

  1. Autenticación Interna de la Pasarela mediante el Objeto Consumer Diseñado por APISIX

Autenticación interna

Estos dos métodos de autenticación se presentarán a continuación.

Interfaz con Servicios de Autenticación Externos

Antes de que una empresa adopte una pasarela de API, a menudo hay un servicio de autenticación separado implementado en el sistema. Entonces, ¿cómo podemos conectar APISIX con el servicio de autenticación existente? APISIX proporciona una serie de plugins que funcionan interfazando con varios servicios de autenticación externos y delegando en ellos la tarea de completar la autenticación.

Por ejemplo, podemos usar el plugin openid-connect para conectar con cualquier servicio de autenticación que admita el protocolo OIDC. A continuación se muestra una configuración de ejemplo para conectar con el servicio keycloak:

curl http://127.0.0.1:9180/apisix/admin/routes -H "X-Api-Key: your-API-key" -XPOST -d '
{
    "uri":"/*",
    "plugins":{
        "openid-connect":{
            "client_id":"apisix", // Generado cuando keycloak crea un cliente
            "client_secret":"d5c42c50-3e71-4bbe-aa9e-31083ab29da4",
            "discovery":"http://keycloak:8080/auth/realms/apisix_test_realm/.well-known/openid-configuration", // Endpoint OpenID de keycloak
            "scope":"openid profile",
            "bearer_only":false,
            "realm":"apisix_test_realm",
            "introspection_endpoint_auth_method":"client_secret_post",
            "redirect_uri":"http://127.0.0.1:9080/"
        }
    },
    "upstream":{
        ...
    }
}'

Autenticación Interna de la Pasarela

Consumer

Consumer

Cuando las solicitudes de diversas fuentes llegan a la pasarela de API, la pasarela debe identificar a estos llamadores. Apache APISIX propone el concepto de "Consumer" para representar a los llamadores de un cierto tipo de servicio.

El objeto Consumer requiere la configuración de un plugin de autenticación para su uso. Tomemos como ejemplo el plugin más simple, key-auth:

$ curl http://127.0.0.1:9180/apisix/admin/consumers  -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
    "username": "jack",
    "plugins": {
        "key-auth": {
            "key": "auth-jack"
        }
}'

La configuración anterior significa que cuando la solicitud lleva la clave especificada (auth-jack), la solicitud actual se asociará con el Consumer - jack. Como puede ver, el plugin de autenticación configurado en el Consumer es en realidad una credencial de identidad bajo un mecanismo de autenticación especificado. En el plugin key-auth, la clave es la credencial que identifica a un consumidor, similar al nombre de usuario y contraseña del plugin basic-auth.

Configuración del Plugin de Autenticación para la Ruta

Una vez que hemos asociado la información de credenciales con un consumidor específico a través del Consumer, también debemos habilitar el plugin de autenticación en la ruta correspondiente:

$ curl http://127.0.0.1:9180/apisix/admin/routes/orders -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
    "uri": "/orders",
    "plugins": {
        "key-auth": {
            "header": "Authorization"
        }
    }
}'

La configuración anterior significa que el plugin key-auth está habilitado en la ruta /orders, y el efecto de autenticación es el siguiente:

$ curl http://127.0.0.1:9080/orders -H 'Authorization: auth-jack' -i
HTTP/1.1 200 OK
...
$ curl http://127.0.0.1:9080/orders -H 'Authorization: wrong-key' -i
HTTP/1.1 401 Unauthorized
...
{"message":"Invalid API key in request"}

Cuando una solicitud de un usuario llega a esta ruta, APISIX intentará obtener la clave proporcionada por el usuario a través del encabezado Authorization. Si no se obtiene, o la clave obtenida no es legítima, la solicitud será rechazada directamente por la pasarela, protegiendo así el servicio upstream.

Se puede ver que en los dos métodos de autenticación anteriores, el plugin de autenticación es el núcleo de todo el sistema, cuya riqueza afecta directamente la elección de los usuarios para implementar la autenticación en las pasarelas de API. A continuación se presentan algunos de los métodos de autenticación principales y sus respectivas ventajas y desventajas para su referencia.

Métodos de Autenticación Principales

La autenticación y autorización, un mecanismo básico que ha existido desde que entramos en el mundo de la informática, ha evolucionado a un campo muy diverso después de tantas iteraciones a lo largo de los años. El mecanismo de plugins de APISIX ha reducido enormemente el costo de desarrollo para implementar varios métodos de autenticación. A continuación se presentan algunos de los métodos de autenticación principales ya admitidos por APISIX:

Key Auth

Key Auth es el más simple de todos los plugins de autenticación, pero tiene un amplio conjunto de aplicaciones en escenarios del mundo real, como licencias para software de pago, tokens para identificar desarrolladores en plataformas de API abiertas, etc., que pueden implementarse fácilmente con Key Auth. Además, basado en la capacidad de configuración y asignación completamente dinámica de APISIX, las claves pueden crearse y revocarse rápidamente, entrando en vigor en tiempo real.

Basic Auth

Basic Auth es un método de autenticación basado en nombre de usuario y contraseña, que se usa a menudo en escenarios de inicio de sesión web. Por ejemplo, el panel de administración de un sitio web puede usarse después de que el administrador inicie sesión, donde podemos usar Basic Auth para autenticar.

LDAP

LDAP (Lightweight Directory Access Protocol) es un protocolo ligero de acceso a directorios basado en el estándar X.500, que proporciona control de acceso y mantenimiento de directorios de información distribuida a través del protocolo IP. Con LDAP, los desarrolladores de aplicaciones y operaciones pueden controlar el acceso de los usuarios a los recursos a un nivel granular. Con el plugin ldap-auth de APISIX, puede conectarse fácilmente con plataformas que implementan el protocolo LDAP, como Active Directory de Microsoft o OpenLDAP Server para plataformas Linux, para controlar finamente el acceso de los consumidores a rutas específicas.

OIDC

OpenID es un sistema de autenticación en línea descentralizado. Para sitios que admiten OpenID, los usuarios no necesitan recordar tokens de autenticación tradicionales como nombres de usuario y contraseñas. En su lugar, solo necesitan registrarse previamente en un sitio web que actúe como proveedor de identidades (IdP) de OpenID, y luego pueden usar esta cuenta para iniciar sesión en todas las aplicaciones que se conectan con ese proveedor, por ejemplo, para autenticar a los usuarios de nuestro propio sistema a través de las cuentas de servicios conocidos como Google o Facebook.

Para OIDC, APISIX proporciona el plugin openid-connect, que puede usarse para conectarse con servicios de autenticación que admiten el protocolo OIDC.

Forward Auth

Cuando el plugin de autenticación estándar de APISIX no satisface sus necesidades actuales, o si ya se ha implementado un servicio de autenticación dedicado y no estándar en su sistema, puede considerar usar el plugin forward-auth. Usando este plugin, puede reenviar las solicitudes de los usuarios al servicio de autenticación a través de HTTP y devolver errores personalizados o redirigir a los usuarios a la página de autenticación si el servicio de autenticación responde con un estado no normal (código de error distinto de 20x).

Con el poder del plugin forward-auth, la lógica de autenticación y autorización puede transferirse de manera muy inteligente a un servicio externo dedicado y no estándar.

Vinculación con Otros Plugins Después de la Autenticación

La autenticación de usuarios es solo el primer paso para asegurar la API con APISIX. Combinar las capacidades de autenticación con otros plugins de seguridad amplificará aún más las capacidades de seguridad de la pasarela.

ACL (consumer-restriction)

En un sistema backend complejo, puede haber algunas API que tengan restricciones de seguridad más altas que otras, que requieren no solo bloquear a los usuarios anónimos, sino también restringir a los usuarios autenticados, por ejemplo, permitiendo solo a los usuarios en la lista blanca acceder a la API de gestión de usuarios.

Lista blanca

En este caso, podemos usar el plugin consumer-restriction proporcionado por APISIX para implementar el mecanismo de control de acceso.

$ curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: your-API-key' -X POST -i -d '
{
    "uri": "/api/v1/users/admin",
    "plugins": {
        "key-auth": {},
        "consumer-restriction": {
            "whitelist": [
                "Rose",
                "Peter
            ]
        }
    },
    "upstream": {
        ...
    },
}'

La ruta anterior restringe la ruta /api/v1/users/admin para requerir autenticación mediante key auth a través de los plugins key-auth y consumer-restriction, y solo Rose y Peter pueden acceder a ella.

Limitación de Tasa (limit-count)

Anteriormente describimos que puede asociar credenciales de usuario con consumidores configurando plugins de autenticación en el Consumer, pero el hecho es que los objetos Consumer de APISIX pueden montar no solo plugins de autenticación, sino también cualquier plugin como Route y Service.

Por ejemplo, en la aplicación real, la política de limitación de tasa a menudo no es estática, sino personalizada. Es común que se exija que diferentes llamadores de nivel de servicio tengan diferentes políticas de limitación de tasa de API. Sin embargo, tal demanda no puede resolverse montando el plugin de limitación de tasa en la ruta. Por lo tanto, necesitamos montar el plugin de limitación de tasa en el Consumer y especificar una política de limitación de tasa dirigida para cada consumidor.

$ curl http://127.0.0.1:9180/apisix/admin/consumers  -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
    "username": "jack",
    "plugins": {
        "key-auth": {
            "key": "jack"
        },
        "limit-count": {
            "count": 200,
            "time_window": 60,
            "rejected_code": 503,
            "key": "$consumer_name",
        }
}'
$ curl http://127.0.0.1:9180/apisix/admin/consumers  -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
    "username": "rose",
    "plugins": {
        "key-auth": {
            "key": "rose"
        },
        "limit-count": {
            "count": 1000,
            "time_window": 60,
            "rejected_code": 503,
            "key": "$consumer_name",
        }
}'

Con la configuración anterior, especificamos diferentes políticas de limitación de tasa para jack y rose, con rose teniendo una cuota de solicitudes más alta de 1000 en 60 segundos, mientras que jack solo tiene 200.

Resumen

Como una capacidad indispensable de las pasarelas de API, la autenticación y autorización es uno de los factores importantes que los usuarios consideran al seleccionar pasarelas de API.

Apache APISIX, la pasarela de código abierto presentada en este artículo, cubre todos los principales métodos de autenticación y puede satisfacer las necesidades de autenticación y autorización de los usuarios empresariales. APISIX también tiene las siguientes ventajas:

  • Plugins de autenticación listos para usar y ricos en funciones
  • Soporte para métodos de autenticación internos y externos, que los usuarios pueden elegir libremente
  • Soporte para desarrollo secundario, fácil de conectar con centros de autenticación personalizados

Estos beneficios pueden ayudar a las empresas a implementar más fácilmente la autenticación y autorización a nivel de pasarela y fortalecer la seguridad de la API.

Bienvenido a aprender más sobre Apache APISIX. Puede contactarnos en https://api7.ai/contact.

Tags: