Cómo usar Secret Manager con API Gateway

Shirui Zhao

January 13, 2023

Technology

¿Qué es un Secret?

En un entorno de TI, un secret es una credencial privilegiada no humana, generalmente utilizada por sistemas y aplicaciones para autenticación o como entrada para algoritmos de cifrado. Por ejemplo, las contraseñas necesarias para conectar un programa a una base de datos, las claves/certificados para comunicación cifrada, todos pertenecen a un secret.

Los tipos comunes de secret incluyen:

  • Claves de cifrado
  • Credenciales de acceso a servicios en la nube
  • Claves de API (Application Programming Interface)
  • Tokens de acceso
  • Claves SSH (Secure Shell)

Secret Manager

El Secret Manager almacena, recupera, rota y audita los secretos a lo largo de su ciclo de vida. HashiCorp Vault es uno de los servicios de Secret Manager más utilizados, y su principio de funcionamiento es el siguiente (imagen del sitio web oficial de HashiCorp):

Secret Manager

Además de HashiCorp Vault, proveedores de nube como AWS, Google y Azure también ofrecen servicios de Secret Manager.

Usar un Secret Manager para construir aplicaciones no solo mejora la seguridad, sino que también proporciona las siguientes funciones:

  • Permite que los secretos se actualicen fácilmente en múltiples máquinas sin afectar la aplicación.
  • Los desarrolladores no necesitan prestar demasiada atención al almacenamiento de secretos y pueden enfocarse más en la lógica del negocio en sí.
  • La rotación y revocación de secretos se puede realizar sin redeployar o interrumpir aplicaciones activas.
  • El Secret Manager proporciona registros de auditoría flexibles y detallados que pueden rastrear el historial de acceso de todos los usuarios y cumplir más fácilmente con los requisitos de auditoría y cumplimiento.

Uso de Secret Manager en API Gateway

Como la entrada del tráfico de negocio, el API Gateway a menudo contiene una gran cantidad de información secreta, como claves de API y tokens para autenticación. Por lo tanto, es vital integrar un Secret Manager en el API Gateway.

Escenarios de uso de Secret en API Gateway

Key Auth es un método de autenticación simple en el API Gateway. Los usuarios necesitan preestablecer una clave, y cuando el cliente realiza solicitudes de API, la clave preestablecida se escribe en el encabezado de la solicitud correspondiente o se accede como un parámetro de la solicitud para pasar la autenticación. Sin embargo, las fugas de claves son comunes, y las claves a menudo se almacenan en archivos de configuración o se guardan como variables en el código. Si las claves no se almacenan correctamente, incluso podrían aparecer en repositorios de código públicos como GitHub, lo que representa una amenaza significativa para la seguridad. Los administradores a menudo actualizan estas claves regularmente para evitar daños graves causados por fugas de claves. Sin embargo, para algunas claves estáticas, actualizar individualmente el archivo de configuración en cada máquina también puede representar una amenaza significativa para la estabilidad del servicio.

Integración de Secret Manager en API Gateway

Al integrar un Secret Manager en el API Gateway, la clave preestablecida para la autenticación Key Auth puede almacenarse en el servicio de Secret Manager, lo que resuelve efectivamente una serie de problemas causados por fugas de claves. El API Gateway es solo un usuario de la clave, y el valor real de la clave se almacena en el servicio externo de Secret Manager. Además, el API Gateway solo mantiene una referencia a la clave, por lo que incluso si el API Gateway es hackeado, no se puede obtener la clave real del código o del archivo de configuración. Además, si necesita actualizar el valor de la clave, solo necesita actualizarlo en el Secret Manager sin modificar el código o la configuración del API Gateway, lo que también evita reiniciar el API Gateway.

api gateway Secret Manager

A continuación, usaremos Apache APISIX como ejemplo para mostrar cómo usar el Secret Manager para almacenar la clave preestablecida para Key Auth en el API Gateway.

Ejemplo práctico de uso de Apache APISIX en Secret Manager

Apache APISIX es un API Gateway dinámico, en tiempo real y de alto rendimiento que proporciona cientos de funciones, como balanceo de carga, upstream dinámico, canary release, enrutamiento granular, limitación de tasa, degradación de servicio, circuit breaker, autenticación y observabilidad.

En la versión 3.1.0, Apache APISIX introdujo APISIX Secret para integrar diferentes servicios de Secret Manager. Su secuencia de trabajo es la siguiente:

apisix Secret Manager

