image
image
image
image
image
image

Authentification par jeton de lapi aws

Comment sécuriser les points de terminaison HTTP d’API Gateway avec le mécanisme d’autorisation JWT

par Siva Rajamani, Rajat Mathur et Sudhanshu Malhotraon dans Expert (400), Learning Levels, Security, Security, Identity, & CompliancePermalink Comments Partager

Cet article de blog montre comment vous pouvez sécuriser les points de terminaison HTTP Amazon API Gateway avec des dispositifs d’autorisation JSON Web Token (JWT). Amazon API Gateway aide les développeurs à créer, publier et gérer des API sécurisées à n’importe quelle échelle, ce qui permet de gérer des milliers d’appels d’API. Il n’y a pas de frais minimums et vous ne payez que pour les appels API que vous recevez.

Sur la base des commentaires des clients et des leçons tirées de la création des API REST et WebSocket, AWS a lancé des API HTTP pour Amazon API Gateway, un service conçu pour être rapide, peu coûteux et simple à utiliser. Les API HTTP offrent une solution pour la création d’API, ainsi que plusieurs mécanismes de contrôle et de gestion de l’accès via AWS Identity and Access les mécanismes d’autorisation de gestion (IAM), les mécanismes d’autorisation AWS Lambda et les mécanismes d’autorisation JWT.

Cet article fournit des conseils étape par étape pour configurer les mécanismes d’autorisation JWT à l’aide d’Amazon Cognito comme fournisseur d’identité, configurer les API HTTP pour utiliser les mécanismes d’autorisation JWT et des exemples pour tester l’ensemble de la configuration. Si vous souhaitez protéger les API HTTP à l’aide des mécanismes d’autorisation Lambda et IAM, vous pouvez vous référer à Présentation des mécanismes d’autorisation IAM et Lambda pour les API HTTP Amazon API Gateway.

Avant de

pouvoir configurer un mécanisme d’autorisation JWT à l’aide de Cognito, vous devez d’abord créer trois fonctions Lambda. Vous devez créer chaque fonction Lambda à l’aide des paramètres de configuration, des autorisations et du code suivants :

  1. La première fonction Lambda (Pre-tokenAuthLambda) est appelée avant la génération du jeton, ce qui vous permet de personnaliser les revendications dans le jeton d’identité.
  2. La deuxième fonction Lambda (LambdaForAdminUser) agit comme la cible d’intégration HTTP API Gateway pour l’itinéraire de ressource d’API HTTP /AdminUser.
  3. La troisième fonction Lambda (LambdaForRegularUser) agit comme cible d’intégration de la passerelle d’API HTTP pour l’itinéraire de ressource d’API HTTP /RegularUser.

Stratégie IAM pour la fonction Lambda

Vous devez d’abord créer un rôle IAM à l’aide de la stratégie IAM suivante pour chacune des trois fonctions Lambda :

Paramètres des fonctions Lambda requises

Pour les trois fonctions Lambda, utilisez les paramètres suivants :

Nom de la fonction Entrez un nom approprié pour la fonction Lambda, par exemple :
  • Pre-tokenAuthLambda pour la première Lambda
  • LambdaForAdminUser pour la deuxième
  • LambdaForRegularUser pour le troisième
Runtime

Choisissez Node.js Autorisations 12.x

Choisissez Utiliser un rôle existant et sélectionnez le rôle que vous avez créé avec la stratégie IAM dans la section Conditions préalables ci-dessus.

Ce

premier code Lambda, Pre-tokenAuthLambda, convertit les détails du groupe Cognito de l’utilisateur authentifié pour qu’ils soient renvoyés en tant que revendication d’étendue dans le id_token renvoyé par Cognito.

Code LambdaForAdminUser

Ce code Lambda, LambdaForAdminUser, agit en tant que cible d’intégration HTTP API Gateway et renvoie la réponse Hello de l’utilisateur admin lorsque le chemin d’accès de la ressource /AdminUser est appelé dans API Gateway.

Code LambdaForRegularUser

Ce code Lambda, LambdaForRegularUser , fait office d’API HTTP L’intégration de la passerelle cible et renvoie la réponse Hello de l’utilisateur régulier lorsque le chemin d’accès à la ressource /RegularUser est appelé dans API Gateway.

Déployer la solution

