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 décrit 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 tirer parti de ses capacités AWS WAF de blocage géographique ou de limitation de débit des demandes.

Limitations liées à l'utilisation d'une API Gateway 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 API Gateway privée.

Si vous avez besoin de l'une ou l'autre de ces options, vous pouvez utiliser Lambda comme fournisseur d'identité, sans API Gateway. Pour plus de détails, 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 tous les appels d'API entrants soient transmis avec une sécurité accrue. Pour plus de détails sur le service API Gateway, consultez le guide du développeur d'API Gateway.

API Gateway propose une méthode d'autorisation nomméeAWS_IAM, qui vous donne la même authentification basée sur AWS Identity and Access Management (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 d'applications Web qui vous permet de surveiller les requêtes HTTP et HTTPS qui sont transmises à Amazon API Gateway. Pour plus de détails, consultez Ajouter un pare-feu pour applications Web.

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

    Note

    Les modèles de pile ont été mis à jour pour utiliser des mots de passe codés en Base64 : pour plus de détails, voir. Améliorations apportées aux AWS CloudFormation modèles

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

    2. Suivez les instructions pour déployer une AWS CloudFormation pile à partir d'un modèle existant dans la section Sélection d'un modèle de pile dans le 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 basée sur des données à 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 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 fonction Lambda pour faire quelque chose de différent.

    Important

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

    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 si vous activez l'enregistrement des demandes et des réponses fourni par API Gateway, API Gateway enregistre les mots de passe de vos utilisateurs sur votre Amazon Logs. CloudWatch Nous vous déconseillons d'utiliser ce journal dans votre environnement de production. Pour plus d'informations, consultez la section Configurer CloudWatch 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 l'API du modèle de base Transfer Custom Identity Provider générée par le AWS CloudFormation modèle. Vous devrez peut-être sélectionner votre région pour voir vos passerelles.

    3. Dans le volet Ressources, sélectionnez 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 l'étape de déploiement, choisissez prod, puis 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 l'étape suivante.

    Détails de l'étape avec l'URL Invoke surlignée.
  4. Ouvrez la AWS Transfer Family console à l'adresse https://console.aws.amazon.com/transfer/.

  5. Une Transfer Family aurait dû être créée pour vous, lorsque vous avez créé la pile. Dans le cas contraire, configurez votre serveur en suivant ces étapes.

    1. Choisissez Create server pour ouvrir la page Create server. 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 ci-dessous.

      L'écran du fournisseur d'identité avec le fournisseur d'identité personnalisé sélectionné et avec l'API Gateway choisie pour la connexion à votre fournisseur d'identité.
    2. Dans la zone de texte Provide an Amazon API Gateway URL, collez l'adresse URL Invoke 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 AWS CloudFormation modèle. Ce rôle permet à Transfer Family d'invoquer votre méthode de passerelle d'API.

      Le rôle d'invocation contient le nom de AWS 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 cases restantes, puis choisissez Create server. Pour plus de détails sur les étapes restantes de création d'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 de ressource 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 Resources de l'API Gateway affichant les détails de la GET méthode.
Note

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

Si Transfer Family tente d'authentifier votre utilisateur par mot de passe, le service fournit un champ d'Password:en-tête. En l'absence d'Password:en-tête, Transfer Family tente de s'authentifier 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 garantir que les données stockées dans vos compartiments S3 ou dans votre système de fichiers Amazon EFS ne sont accessibles via les protocoles pris en charge qu'à 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 de ressource RESTful.

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

Exemple de réponse Amazon S3

Le corps de réponse d'exemple est un document JSON au format suivant 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": "/DOC-EXAMPLE-BUCKET/path/to/home/directory" }
Note

La politique est ignoré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:::DOC-EXAMPLE-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 de base logique.

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

Le corps de réponse d'exemple est un document JSON au format suivant 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. Lors de l'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 exemple d'une telle réponse est un objet JSON vide.

L'exemple de réponse suivant montre un utilisateur dont le type de répertoire de base 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 le fichier Node.js. Pour plus d'informations sur Lambda, consultez le guide du AWS Lambda développeur ou la 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), l'ID du serveur, le 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 de transfert de fichiers (FTP), nous recommandons de conserver des informations d'identification distinctes pour le protocole de transfert de fichiers (SFTP) Secure Shell (SSH) et le protocole de transfert de fichiers via SSL (FTPS). Nous recommandons de conserver des informations d'identification distinctes pour le protocole FTP car, contrairement au protocole SFTP et au protocole FTPS, le protocole FTP transmet les informations d'identification en texte clair. En isolant les informations d'identification FTP du protocole SFTP ou FTPS, si les informations d'identification FTP sont partagées ou exposées, vos charges de travail utilisant le protocole SFTP ou FTPS restent sécurisées.

Cet exemple de fonction renvoie le rôle et les détails 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 de base, 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 HomeDirectoryTypechamp.

  • 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.

  • HomeDirectoryTypeset to LOGICALNe définit aucun HomeDirectory champ. Nous avons plutôt défini un HomeDirectoryDetails champ qui fournit les mappages entrée/cible souhaités, similaires aux valeurs décrites dans le HomeDirectoryDetailsparamètre pour les utilisateurs gérés par des 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 modèle AWS CloudFormation . La fonction Lambda interroge le service Secrets Manager avec 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 AWS CloudFormation modèle utilisant cette fonction Lambda, accédez au compartiment Amazon S3 fourni par. AWS Transfer Family

Améliorations apportées aux AWS CloudFormation modèles

Des améliorations ont été apportées à l'interface API Gateway dans les CloudFormation modèles publiés. Les modèles utilisent désormais des mots de passe codés en Base64 avec l'API Gateway. Vos déploiements existants continuent de fonctionner sans cette amélioration, mais n'autorisent pas les mots de passe contenant des caractères autres que le jeu de caractères US-ASCII de base.

Les modifications apportées au modèle pour 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 nom de 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 AWS 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 mise à jour de votre AWS CloudFormation pile, consultez la section Modification d'un modèle de pile dans le AWS CloudFormation guide de l'utilisateur.