A continuación, usaremos Vault como el servicio de Secret Manager. Usaremos la autenticación Key Auth para ilustrar cómo usar un Secret Manager para guardar claves en Apache APISIX.

Creación de claves en Vault

Antes de crear la clave, debe iniciar el servicio Vault. Dado que esta sección comparte las mejores prácticas para usar Vault en el ecosistema de Apache APISIX, la configuración de Vault en sí no se describe en detalle y se puede encontrar aquí.

Para crear la clave correspondiente en Vault, puede usar el siguiente comando:

vault secrets enable -version=1 -path=apisix kv

vault kv put apisix/jack auth-key=secret-key

Después de ejecutar el comando anterior, encontrará una clave llamada auth-key bajo la ruta apisix/jack, con un valor de secret-key.

Configuración en APISIX

Primero, agregue el recurso secret a través de la Admin API y configure la dirección y otra información de conexión para Vault:

  1. El ID del recurso APISIX Secret es "gateway", consulte https://apisix.apache.org/docs/apisix/terminology/secret/#usage-1
  2. El campo prefix es la ruta de la clave en Vault, y el campo token es el token de Vault.
curl http://127.0.0.1:9180/apisix/admin/secrets/vault/gateway \
-H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
  "uri": "https://127.0.0.1:8200",
  "prefix": "apisix",
  "token": "hvs.chjDFWvZRcihoq2vpSsVenmR"
}'

Luego, use el plugin key-auth para crear un consumidor y realizar la autenticación Key Auth para la ruta o servicio correspondiente. El campo key hace referencia al recurso APISIX Secret:

curl http://127.0.0.1:9180/apisix/admin/consumers \
-H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
  "username": "jack",
  "plugins": {
    "key-auth": {
      "key": "$secret://vault/gateway/jack/auth-key"
    }
  }
}'

A través de los dos pasos anteriores, cuando la solicitud del usuario llega a un plugin key-auth, el componente Secret llamará al Secret Manager configurado por el usuario a través de la interfaz proporcionada para obtener el valor real de la clave en Vault. Si no se encuentra el valor de la clave, el plugin registrará el error y no podrá realizar la validación Key Auth.

Luego, cree una Ruta para realizar la autenticación Key Auth:

curl -i "http://127.0.0.1:9180/apisix/admin/routes" -H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
  "id": "getting-started-ip",
  "uri": "/ip",
  "plugins": {
    "key-auth": {}
  },
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "httpbin.org:80": 1
    }
  }
}'

Finalmente, envíe una solicitud sin clave al API Gateway para verificar el resultado:

curl -i "http://127.0.0.1:9080/ip"

El resultado es el siguiente:

HTTP/1.1 401 Unauthorized
...

{"message":"Missing API key found in request"}

Y luego, envíe una solicitud con la clave al API Gateway para verificar el resultado:

curl -i "http://127.0.0.1:9080/ip" -H 'apikey: secret-key'

El resultado es similar al siguiente:

HTTP/1.1 200 OK
...

{
  "origin": "127.0.0.1, 59.172.90.243"
}

Además, Apache APISIX ha expandido las variables de entorno en un servicio simple de Secret Manager, y el token de APISIX para conectarse a Vault también se puede almacenar en variables de entorno. Por lo tanto, antes de iniciar APISIX, puede configurar las variables de entorno con el siguiente comando:

export VAULT_TOKEN="root"

Haga referencia a las variables de entorno al agregar el recurso Secret:

curl http://127.0.0.1:9180/apisix/admin/secrets/vault/1
-H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
  "uri": "https://127.0.0.1:8200",
  "prefix": "apisix",
  "token": "$ENV://VAULT_TOKEN"
}'

A través de los pasos anteriores, puede almacenar la clave necesaria para la autenticación Key Auth en Vault en lugar de mostrarla en texto plano al configurar el plugin.

Conclusión

En el API Gateway, hay una gran cantidad de información secreta. Usar un Secret Manager para gestionar secretos puede garantizar que no haya información secreta en texto plano en el API Gateway, mejorando efectivamente la seguridad y estabilidad del API Gateway. Como el API Gateway de código abierto más activo del mundo, Apache APISIX también admite ampliamente los secret managers. Este artículo también utiliza la autenticación Key Auth para ilustrar cómo usar un Secret Manager para gestionar la información de claves en APISIX.

Para obtener más información sobre el API gateway, visite nuestros blogs o contáctenos.

Tags: