civil-and-structural-engineering
Comment utiliser API Gateway avec des fonctions sans serveur pour des points d'extrémité sécurisés
Table of Contents
Introduction : Pourquoi combiner API Gateway avec des fonctions sans serveur ?
Les applications modernes comptent sur les API pour exposer les données et les fonctionnalités aux services internes, aux intégrations de partenaires et aux utilisateurs finaux. Sans couche de sécurité robuste, ces paramètres deviennent des cibles attrayantes pour les attaques non autorisées d'accès, d'exfiltration de données et de déni de service. L'association d'une passerelle API avec des fonctions sans serveur offre un modèle éprouvé pour construire des API sécurisées, évolutives et rentables. La passerelle agit comme un cop traffic centralisé, faisant appliquer l'authentification, le throttling, la validation des requêtes et la journalisation avant que toute requête n'atteigne votre logique d'affaires.
Dans ce guide élargi, vous apprendrez les concepts de base de API Gateway et de fonctions sans serveur, les stratégies d'intégration étape par étape, les meilleures pratiques pour durcir les paramètres, et les considérations du monde réel pour les déploiements de production.
Comprendre la passerelle de l'API : plus qu'un proxy inversé
Une passerelle API se situe entre les clients et les services de backend, interceptant chaque demande. Bien que sa fonction de base soit l'acheminement, les passerelles modernes offrent un ensemble riche de fonctionnalités qui ont une incidence directe sur la sécurité et l'excellence opérationnelle :
- Demander l'authentification et l'autorisation[ – vérifier l'identité à l'aide des clés API, OAuth 2.0, OpenID Connect ou JWT.
- Gestion des trafics – imposer des limites de taux, des restrictions et des quotas d'utilisation pour prévenir les abus.
- Transformation de la demande/réponse – réécrire des chemins, modifier des en-têtes ou des charges utiles au format avant de les transmettre.
- Validation d'entrée et application du schéma – rejeter les requêtes malformées avant qu'elles n'atteignent votre fonction.
- Logage centralisé et surveillance – capture des données de mesure, de registre et de trace pour la vérification et le débogage.
- Partage de ressources d'origine de la crise (CORS) – configurer les origines, les méthodes et les en-têtes autorisés.
Les principaux fournisseurs de services cloud offrent des services de passerelle gérés : Amazon API Gateway, Gestion des API d'Azure et Google Cloud API Gateway. Des solutions de rechange open-source comme Kong et Tyk peuvent fonctionner sur votre propre infrastructure, mais nécessitent des frais généraux plus opérationnels.
Fonctions sans serveur : calculez sans serveur les événements
Les fonctions sans serveur (par exemple AWS Lambda, Azure Functions, Google Cloud Functions) vous permettent d'exécuter le code en réponse aux requêtes HTTP, aux modifications de base de données, aux téléchargements de fichiers ou aux événements programmés. Le fournisseur évalue automatiquement les instances de zéro à des milliers de secondes, et vous ne payez que pour le temps de calcul consommé (généralement mesuré en millisecondes).
- Apatridie – les fonctions ne doivent pas compter sur la mémoire ou le disque local au-delà du cycle de vie d'une requête.
- Cold starts – la première invocation après une période d'inactivité peut avoir une latence plus élevée.
- Environnement d'exécution – chaque invocation est exécutée dans un conteneur isolé, mais les dépendances partagées doivent être corrigées.
- La gestion des clés de sécurité – Les clés API, les identifiants de base de données et les jetons ne doivent jamais être codés en dur. Utilisez des variables d'environnement ou un gestionnaire de secrets (p. ex., AWS Secrets Manager, Azure Key Vault).
Comme les fonctions sans serveur sont légères et concentrées, elles sont un excellent ajustement pour le --backend pour le modèle frontend et les micro-API qui effectuent une seule tâche (par exemple, l'enregistrement des utilisateurs, le redimensionnement d'image, le traitement des paiements).
Intégration étape par étape : API Gateway + fonction sans serveur
Pour construire un paramètre sécurisé, il faut relier trois composants : la passerelle, la fonction et le mécanisme d'authentification/autorisation. Les étapes suivantes supposent que vous utilisez AWS (Amazon API Gateway + Lambda), mais les concepts s'appliquent à tout fournisseur.
Étape 1: Créer et durcir votre fonction sans serveur
Écrivez votre fonction dans un temps d'exécution pris en charge (Node.js, Python, Go, etc.). Gardez-la apatride et idémpotent lorsque possible. Implémentez la validation d'entrée au niveau de la fonction comme mesure de défense en profondeur.
exports.handler = async (event) => {
const body = JSON.parse(event.body);
if (!body.email || !body.password) {
return { statusCode: 400, body: JSON.stringify({ error: 'Missing fields' }) };
}
// … business logic …
};
Configurez un rôle IAM serré pour la fonction, n'accordant que les permissions dont elle a besoin (par exemple, lecture/écriture DynamoDB, lecture S3). N'assigner jamais l'accès complet à l'administrateur. Utilisez des variables d'environnement pour des secrets – ne jamais les mettre dans le paquet de déploiement.
Étape 2: Configurer la passerelle de l'API
Créez une API REST ou HTTP dans votre fournisseur de cloud. Définissez les ressources et les méthodes (GET, POST, PUT, DELETE). Pour chaque méthode, pointez l'intégration à votre fonction (par exemple, une fonction Lambda via ARN). Activez CORS si votre API sera consommée par les navigateurs web. Configurez la validation de la demande au niveau de la passerelle pour rejeter les requêtes qui échouent les vérifications de schéma avant qu'elles n'invoquent la fonction.
Étape 3 : Mettre en oeuvre l'authentification et l'autorisation
Choisissez une ou plusieurs des méthodes suivantes en fonction de votre cas d'utilisation :
- Claques API – simples, mais pas cryptographiques. Idéal pour les intégrations internes ou partenaires à faible risque.
- JSON Web Tokens (JWT)[ – apatride et vérifiable. API Gateway peut valider la signature et les revendications en utilisant un autorisant Lambda ou un autorisant JWT intégré.
- Oauth 2.0 / OpenID Connect – déléguer la vérification d'identité à un fournisseur externe (Auth0, Okta, AWS Cognito). Utilisez l'autorisateur personnalisé de passerelles pour valider les jetons et extraire les revendications de l'utilisateur.
- Rôles et politiques basées sur les ressources[ – uniquement permettre les demandes signées avec des identifiants AWS valides. Utile pour la communication machine-à-machine dans le même compte.
Pour la production, préférez JWT ou OAuth 2.0 par rapport à des clés API simples, car elles supportent l'expiration, la révocation et les champs de portée fine. Implémentez un autorisant personnalisé (autorisant Lambda) si vous devez appeler un service d'identité externe ou appliquer des règles d'autorisation spécifiques à l'entreprise (p. ex., -Seuls les utilisateurs du groupe d'administration peuvent appeler DELETE /users/:id-).
Exemple : Un Lambda qui décode un JWT et renvoie une politique de MAI.
const jwt = require('jsonwebtoken');
exports.handler = async (event) => {
const token = event.authorizationToken.replace('Bearer ', '');
try {
const payload = jwt.verify(token, process.env.SECRET);
return {
principalId: payload.sub,
policyDocument: {
Version: '2012-10-17',
Statement: [{
Action: 'execute-api:Invoke',
Effect: 'Allow',
Resource: event.methodArn
}]
}
};
} catch (e) {
return { principalId: 'user', policyDocument: { Version: '2012-10-17', Statement: [{ Action: 'execute-api:Invoke', Effect: 'Deny', Resource: event.methodArn }] } };
}
};
Meilleures pratiques pour sécuriser les points de fin à l'échelle
L'intégration n'est que le début. Pour maintenir la sécurité à mesure que votre API grandit, adoptez les pratiques suivantes.
Limites de vitesse et étirement
Chaque passerelle fournit des limites de taux configurables. Définissez une limite par clé, par IP ou globale pour empêcher un client de consommer toutes les ressources. Dans AWS API Gateway, vous pouvez configurer un plan d'utilisation avec un taux d'effort (demandes par seconde) et un quota de rupture. Par exemple, permettez 100 requêtes par seconde avec une explosion de 200. Lorsque la limite est dépassée, la passerelle retourne une réponse . Cela protège votre fonction sans serveur des pics de trafic et réduit les coûts.
Validation et désinfection des entrées
Valider toutes les entrées client à deux niveaux : la passerelle et la fonction. La passerelle peut rejeter les en-têtes de type contenu invalides, les champs requis manquants ou JSON mal formés. La fonction devrait également désinfecter les données avant de les utiliser dans les requêtes ou de les envoyer aux services en aval. Utilisez des méthodes SQL ou ORM paramétrées pour empêcher les attaques d'injection.
Gestion des secrets et des pouvoirs
Ne jamais stocker de secrets dans des variables de code, d'environnement (s'ils sont de longue durée) ou de configuration partagée. Utilisez un gestionnaire de secrets dédié : AWS Secrets Manager[, Azure Key Vault[, ou Google Secret Manager[. Rotez les secrets sur un horaire et limitez l'accès via les politiques IAM. Pour AWS Lambda, vous pouvez récupérer les secrets au démarrage et les mettre en cache pendant la durée de l'environnement d'exécution (réduction du coût et de la la latence).
Exploitation forestière et surveillance
Activer la connexion détaillée sur la passerelle API (organismes de demande/réponse, en-têtes et latence). Remettre les journaux à un service centralisé (CloudWatch, Datadog, Spunk). Configurer les alarmes pour les motifs inhabituels : taux d'erreur élevés (5xx), pics dans 429 réponses, ou augmentation du throttling. Surveiller les invocations, la durée et le nombre d'erreurs de votre fonction sans serveur.
Activer HTTPS et la gestion des certificats
Utilisez toujours TLS 1.2 ou plus pour tous les paramètres. Tous les principaux services de passerelle prennent en charge les noms de domaine personnalisés avec des certificats fournis par ACM. Réorienter les requêtes HTTP vers HTTPS pour empêcher l'interception des données. Si vous exposez l'API à l'internet public, forcez HTTPS au niveau de la passerelle – ne jamais compter sur la fonction pour rediriger.
Principe du minimum de privilèges pour les fonctions
Par exemple, si une fonction n'a besoin que de lire à partir d'une table DynamoDB, subventionnez et sur cette table spécifique ARN, et non . De même, limitez l'accès VPC si la fonction interagit avec RDS ou Elasticsearch. Pour les fonctions Lambda dans un VPC, assurez-vous que les groupes de sécurité et les sous-réseaux sont verrouillés.
Exemple réel-monde: sécuriser une API d'enregistrement d'utilisateur
Considérez un paramètre d'inscription utilisateur : . Le client envoie un courriel et un mot de passe. La fonction sans serveur vérifie si le courriel existe, hache le mot de passe et crée un nouvel enregistrement dans une base de données. Sans mesures de sécurité, un attaquant pourrait spamer le paramètre, injecter SQL ou récolter des adresses email valides.
Avec une passerelle API devant :
- La passerelle valide l'organisme de demande par rapport à un schéma JSON (format d'email, longueur minimale du mot de passe).
- Un Lambda n'est pas nécessaire car il s'agit d'un point d'enregistrement non authentifié. Vous mettez plutôt en œuvre une limitation de taux par IP (p. ex. 5 requêtes par minute par IP) en utilisant un plan d'utilisation ou un autorisant personnalisé qui vérifie les limites basées sur IP.
- La fonction reçoit la charge utile validée, utilise bcrypt pour hacher le mot de passe (avec un facteur de coût de 12+), et insère un nouvel enregistrement utilisateur en utilisant une requête paramétrée.
- Si la fonction lance une erreur ou renvoie un conflit 409 (l'utilisateur existe), la passerelle enregistre le code d'état et une alarme déclenche si le taux d'erreur dépasse 1%.
- La réponse est dépouillée de champs sensibles (par exemple, aucune trace de pile de serveur).
Cette conception garantit que même si une vulnérabilité existe dans le code de fonction, la validation gateways et la limitation de vitesse réduisent considérablement le rayon de blason.
Comparaison des fournisseurs de cloud : Options Gateway + sans serveur
Chaque fournisseur de cloud majeur offre un ensemble de fonctionnalités légèrement différent. Évaluer en fonction de votre expertise, infrastructure existante et exigences de conformité.
| Provider | Gateway Service | Function Service | Key Differentiator |
|---|---|---|---|
| AWS | Amazon API Gateway (REST, HTTP, WebSocket) | AWS Lambda | Lambda authorizer, usage plans, canary deployments, CloudFront integration |
| Azure | Azure API Management (Consumption, Developer, Premium tiers) | Azure Functions | Policy‑based transformations, OAuth2 built‑in, product/subscription management |
| Google Cloud | Cloud API Gateway (Cloud Endpoints and Apigee) | Cloud Functions (2nd gen) | OpenAPI specification integration, Cloud Endpoints for gRPC, Apigee for advanced enterprise features |
| Open Source | Kong, Tyk, Traefik | Any (e.g., Fission, OpenFaaS, Knative) | Full control, no vendor lock‑in, can run on Kubernetes |
Pour les équipes déjà présentes sur AWS, la combinaison Lambda + API Gateway est la plus mature et largement documentée. Azure Functions + APIM offre des fonctionnalités de gouvernance d'entreprise solides. Google Cloud Functions + Cloud Endpoints est idéal pour les organisations investies dans l'écosystème de Google ou les services basés sur GRPC.
Essais et CI/CD pour les points de fin sécurisés
La sécurité doit être vérifiée en permanence. Intégrez les éléments suivants dans votre pipeline :
- test d'unité pour la logique de fonction, en particulier les cas de validation et d'erreur.
- tests d'intégration qui invoquent l'API par la passerelle (utiliser une étape de mise en scène) et affirment les codes d'état, les en-têtes et les organismes de réponse.
- Scannage de sécurité[ – exécuter SAST (analyse statique) sur le code de fonction et la numérisation de dépendance sur le paquet de déploiement (p. ex., en utilisant ou Snyk).
- Infrastructure comme code (IaC)[ – définir les rôles de passerelle, de fonctions et d'IAM en utilisant AWS CloudFormation / CDK, Azure Bicep ou Terraform. Cela empêche la dérive et permet l'examen par les pairs des configurations de sécurité.
- Test de pénétration[ – test périodique de vulnérabilités communes (injection SQL, authentification interrompue, contournement de la limite de vitesse) à l'aide d'outils comme OWASP ZAP ou Burp Suite.
Automatisez les déploiements avec un pipeline CI/CD qui favorise le code par le biais de dev, de mise en scène et de production, en exécutant la suite complète de test à chaque porte. Ne jamais déployer directement à la production à partir d'une machine de développement.
Considérations relatives aux coûts des API sans serveur
Bien que sans serveur soit rentable à faible volume, les fonctions de sécurité ajoutent des frais généraux.
- Les tailles de la demande de passerelle et de la réponse[ – les charges utiles plus importantes augmentent les coûts de transfert de données.
- Invocations d'auteur – chaque appel d'API qui déclenche un Lambda autorise le coût d'exécution de la fonction. Si vous avez un trafic très élevé, envisagez d'utiliser un autorisant intégré (la validation JWT est gratuite dans les API HTTP AWS).
- Logage et surveillance[ – les journaux détaillés dans CloudWatch ou les services tiers peuvent devenir coûteux à l'échelle.
- Sécrets manager retrieving – chaque appel à Secrets Manager a un coût. Cache secrets dans l'environnement d'exécution de la fonction aussi longtemps que le conteneur est chaud.
Pour les API à débit élevé constant (p. ex., 10 000 requêtes/seconde), un niveau de passerelle dédié ou même une solution conteneurisée peut être plus prévisible que sans serveur.
Pièges courants et comment les éviter
- Exposer des erreurs internes – ne jamais retourner de traces de pile ou de messages d'erreur de base de données au client. Capturez toutes les erreurs dans le gestionnaire et retournez des réponses d'erreur normalisées (p. ex. ].
- CORS[ – au lieu de , se limite aux origines connues. Valider l'en-tête dans la passerelle ou un autorisant personnalisé.
- Ignorer la sécurité de démarrage à froid – les démarrages à froid peuvent fonctionner dans les anciennes instances. Assurez-vous que votre fonction récupère toujours les derniers secrets et vérifie les rôles IAM mis à jour (identifiants de caches SDK de l'AWS, mais ils tournent automatiquement).
- Les limites de taux de suppression des paramètres d'authentification[ – les paramètres de connexion, d'enregistrement et de remise des mots de passe sont souvent mal utilisés.
- Les variables d'environnement codées à la main – traitent les variables d'environnement comme des secrets. Utilisez un mécanisme de stockage sécurisé et faites-les tourner.
Conclusion
L'utilisation d'une passerelle API avec des fonctions sans serveur est un modèle éprouvé pour construire des API sécurisées, évolutives et rentables. La passerelle gère l'authentification, le grottling, la validation et la logarithme pendant que les fonctions se concentrent sur la logique d'entreprise. En suivant les étapes d'intégration décrites ici – sélectionner la méthode d'authentification correcte, mettre en œuvre la défense en profondeur avec validation d'entrée et limitation des taux, et automatiser les vérifications de sécurité – vous pouvez protéger vos paramètres contre les attaques et les défaillances opérationnelles communes.
Commencez par un simple paramètre authentifié, itérer sur votre modèle d'autorisation, et ajoutez progressivement monitoring et alerte. La combinaison de passerelles gérées et de calcul sans serveur vous donne une base solide qui peut évoluer avec vos exigences de sécurité de l'application. Pour plus de détails, consultez la documentation de sécurité AWS API Gateway[ ou [Oauth 2.0 spec pour approfondir votre compréhension des flux d'autorisation.