View a markdown version of this page

Utilisation d'Amazon API Gateway pour intégrer votre fournisseur d'identité - AWS Transfer Family

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation d'Amazon API Gateway pour intégrer votre fournisseur d'identité

Cette rubrique explique comment utiliser une AWS Lambda fonction pour sauvegarder une méthode API Gateway. Utilisez cette option si vous avez besoin d'une API RESTful pour intégrer votre fournisseur d'identité ou si vous souhaitez utiliser AWS WAF ses fonctionnalités de géoblocage ou de limitation de débit pour les demandes.

Dans la plupart des cas d'utilisation, la méthode recommandée pour configurer un fournisseur d'identité personnalisé consiste à utiliser leSolution de fournisseur d'identité personnalisée.

Limitations liées à l'utilisation d'une passerelle API pour intégrer votre fournisseur d'identité

  • Cette configuration ne prend pas en charge les domaines personnalisés.

  • Cette configuration ne prend pas en charge une URL de passerelle API privée.

Si vous avez besoin de l'un ou l'autre de ces outils, vous pouvez utiliser Lambda en tant que fournisseur d'identité, sans API Gateway. Pour en savoir plus, consultez Utilisation AWS Lambda pour intégrer votre fournisseur d'identité.

Authentification à l'aide d'une méthode API Gateway

Vous pouvez créer une méthode API Gateway à utiliser en tant que fournisseur d'identité pour Transfer Family. Cette approche vous permet de créer et de fournir des API de manière hautement sécurisée. Avec API Gateway, vous pouvez créer un point de terminaison HTTPS afin que toutes les opérations d'API entrantes soient transmises avec une sécurité accrue. Pour plus de détails sur le service API Gateway, consultez le Guide du développeur API Gateway.

API Gateway propose une méthode d'autorisation nomméeAWS_IAM, qui vous donne la même authentification basée sur Gestion des identités et des accès AWS (IAM) que celle AWS utilisée en interne. Si vous activez l'authentification avecAWS_IAM, seuls les appelants disposant d'autorisations explicites pour appeler une API peuvent accéder à la méthode API Gateway de cette API.

Pour utiliser votre méthode API Gateway en tant que fournisseur d'identité personnalisé pour Transfer Family, activez IAM pour votre méthode API Gateway. Dans le cadre de ce processus, vous fournissez un rôle IAM avec des autorisations permettant à Transfer Family d'utiliser votre passerelle.

Note

Pour améliorer la sécurité, vous pouvez configurer un pare-feu pour applications Web. AWS WAF est un pare-feu pour applications Web qui vous permet de surveiller les requêtes HTTP et HTTPS qui sont transmises à Amazon API Gateway. Pour en savoir plus, consultez Ajouter un pare-feu pour applications Web.

Ne pas activer la mise en cache d'API Gateway

N'activez pas la mise en cache pour votre méthode API Gateway lorsque vous l'utilisez comme fournisseur d'identité personnalisé pour Transfer Family. La mise en cache n'est pas appropriée et n'est pas valide pour les demandes d'authentification car :

  • Chaque demande d'authentification est unique et nécessite une réponse en direct, et non une réponse mise en cache

  • La mise en cache ne présente aucun avantage, car Transfer Family n'envoie jamais de demandes dupliquées ou répétées à l'API Gateway.

  • L'activation de la mise en cache entraînera la réponse de l'API Gateway avec des données incompatibles, ce qui entraînera des réponses non valides aux demandes d'authentification