Pour sécuriser les ressources API Gateway à l’aide du mécanisme d’autorisation JWT, procédez comme suit :

  1. Création d’un groupe d’utilisateurs Amazon Cognito avec un client d’application qui fait office de mécanisme d’autorisation JWT
  2. Créez des ressources API Gateway et sécurisez-les à l’aide du mécanisme d’autorisation JWT en fonction des paramètres configurés du groupe d’utilisateurs Amazon Cognito et du client d’application.

Les procédures ci-dessous vous guideront tout au long de la configuration étape par étape.

Configurer le mécanisme d’autorisation JWT à l’aide d’Amazon Cognito

La première étape de la configuration du mécanisme d’autorisation JWT consiste à créer un groupe d’utilisateurs Amazon Cognito.

Pour créer un groupe d’utilisateurs Amazon Cognito

  1. , accédez à la console Amazon Cognito.
  2. Choisissez Gérer les groupes d’utilisateurs , puis Créer un groupe d’utilisateurs .

    Figure 1 : création d’un groupe d’utilisateurs

  3. Entrez un nom de pool, puis choisissez Vérifier les valeurs par défaut .

    Figure 2 : Vérification des paramètres par défaut lors de la création du groupe d’utilisateurs

  4. Choisissez Ajouter un client d’application .

    Figure 3 : Ajouter un client d’application pour le groupe d’utilisateurs

  5. Entrez un nom de client d’application . Pour cet exemple, conservez les options par défaut. Choisissez Créer un client d’application pour terminer.

    Figure 4 : Passez en revue la configuration du client d’application et créez-la

  6. Choisissez Revenir aux détails du pool , puis Créer un pool .

    Figure 5 : Terminer la création de l’utilisateur Pour

configurer les paramètres du groupe d’utilisateurs Cognito

,

vous pouvez désormais configurer les paramètres du client d’application :

  1. Dans le volet gauche, choisissez Paramètres du client d’application. Dans Fournisseurs d’identité activés , sélectionnez les fournisseurs d’identité souhaités pour les applications que vous avez configurées dans l’onglet Clients d’applications.
  2. Entrez les URL de rappel souhaitées, séparées par des virgules. Ces URL s’appliquent à tous les fournisseurs d’identité sélectionnés.
  3. Sous OAuth 2.0 , sélectionnez l’une des options suivantes.
    • Pour Flux OAuth autorisés , sélectionnez Octroi de code d’autorisation .
    • Pour Étendues OAuth autorisées , sélectionnez téléphone , e-mail , openID , et profile .
  4. Choisissez Enregistrer les modifications .

    Figure 6 : Configurer les paramètres du client d’application

  5. Ajoutez maintenant le préfixe de domaine à utiliser pour les pages de connexion hébergées par Amazon Cognito. Dans le volet gauche, choisissez Nom de domaine et entrez le préfixe de domaine approprié, puis Enregistrer les modifications.

    Figure 7 : Choisir un préfixe de nom de domaine pour le domaine Amazon Cognito

  6. Ensuite, créez le déclencheur de génération de pré-jeton. Dans le volet gauche, choisissez Triggers (Déclencheurs ) et, sous Pre Token Generation (Prégénération de tokens), sélectionnez la fonction Pre-tokenAuthLambda Lambda que vous avez créée dans la procédure Conditions préalables ci-dessus, puis choisissez Save changes (Enregistrer les modifications ).

    Figure 8 : configuration du pré-jeton Déclencheur de génération Lambda pour le groupe d’utilisateurs

  7. Enfin, créez deux groupes Cognito nommés admin et regular. Créez deux utilisateurs Cognito nommés adminuser et regularuser. Attribuez adminuser à la fois au groupe admin et au groupe normal. Affecter regularuser au groupe normal.

    Figure 9 : Création de groupes et d’utilisateurs pour le groupe d’utilisateurs

Configuration des points de terminaison HTTP avec le mécanisme d’autorisation JWT

La première étape de la configuration des points de terminaison HTTP consiste à créer l’API dans la console de gestion d’API Gateway.

