Comment utiliser Secret Manager avec API Gateway
Shirui Zhao
January 13, 2023
Qu'est-ce qu'un Secret ?
Dans un environnement informatique, un secret est une information d'identification privilégiée non humaine, généralement utilisée par les systèmes et les applications pour l'authentification ou comme entrée pour les algorithmes de chiffrement. Par exemple, les mots de passe nécessaires pour connecter un programme à une base de données, les clés/certificats pour la communication chiffrée, tout cela appartient aux secrets.
Les types courants de secrets incluent :
- Clés de chiffrement
- Informations d'identification pour accéder aux services cloud
- Clés d'API (Application Programming Interface)
- Jetons d'accès
- Clés SSH (Secure Shell)
Gestionnaire de Secrets
Le Gestionnaire de Secrets stocke, récupère, fait tourner et audite les secrets tout au long de leur cycle de vie. HashiCorp Vault est l'un des services de gestion de secrets les plus couramment utilisés, et son principe de fonctionnement est le suivant (image du site officiel de HashiCorp) :
En plus de HashiCorp Vault, les fournisseurs de cloud tels que AWS, Google et Azure proposent également des services de gestion de secrets.
L'utilisation d'un Gestionnaire de Secrets pour construire des applications améliore non seulement la sécurité, mais offre également les fonctionnalités suivantes :
- Permet de mettre à jour facilement les secrets sur plusieurs machines sans affecter l'application.
- Les développeurs n'ont pas besoin de se préoccuper du stockage des secrets et peuvent se concentrer davantage sur la logique métier elle-même.
- La rotation et la révocation des secrets peuvent être effectuées sans redéployer ou interrompre les applications actives.
- Le Gestionnaire de Secrets fournit des journaux d'audit flexibles et détaillés qui peuvent suivre l'historique de tous les accès utilisateurs et répondre plus facilement aux exigences d'audit et de conformité.
Utilisation du Gestionnaire de Secrets dans l'API Gateway
En tant que point d'entrée du trafic métier, l'API Gateway contient souvent une grande quantité d'informations secrètes, telles que les clés d'API et les jetons pour l'authentification. Par conséquent, il est essentiel d'intégrer un Gestionnaire de Secrets dans l'API Gateway.
Scénarios d'utilisation des Secrets dans l'API Gateway
Key Auth
est une méthode d'authentification simple dans l'API Gateway. Les utilisateurs doivent prédéfinir une clé, et lorsque le client effectue des requêtes API, la clé prédéfinie est écrite dans l'en-tête de la requête ou accédée en tant que paramètre de requête pour passer l'authentification. Cependant, les fuites de clés sont courantes, et les clés sont souvent stockées dans les fichiers de configuration ou enregistrées en tant que variables dans le code. Si les clés ne sont pas correctement stockées, elles pourraient même apparaître dans des dépôts de code publics comme GitHub, posant une menace importante pour la sécurité. Les administrateurs mettent souvent à jour ces clés régulièrement pour éviter des dommages graves causés par des fuites de clés. Cependant, pour certaines clés statiques, la mise à jour individuelle du fichier de configuration sur chaque machine peut également poser une menace importante pour la stabilité du service.
Intégration du Gestionnaire de Secrets dans l'API Gateway
En intégrant un Gestionnaire de Secrets dans l'API Gateway, la clé prédéfinie pour l'authentification Key Auth
peut être stockée dans le service de gestion de secrets, ce qui permet de résoudre efficacement une série de problèmes causés par les fuites de clés. L'API Gateway n'est qu'un utilisateur de la clé, et la valeur réelle de la clé est stockée dans le service externe de gestion de secrets. De plus, l'API Gateway ne conserve qu'une référence à la clé, donc même si l'API Gateway est piratée, la clé réelle ne peut pas être obtenue à partir du code ou du fichier de configuration. En outre, si vous devez mettre à jour la valeur de la clé, vous n'avez besoin de la mettre à jour que dans le Gestionnaire de Secrets sans modifier le code ou la configuration de l'API Gateway, ce qui évite également de redémarrer l'API Gateway.
Nous utiliserons Apache APISIX comme exemple ci-dessous pour montrer comment utiliser le Gestionnaire de Secrets pour stocker la clé prédéfinie pour Key Auth
dans l'API Gateway.
Exemple d'utilisation d'Apache APISIX avec un Gestionnaire de Secrets en pratique
Apache APISIX est une API Gateway dynamique, en temps réel et haute performance qui fournit des centaines de fonctionnalités, telles que l'équilibrage de charge, l'amont dynamique, la mise en production progressive, le routage fin, la limitation de débit, la dégradation de service, le disjoncteur, l'authentification et l'observabilité.
Dans la version 3.1.0, Apache APISIX a introduit APISIX Secret
pour intégrer différents services de gestion de secrets. Sa séquence de travail est la suivante :
Ci-dessous, nous utilisons Vault comme service de gestion de secrets. Nous utiliserons l'authentification Key Auth
pour illustrer comment utiliser un Gestionnaire de Secrets pour sauvegarder les clés dans Apache APISIX.
Création de clés dans Vault
Avant de créer la clé, vous devez démarrer le service Vault. Comme cette section partage les meilleures pratiques pour utiliser Vault dans l'écosystème Apache APISIX, la configuration de Vault elle-même n'est pas décrite en détail et peut être trouvée ici.
Pour créer la clé correspondante dans Vault, vous pouvez utiliser la commande suivante :
vault secrets enable -version=1 -path=apisix kv
vault kv put apisix/jack auth-key=secret-key
Après avoir exécuté la commande ci-dessus, vous trouverez une clé nommée auth-key
sous le chemin apisix/jack
, avec une valeur de secret-key
.
Configuration dans APISIX
Tout d'abord, ajoutez la ressource secrète via l'Admin API
et configurez l'adresse ainsi que d'autres informations de connexion pour Vault :
- L'identifiant de la ressource secrète APISIX est "gateway", voir https://apisix.apache.org/docs/apisix/terminology/secret/#usage-1
- Le champ
prefix
est le chemin de la clé dans Vault, et le champtoken
est le jeton 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"
}'
Ensuite, utilisez le plugin key-auth
pour créer un consommateur et effectuer l'authentification Key Auth pour la route ou le service correspondant. Le champ key fait référence à la ressource secrète APISIX :
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"
}
}
}'
Via les deux étapes ci-dessus, lorsque la requête de l'utilisateur atteint un plugin key-auth
, le composant Secret
appellera le Gestionnaire de Secrets configuré par l'utilisateur via l'interface fournie pour obtenir la valeur réelle de la clé dans Vault. Si la valeur de la clé n'est pas trouvée, le plugin enregistrera l'erreur et ne pourra pas effectuer la validation Key Auth
.
Ensuite, créez une Route pour effectuer l'authentification 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
}
}
}'
Enfin, envoyez une requête sans clé à l'API Gateway pour vérifier le résultat :
curl -i "http://127.0.0.1:9080/ip"
Le résultat est le suivant :
HTTP/1.1 401 Unauthorized
...
{"message":"Missing API key found in request"}
Puis, envoyez une requête avec la clé à l'API Gateway pour vérifier le résultat :
curl -i "http://127.0.0.1:9080/ip" -H 'apikey: secret-key'
Le résultat est similaire à ce qui suit :
HTTP/1.1 200 OK
...
{
"origin": "127.0.0.1, 59.172.90.243"
}
En outre, Apache APISIX a étendu les variables d'environnement en un service simple de gestion de secrets, et le jeton APISIX pour se connecter à Vault peut également être stocké dans les variables d'environnement. Ainsi, avant de démarrer APISIX, vous pouvez définir les variables d'environnement avec la commande suivante :
export VAULT_TOKEN="root"
Référencez les variables d'environnement lors de l'ajout de la ressource 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"
}'
Grâce aux étapes ci-dessus, vous pouvez stocker la clé nécessaire pour l'authentification Key Auth
dans Vault au lieu de l'afficher en texte clair lors de la configuration du plugin.
Conclusion
Dans l'API Gateway, il y a une grande quantité d'informations secrètes. L'utilisation d'un Gestionnaire de Secrets pour gérer les secrets garantit qu'aucune information secrète en texte clair ne se trouve dans l'API Gateway, améliorant ainsi efficacement la sécurité et la stabilité de l'API Gateway. En tant que l'API Gateway open-source la plus active au monde, Apache APISIX prend également en charge les gestionnaires de secrets de manière significative. Cet article utilise également l'authentification Key Auth
pour illustrer comment utiliser un Gestionnaire de Secrets pour gérer les informations de clé dans APISIX.
Pour plus d'informations sur l'API gateway, veuillez visiter notre blog ou nous contacter.