Pour utiliser votre méthode API Gateway pour une authentification personnalisée avec Transfer Family
  1. Créez une CloudFormation pile. Pour cela :

    Note

    Les modèles de pile ont été mis à jour pour utiliser des BASE64-encoded mots de passe : pour plus de détails, consultezAméliorations apportées à CloudFormation modèles.

    1. Ouvrez la CloudFormation console à l'adresse https://console.aws.amazon.com/cloudformation.

    2. Suivez les instructions pour déployer une CloudFormation pile à partir d'un modèle existant dans la section Sélection d'un modèle de pile du Guide de AWS CloudFormation l'utilisateur.

    3. Utilisez l'un des modèles de base suivants pour créer une méthode API Gateway AWS Lambda soutenue à utiliser en tant que fournisseur d'identité personnalisé dans Transfer Family.

    Le déploiement de l'une de ces piles est le moyen le plus simple d'intégrer un fournisseur d'identité personnalisé dans le flux de travail Transfer Family. Chaque pile utilise la fonction Lambda pour prendre en charge votre méthode d'API basée sur API Gateway. Vous pouvez ensuite utiliser votre méthode d'API en tant que fournisseur d'identité personnalisé dans Transfer Family. Par défaut, la fonction Lambda authentifie un seul utilisateur appelé myuser avec un mot de passe de. MySuperSecretPassword Après le déploiement, vous pouvez modifier ces informations d'identification ou mettre à jour le code de la fonction Lambda pour effectuer quelque chose de différent.

    Important

    Nous vous recommandons de modifier les informations d'identification par défaut de l'utilisateur et du mot de passe.

    Une fois la pile déployée, vous pouvez consulter les détails la concernant dans l'onglet Sorties de la CloudFormation console. Ces informations incluent le nom de ressource Amazon (ARN) de la pile, l'ARN du rôle IAM créé par la pile et l'URL de votre nouvelle passerelle.

    Note

    Si vous utilisez l'option de fournisseur d'identité personnalisé pour activer l'authentification par mot de passe pour vos utilisateurs et que vous activez l'enregistrement des demandes et des réponses fourni par API Gateway, API Gateway enregistre les mots de passe de vos utilisateurs dans vos Amazon Logs. CloudWatch Nous vous déconseillons d'utiliser ce journal dans votre environnement de production. Pour plus d'informations, consultez la section Configuration CloudWatch de la journalisation des API dans API Gateway dans le Guide du développeur d'API Gateway.

  2. Vérifiez la configuration de la méthode API Gateway pour votre serveur. Pour cela :

    1. Ouvrez la console API Gateway à l'adresse https://console.aws.amazon.com/apigateway/.

    2. Choisissez le modèle d'API de base Transfer Custom Identity Provider généré par le CloudFormation modèle. Vous devrez peut-être sélectionner votre région pour voir vos passerelles.

    3. Dans le volet Ressources, choisissez GET. La capture d'écran suivante montre la configuration correcte de la méthode.

      Détails de configuration de l'API, indiquant les paramètres de configuration des méthodes pour les chemins de demande et pour la chaîne de requête URL.

    À ce stade, votre passerelle API est prête à être déployée.

  3. Pour Actions, choisissez Deploy API. Pour la phase de déploiement, choisissez prod, puis choisissez Deploy.

    Une fois la méthode API Gateway déployée avec succès, visualisez ses performances dans Stages > Détails de l'étape, comme illustré dans la capture d'écran suivante.

    Note

    Copiez l'adresse URL Invoke qui apparaît en haut de l'écran. Vous en aurez peut-être besoin pour la prochaine étape.

    Détails de l'étape avec l'URL d'appel en surbrillance.
  4. Ouvrez la AWS Transfer Family console à l'adresse https://console.aws.amazon.com/transfer/.

  5. Une famille de transfert aurait dû être créée pour vous lorsque vous avez créé la pile. Si ce n'est pas le cas, configurez votre serveur en suivant ces étapes.

    1. Choisissez Créer un serveur pour ouvrir la page Créer un serveur. Pour Choisir un fournisseur d'identité, choisissez Personnalisé, puis sélectionnez Utiliser Amazon API Gateway pour vous connecter à votre fournisseur d'identité, comme illustré dans la capture d'écran suivante.

      L'écran du fournisseur d'identité avec le fournisseur d'identité personnalisé sélectionné et avec la passerelle API choisie pour la connexion à votre fournisseur d'identité.
    2. Dans la zone de texte Fournir une URL Amazon API Gateway, collez l'adresse URL d'appel du point de terminaison API Gateway que vous avez créé à l'étape 3 de cette procédure.

    3. Pour Rôle, choisissez le rôle IAM créé par le CloudFormation modèle. Ce rôle permet à Transfer Family d'invoquer votre méthode de passerelle API.

      Le rôle d'invocation contient le nom de CloudFormation pile que vous avez sélectionné pour la pile que vous avez créée à l'étape 1. Il a le format suivant :CloudFormation-stack-name-TransferIdentityProviderRole-ABC123DEF456GHI.

    4. Remplissez les champs restants, puis choisissez Créer un serveur. Pour plus de détails sur les étapes restantes à suivre pour créer un serveur, consultezConfiguration d'un point de terminaison de serveur SFTP, FTPS ou FTP.