Pour créer l’API

  1. Accédez à la console de gestion d’API Gateway et choisissez Créer une API .

    Figure 10 : Création d’une API dans la console de gestion d’API Gateway

  2. Choisissez API HTTP et sélectionnez Générer .

    Figure 11 : sélection de l’option Générer pour l’API HTTP

  3. Sous Créer et configurer des intégrations , entrez JWTAuth pour le nom de l’API et choisissez Vérifier et créer .

    Figure 12 : Création d’intégrations pour l’API HTTP

  4. Une fois que vous avez créé l’API JWTAuth, choisissez Routes dans le volet gauche.

    Figure 13 : accès à l’onglet Itinéraires

  5. Choisissez Créer un itinéraire et sélectionnez Méthode GET. Entrez ensuite /AdminUser pour le chemin d’accès.

    Figure 14 : Création de la première route pour l’API HTTP

  6. Répétez l’étape 5 et créez un deuxième itinéraire à l’aide de la méthode GET et de /RegularUser pour le chemin d’accès.

    Figure 15 : Création de la deuxième route pour l’API HTTP

Pour créer une API

  1. intégrations Maintenant que les deux itinéraires sont créés, sélectionnez Intégrations dans le volet gauche.

    Figure 16 : Accéder à l’onglet Intégrations

  2. Sélectionnez GET pour le chemin d’accès à la ressource /AdminUser, puis choisissez Créer et attacher une intégration .

    Figure 17 : Attacher une intégration à la première route

  3. Pour créer une intégration, sélectionnez les valeurs suivantes

    Type d’intégration : Fonction
    Lambda Cible d’intégration : LambdaForAdminUser

  4. Choisissez Créer .
    note: LambdaForAdminUser est la fonction Lambda que vous avez précédemment créée dans le cadre du code LambdaForAdminUser de la procédure Prérequis.

    Figure 18 : Création d’une intégration pour le premier itinéraire

  5. Ensuite, sélectionnez GET pour le chemin d’accès de la ressource /RegularUser, puis choisissez Créer et attacher une intégration .

    Figure 19 : Attacher une intégration à la deuxième route

  6. Pour créer une intégration, sélectionnez les valeurs suivantes

    Type d’intégration : Fonction
    Lambda Cible d’intégration : LambdaForRegularUser

  7. Choisissez Créer .
    note: LambdaForRegularUser est la fonction Lambda que vous avez précédemment créée dans le cadre du code LambdaForRegularUser de la procédure Prerequisites.

    Figure 20 : Création d’une intégration pour le deuxième itinéraire

Pour configurer l’autorisation de l’API

  1. Sélectionnez Autorisation dans le volet gauche, sélectionnez /AdminUser path et choisissez Créer et attacher un mécanisme d’autorisation .

    Figure 21 : Accéder à l’option Autorisation du volet gauche pour créer un mécanisme d’autorisation

  2. Pour Type d’autorisateur, sélectionnez JWT et, sous Paramètres d’autorisation, entrez les détails suivants :
    Nom : JWTAuth
    Source d’identité : $request.header.Authorization
    URL de l’émetteur : https://cognito-idp.us-east-1.amazonaws.com/ <your_userpool_id>
    Audience : <app_client_id_of_userpool>
  3. choisissez Créer .

    Figure 22 : Création et attachement d’un mécanisme d’autorisation à la première route de l’API HTTP

  4. Dans l’écran Authorizer for route GET /AdminUser, choisissez Ajouter une étendue dans la section Étendue d’autorisation et entrez le nom de l’étendue en tant qu’admin- <app_client_id> puis choisissez Enregistrer .

    Figure 23 : Ajout d’étendues d’autorisation à la première route de l’API HTTP

  5. Sélectionnez maintenant le chemin /RegularUser et, dans la liste déroulante, sélectionnez le mécanisme d’autorisation JWTAuth que vous avez créé à l’étape 3. Choisissez Attacher un mécanisme d’autorisation .

    Figure 24 : Fixez un authorizer to HTTP API second route

  6. Choisissez Ajouter une étendue et entrez le nom de l’étendue en tant que <app_client_id> normale et choisissez Enregistrer .

    Figure 25 : Ajout d’étendues d’autorisation à la deuxième route de l’API HTTP

  7. Entrez Test comme nom, puis choisissez Créer .

    Figure 26 : Création d’une étape pour l’API HTTP

  8. Sous Sélectionner une étape , entrez Test, puis choisissez Déployer sur l’étape.

    Figure 27 : Déployer l’API HTTP pour tester

l’authentificateur JWT

Vous pouvez utiliser les exemples suivants pour tester l’authentification de l’API. Nous utilisons Curl dans cet exemple, mais vous pouvez utiliser n’importe quel client HTTP.