Implémentation de votre méthode API Gateway

Pour créer un fournisseur d'identité personnalisé pour Transfer Family, votre méthode API Gateway doit implémenter une méthode unique dont le chemin de ressource est de/servers/serverId/users/username/config. Les username valeurs serverId et proviennent du chemin des ressources RESTful. Ajoutez également sourceIp et protocol en tant que paramètres de chaîne de requête URL dans la demande de méthode, comme indiqué dans l'image suivante.

L'écran Ressources de l'API Gateway affiche les détails de la GET méthode.
Note

Le nom d'utilisateur doit comporter un minimum de 3 et un maximum de 100 caractères. Vous pouvez utiliser les caractères suivants dans le nom d'utilisateur : a—z, 0—9 A-Z, le trait de soulignement « _ », le tiret « - », le point «. » et le signe « @». Le nom d'utilisateur ne peut pas commencer par un tiret « - », un point «. » ou un signe « @».

Si Transfer Family tente d'authentifier le mot de passe de votre utilisateur, le service fournit un champ d'Password:en-tête. En l'absence d'Password:en-tête, Transfer Family tente une authentification par clé publique pour authentifier votre utilisateur.

Lorsque vous utilisez un fournisseur d'identité pour authentifier et autoriser les utilisateurs finaux, en plus de valider leurs informations d'identification, vous pouvez autoriser ou refuser les demandes d'accès en fonction des adresses IP des clients utilisés par vos utilisateurs finaux. Vous pouvez utiliser cette fonctionnalité pour vous assurer que les données stockées dans vos compartiments S3 ou dans votre système de fichiers Amazon EFS sont accessibles via les protocoles pris en charge uniquement à partir d'adresses IP que vous avez spécifiées comme fiables. Pour activer cette fonctionnalité, vous devez l'inclure sourceIp dans la chaîne de requête.

Si plusieurs protocoles sont activés pour votre serveur et que vous souhaitez fournir un accès en utilisant le même nom d'utilisateur sur plusieurs protocoles, vous pouvez le faire à condition que les informations d'identification spécifiques à chaque protocole aient été configurées dans votre fournisseur d'identité. Pour activer cette fonctionnalité, vous devez inclure la protocol valeur dans le chemin des ressources RESTful.

Votre méthode API Gateway doit toujours renvoyer un code d'état HTTP200. Tout autre code d'état HTTP signifie qu'une erreur s'est produite lors de l'accès à l'API.

Exemple de réponse Amazon S3

L'exemple de corps de réponse est un document JSON de la forme suivante pour Amazon S3.

{ "Role": "IAM role with configured S3 permissions", "PublicKeys": [ "ssh-rsa public-key1", "ssh-rsa public-key2" ], "Policy": "STS Assume role session policy", "HomeDirectory": "/amzn-s3-demo-bucket/path/to/home/directory" }
Note

La politique est échappée au format JSON sous forme de chaîne. Par exemple :