Pour tester l’authentification API

  1. Envoyez une requête GET à la ressource API HTTP /RegularUser sans spécifier d’en-tête d’autorisation.

    API Gateway renvoie une réponse 401 Non autorisé, comme prévu.

    La

  2. source d’identité $request.header.Authorization requise n’est pas fournie, donc le mécanisme d’autorisation JWT n’est pas appelé. Fournissez une clé et une valeur d’en-tête d’autorisation valides. Vous vous authentifiez en tant qu’utilisateur régulier à l’aide de la commande AWS CLI AWS aws cognito-idp-author.

    Réponse de commande CLI :

    la réponse de commande contient un JWT (IdToken) qui contient des informations sur l’utilisateur authentifié. Ces informations peuvent être utilisées comme valeur d’en-tête Authorization.

  3. API Gateway renvoie la réponse Hello de l’utilisateur régulier. Testez maintenant l’accès à la ressource API HTTP /AdminUser avec le jeton JWT pour l’utilisateur régulier.

    Passerelle API renvoie une réponse 403 – Interdit.
    Le
    jeton JWT pour l’utilisateur régulier n’a pas la portée d’autorisation définie pour la ressource /AdminUser, donc API Gateway renvoie une réponse 403 – Interdit.

  4. Ensuite, connectez-vous en tant qu’adminuser et vérifiez que vous pouvez accéder aux ressources /RegularUser et /AdminUser. Vous utilisez la commande cognito-idp initiate-auth AWS CLI.
  5. Réponse de la commande CLI :

  6. à l’aide de Curl, vous pouvez vérifier que le jeton JWT adminuser a désormais accès à la ressource /RegularUser et à la ressource /AdminUser. Cela est possible lorsque adminuser fait partie des deux groupes Cognito, de sorte que le jeton JWT contient les deux étendues d’autorisation.

    API Gateway renvoie la réponse Hello de l’utilisateur régulier

    API Gateway renvoie la réponse suivante Hello de l’utilisateur admin

Conclusion AWS

a permis de gérer l’accès à une API HTTP dans API Gateway de plusieurs façons : avec des mécanismes d’autorisation Lambda, des rôles et des stratégies IAM et des mécanismes d’autorisation JWT. Cet article a montré comment vous pouvez sécuriser les points de terminaison d’API HTTP d’API Gateway avec des mécanismes d’autorisation JWT. Nous avons configuré un mécanisme d’autorisation JWT à l’aide d’Amazon Cognito comme fournisseur d’identité (IdP). Vous pouvez obtenir les mêmes résultats avec n’importe quel fournisseur d’identité prenant en charge les normes OAuth 2.0. API Gateway valide le JWT que le client soumet avec les demandes d’API. API Gateway autorise ou refuse les demandes en fonction de la validation du jeton et de l’étendue du jeton. Vous pouvez configurer des mécanismes d’autorisation distincts pour chaque itinéraire d’une API ou utiliser le même mécanisme d’autorisation pour plusieurs itinéraires.

Pour en savoir plus, nous vous recommandons de :

Si vous avez des commentaires sur cet article, envoyez-les dans la section Commentaires ci-dessous. Si vous avez des questions sur cet article, contactez AWS Support.

Vous souhaitez en savoir plus sur la sécurité AWS ? Suivez-nous sur Twitter.

Siva Rajamani

Siva est un architecte de solutions d’entreprise basé à Boston. Il aime travailler en étroite collaboration avec les clients et soutenir leur transformation numérique et leur parcours d’adoption d’AWS. Ses principaux domaines d’intérêt sont le serverless, l’intégration d’applications et la sécurité.

Sudhanshu Malhotra

Sudhanshu est un architecte de solutions d’entreprise basé à Boston pour AWS. C’est un passionné de technologie qui aime aider les clients à trouver des solutions innovantes à des défis commerciaux complexes. Ses principaux domaines d’intérêt sont DevOps, l’apprentissage automatique et la sécurité. Lorsqu’il ne travaille pas avec des clients dans leur voyage vers le cloud, il aime lire, faire de la randonnée et explorer de nouvelles cuisines.

Rajat Mathur

Rajat est architecte de solutions senior chez Amazon Web Services. Rajat est un technologue passionné qui aime créer des solutions innovantes pour les clients AWS. Ses principaux domaines d’intérêt sont l’IoT, les réseaux et l’informatique sans serveur. Dans ses temps libres, Rajat aime faire de longs trajets, voyager et passer du temps avec sa famille.

Mots clés : API GW, autorisation, Sécurité AWS, IAM, Authorizer JWT, Authorizer Lambda, Serverless