"Policy": "{ \"Version\": \"2012-10-17\", \"Statement\": [ {\"Condition\": {\"StringLike\": {\"s3:prefix\": [\"user/*\", \"user/\"]}}, \"Resource\": \"arn:aws:s3:::amzn-s3-demo-bucket\", \"Action\": \"s3:ListBucket\", \"Effect\": \"Allow\", \"Sid\": \"ListHomeDir\"}, {\"Resource\": \"arn:aws:s3:::*\", \"Action\": [\"s3:PutObject\", \"s3:GetObject\", \"s3:DeleteObjectVersion\", \"s3:DeleteObject\", \"s3:GetObjectVersion\", \"s3:GetObjectACL\", \"s3:PutObjectACL\"], \"Effect\": \"Allow\", \"Sid\": \"HomeDirObjectAccess\"}] }"

L'exemple de réponse suivant montre qu'un utilisateur possède un type de répertoire personnel logique.

{ "Role": "arn:aws:iam::123456789012:role/transfer-access-role-s3", "HomeDirectoryType":"LOGICAL", "HomeDirectoryDetails":"[{\"Entry\":\"/\",\"Target\":\"/amzn-s3-demo-bucket1\"}]", "PublicKeys":[""] }
Exemple de réponse Amazon EFS

L'exemple de corps de réponse est un document JSON de la forme suivante pour Amazon EFS.

{ "Role": "IAM role with configured EFS permissions", "PublicKeys": [ "ssh-rsa public-key1", "ssh-rsa public-key2" ], "PosixProfile": { "Uid": "POSIX user ID", "Gid": "POSIX group ID", "SecondaryGids": [Optional list of secondary Group IDs], }, "HomeDirectory": "/fs-id/path/to/home/directory" }

Le Role champ indique que l'authentification a été réussie. Lorsque vous effectuez une authentification par mot de passe (lorsque vous fournissez un Password: en-tête), vous n'avez pas besoin de fournir de clés publiques SSH. Si un utilisateur ne peut pas être authentifié, par exemple si le mot de passe est incorrect, votre méthode doit renvoyer une réponse non Role définie. Un objet JSON vide est un exemple d'une telle réponse.

L'exemple de réponse suivant montre un utilisateur dont le type de répertoire d'accueil est logique.

{ "Role": "arn:aws:iam::123456789012:role/transfer-access-role-efs", "HomeDirectoryType": "LOGICAL", "HomeDirectoryDetails":"[{\"Entry\":\"/\",\"Target\":\"/faa1a123\"}]", "PublicKeys":[""], "PosixProfile":{"Uid":65534,"Gid":65534} }

Vous pouvez inclure des politiques utilisateur dans la fonction Lambda au format JSON. Pour plus d'informations sur la configuration des politiques utilisateur dans Transfer Family, consultezGestion des contrôles d’accès.

Fonction Lambda par défaut

Pour implémenter différentes stratégies d'authentification, modifiez la fonction Lambda utilisée par votre passerelle. Pour vous aider à répondre aux besoins de votre application, vous pouvez utiliser les exemples de fonctions Lambda suivants dans Node.js. Pour plus d'informations sur Lambda, consultez le Guide du AWS Lambda développeur ou la section Création de fonctions Lambda avec. Node.js

L'exemple de fonction Lambda suivant prend votre nom d'utilisateur, votre mot de passe (si vous effectuez une authentification par mot de passe), votre ID de serveur, votre protocole et l'adresse IP du client. Vous pouvez utiliser une combinaison de ces entrées pour rechercher votre fournisseur d'identité et déterminer si la connexion doit être acceptée.

Note

Si plusieurs protocoles sont activés pour votre serveur et que vous souhaitez fournir un accès en utilisant le même nom d'utilisateur sur plusieurs protocoles, vous pouvez le faire à condition que les informations d'identification spécifiques au protocole aient été configurées dans votre fournisseur d'identité.

Pour le protocole FTP (File Transfer Protocol), nous vous recommandons de conserver des informations d'identification distinctes du protocole SFTP (Secure Shell) et du protocole FTPS (File Transfer Protocol over SSL). Nous vous recommandons de conserver des informations d'identification distinctes pour le FTP car, contrairement au SFTP et au FTPS, le FTP transmet les informations d'identification en texte clair. En isolant les informations d'identification FTP du SFTP ou du FTPS, si les informations d'identification FTP sont partagées ou exposées, vos charges de travail utilisant SFTP ou FTPS restent sécurisées.

Cet exemple de fonction renvoie les détails du rôle et du répertoire de base logique, ainsi que les clés publiques (si elle effectue une authentification par clé publique).

Lorsque vous créez des utilisateurs gérés par des services, vous définissez leur répertoire personnel, qu'il soit logique ou physique. De même, nous avons besoin des résultats de la fonction Lambda pour transmettre la structure de répertoire physique ou logique souhaitée par l'utilisateur. Les paramètres que vous définissez dépendent de la valeur du HomeDirectoryType champ.

  • HomeDirectoryTypedéfini sur PATH : le HomeDirectory champ doit alors être un préfixe de compartiment Amazon S3 absolu ou un chemin absolu Amazon EFS visible par vos utilisateurs.

  • HomeDirectoryTypedéfinir sur LOGICAL : ne définissez aucun HomeDirectory champ. Au lieu de cela, nous HomeDirectoryDetails définissons un champ qui fournit Entry/Target les mappages souhaités, similaires aux valeurs décrites dans le HomeDirectoryDetails paramètre pour les utilisateurs gérés par les services.

Les exemples de fonctions sont répertoriés dansExemples de fonctions Lambda.

Fonction Lambda à utiliser avec AWS Secrets Manager

Pour l'utiliser AWS Secrets Manager comme fournisseur d'identité, vous pouvez utiliser la fonction Lambda dans l'exemple de CloudFormation modèle. La fonction Lambda interroge le service Secrets Manager à l'aide de vos informations d'identification et, en cas de succès, renvoie un secret désigné. Pour plus d’informations sur Secrets Manager, consultez le Guide de l’utilisateur AWS Secrets Manager.

Pour télécharger un exemple de CloudFormation modèle utilisant cette fonction Lambda, accédez au compartiment Amazon S3 fourni par AWS Transfer Family.

Améliorations apportées à CloudFormation modèles

Des améliorations ont été apportées à l'interface API Gateway aux CloudFormation modèles publiés. Les modèles utilisent désormais des BASE64-encoded mots de passe avec l'API Gateway. Vos déploiements existants continuent de fonctionner sans cette amélioration, mais n'autorisez pas les mots de passe contenant des caractères extérieurs au jeu de US-ASCII caractères de base.

Les modifications apportées au modèle qui permettent d'activer cette fonctionnalité sont les suivantes :

  • La GetUserConfigRequest AWS::ApiGateway::Method ressource doit avoir ce RequestTemplates code (la ligne en italique est la ligne mise à jour)

    RequestTemplates: application/json: | { "username": "$util.urlDecode($input.params('username'))", "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")", "protocol": "$input.params('protocol')", "serverId": "$input.params('serverId')", "sourceIp": "$input.params('sourceIp')" }
  • Le RequestParameters pour la GetUserConfig ressource doit changer pour utiliser l'PasswordBase64en-tête (la ligne en italique est la ligne mise à jour) :

    RequestParameters: method.request.header.PasswordBase64: false method.request.querystring.protocol: false method.request.querystring.sourceIp: false
Pour vérifier si le modèle de votre stack est le plus récent
  1. Ouvrez la CloudFormation console à l'adresse https://console.aws.amazon.com/cloudformation.

  2. Dans la liste des piles, choisissez votre pile.

  3. Dans le panneau de détails, choisissez l'onglet Modèle.

  4. Recherchez les éléments suivants :

    • Recherchez RequestTemplates et assurez-vous d'avoir cette ligne :

      "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")",
    • Recherchez RequestParameters et assurez-vous d'avoir cette ligne :

      method.request.header.PasswordBase64: false

Si les lignes mises à jour ne s'affichent pas, modifiez votre pile. Pour plus de détails sur la façon de mettre à jour votre CloudFormation pile, consultez la section Modification d'un modèle de pile dans le AWS CloudFormation Guide de l'utilisateur.