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.
Mettez en œuvre l'isolation des locataires SaaS pour Amazon S3 à l'aide d'un distributeur automatique de AWS Lambda jetons
Tabby Ward, Thomas Davis et Sravan Periyathambi, Amazon Web Services
Récapitulatif
Les applications SaaS mutualisées doivent mettre en œuvre des systèmes garantissant le maintien de l'isolement des locataires. Lorsque vous stockez des données de locataires sur la même AWS ressource, par exemple lorsque plusieurs locataires stockent des données dans le même compartiment Amazon Simple Storage Service (Amazon S3), vous devez vous assurer qu'aucun accès entre locataires ne peut avoir lieu. Les distributeurs automatiques de jetons (TVMs) constituent un moyen d'isoler les données des locataires. Ces machines fournissent un mécanisme permettant d'obtenir des jetons tout en faisant abstraction de la complexité de la façon dont ces jetons sont générés. Les développeurs peuvent utiliser un TVM sans avoir une connaissance détaillée de la façon dont il produit des jetons.
Ce modèle implémente un TVM en utilisant AWS Lambda. Le TVM génère un jeton composé d'informations d'identification temporaires du service de jetons de sécurité (STS) qui limitent l'accès aux données d'un seul locataire SaaS dans un compartiment S3.
TVMs, et le code fourni avec ce modèle, sont généralement utilisés avec des revendications dérivées de JSON Web Tokens (JWTs) pour associer les demandes de AWS ressources à une politique IAM AWS Identity and Access Management (tenant-scoped). Vous pouvez utiliser le code de ce modèle comme base pour implémenter une application SaaS qui génère des informations d'identification STS temporaires et étendues sur la base des revendications fournies dans un jeton JWT.
Conditions préalables et limitations
Prérequis
Limites
Ce code fonctionne en Java et ne prend actuellement pas en charge les autres langages de programmation.
L'exemple d'application n'inclut pas de support AWS interrégional ou de reprise après sinistre (DR).
Ce modèle montre comment un Lambda TVM pour une application SaaS peut fournir un accès étendu aux locataires. Ce modèle n'est pas destiné à être utilisé dans des environnements de production sans tests de sécurité supplémentaires dans le cadre de votre application ou de votre cas d'utilisation spécifique.
Architecture
Pile technologique cible
Architecture cible
Services AWS
AWS Command Line Interface (AWS CLI) est un outil open source qui vous permet d'interagir Services AWS par le biais de commandes dans votre interface de ligne de commande.
AWS Identity and Access Management (IAM) vous aide à gérer en toute sécurité l'accès à vos AWS ressources en contrôlant qui est authentifié et autorisé à les utiliser.
AWS Lambda est un service de calcul qui vous aide à exécuter du code sans avoir à allouer ni à gérer des serveurs. Il exécute votre code uniquement lorsque cela est nécessaire et évolue automatiquement, de sorte que vous ne payez que pour le temps de calcul que vous utilisez.
AWS Security Token Service (AWS STS) vous permet de demander des informations d'identification temporaires à privilèges limités pour les utilisateurs.
Amazon Simple Storage Service (Amazon S3) est un service de stockage d'objets basé sur le cloud qui vous permet de stocker, de protéger et de récupérer n'importe quel volume de données.
Code
Le code source de ce modèle est disponible sous forme de pièce jointe et inclut les fichiers suivants :
s3UploadSample.jar
fournit le code source d'une fonction Lambda qui télécharge un document JSON dans un compartiment S3.
tvm-layer.zip
fournit une bibliothèque Java réutilisable qui fournit un jeton (informations d'identification temporaires STS) permettant à la fonction Lambda d'accéder au compartiment S3 et de télécharger le document JSON.
token-vending-machine-sample-app.zip
fournit le code source utilisé pour créer ces artefacts et les instructions de compilation.
Pour utiliser ces fichiers, suivez les instructions de la section suivante.
Épopées
Tâche | Description | Compétences requises |
---|
Déterminez les valeurs des variables. | L'implémentation de ce modèle inclut plusieurs noms de variables qui doivent être utilisés de manière cohérente. Déterminez les valeurs qui doivent être utilisées pour chaque variable et fournissez cette valeur lorsque cela est demandé lors des étapes suivantes. <AWS Account ID> ─ L'identifiant de compte à 12 chiffres associé au modèle dans lequel Compte AWS vous implémentez ce modèle. Pour plus d'informations sur la façon de trouver votre Compte AWS identifiant, consultez la section Utilisation d'un alias pour votre Compte AWS identifiant dans la documentation IAM.
<AWS Region> ─ Le modèle dans Région AWS lequel vous implémentez ce modèle. Pour plus d'informations Régions AWS, consultez la section Régions et zones de disponibilité sur le AWS site Web.
<sample-tenant-name> ─ Le nom du locataire à utiliser dans l'application. Pour des raisons de simplicité, nous vous recommandons de n'utiliser que des caractères alphanumériques dans cette valeur, mais vous pouvez utiliser n'importe quel nom valide pour une clé d'objet S3.
<sample-tvm-role-name> ─ Nom du rôle IAM associé à la fonction Lambda qui exécute le TVM et un exemple d'application. Le nom du rôle est une chaîne composée de caractères alphanumériques majuscules et minuscules sans espaces. Vous pouvez également inclure l'un des caractères suivants : trait de soulignement (_), signe plus (+), signe égal (=), virgule (,), point (.), signe arobase (@) et tiret (-). Le nom du rôle doit être unique dans le compte.
<sample-app-role-name> ─ Nom du rôle IAM assumé par la fonction Lambda lorsqu'elle génère des informations d'identification STS temporaires et étendues. Le nom du rôle est une chaîne composée de caractères alphanumériques majuscules et minuscules sans espaces. Vous pouvez également inclure l'un des caractères suivants : trait de soulignement (_), signe plus (+), signe égal (=), virgule (,), point (.), signe arobase (@) et tiret (-). Le nom du rôle doit être unique dans le compte.
<sample-app-function-name> ─ Le nom de la fonction Lambda. Il s'agit d'une chaîne de 64 caractères maximum.
<sample-app-bucket-name> ─ Le nom d'un compartiment S3 auquel il faut accéder avec des autorisations attribuées à un locataire spécifique. Noms des compartiments S3 :
Ils doivent comporter entre 3 et 63 caractères. Doit être composé uniquement de lettres minuscules, de chiffres, de points (.) et de tirets (-). Doit commencer et se terminer par une lettre ou un chiffre. Ils ne doivent pas être formatés en tant qu'adresse IP (par exemple, 192.168.5.4). Doit être unique au sein d'une partition. Une partition est un regroupement de régions. AWS possède actuellement trois partitions : aws pour les régions standard, aws-cn pour les régions de Chine et aws-us-gov pour AWS GovCloud (US) Regions.
| Administrateur du cloud |
Tâche | Description | Compétences requises |
---|
Créez un compartiment S3 pour l'exemple d'application. | Utilisez la AWS CLI commande suivante pour créer un compartiment S3. Indiquez la <sample-app-bucket-name> valeur dans l'extrait de code : aws s3api create-bucket --bucket <sample-app-bucket-name>
L'exemple d'application Lambda télécharge des fichiers JSON dans ce compartiment. | Administrateur du cloud |
Tâche | Description | Compétences requises |
---|
Créez un rôle TVM. | Utilisez l'une des AWS CLI commandes suivantes pour créer un rôle IAM. Entrez la <sample-tvm-role-name> valeur dans la commande. Pour les shells macOS ou Linux : aws iam create-role \
--role-name <sample-tvm-role-name> \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Principal": {
"Service": [
"lambda.amazonaws.com"
]
},
"Condition": {
"StringEquals": {
"aws:SourceAccount": "<AWS Account ID>"
}
}
}
]
}'
Pour la ligne de commande Windows : aws iam create-role ^
--role-name <sample-tvm-role-name> ^
--assume-role-policy-document "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Effect\": \"Allow\", \"Action\": [\"sts:AssumeRole\"], \"Principal\": {\"Service\": [\"lambda.amazonaws.com\"]}, \"Condition\": {\"StringEquals\": {\"aws:SourceAccount\": \"<AWS Account ID>\"}}}]}"
L'exemple d'application Lambda assume ce rôle lorsqu'elle est invoquée. La possibilité d'assumer le rôle d'application avec une politique étendue donne au code des autorisations plus étendues pour accéder au compartiment S3. | Administrateur du cloud |
Créez une politique de rôle TVM intégrée. | Utilisez l'une des AWS CLI commandes suivantes pour créer une politique IAM. Indiquez les <sample-app-role-name> valeurs <sample-tvm-role-name> <AWS Account ID> , et dans la commande. Pour les shells macOS ou Linux : aws iam put-role-policy \
--role-name <sample-tvm-role-name> \
--policy-name assume-app-role \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::<AWS Account ID>:role/<sample-app-role-name>"
}
]}'
Pour la ligne de commande Windows : aws iam put-role-policy ^
--role-name <sample-tvm-role-name> ^
--policy-name assume-app-role ^
--policy-document "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Effect\": \"Allow\", \"Action\": \"sts:AssumeRole\", \"Resource\": \"arn:aws:iam::<AWS Account ID>:role/<sample-app-role-name>\"}]}"
Cette politique est liée au rôle TVM. Cela donne au code la capacité d'assumer le rôle d'application, qui dispose d'autorisations plus larges pour accéder au compartiment S3. | Administrateur du cloud |
Joignez la politique Lambda gérée. | Utilisez la AWS CLI commande suivante pour joindre la politique AWSLambdaBasicExecutionRole IAM. Entrez la <sample-tvm-role-name> valeur dans la commande : aws iam attach-role-policy \
--role-name <sample-tvm-role-name> \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Pour la ligne de commande Windows : aws iam attach-role-policy ^
--role-name <sample-tvm-role-name> ^
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Cette politique gérée est associée au rôle TVM pour permettre à Lambda d'envoyer des journaux à Amazon. CloudWatch | Administrateur du cloud |
Tâche | Description | Compétences requises |
---|
Créez le rôle d'application. | Utilisez l'une des AWS CLI commandes suivantes pour créer un rôle IAM. Indiquez les <sample-tvm-role-name> valeurs <sample-app-role-name> <AWS Account ID> , et dans la commande. Pour les shells macOS ou Linux : aws iam create-role \
--role-name <sample-app-role-name> \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect":
"Allow",
"Principal": {
"AWS": "arn:aws:iam::<AWS Account ID>:role/<sample-tvm-role-name>"
},
"Action": "sts:AssumeRole"
}
]}'
Pour la ligne de commande Windows : aws iam create-role ^
--role-name <sample-app-role-name> ^
--assume-role-policy-document "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Effect\": \"Allow\",\"Principal\": {\"AWS\": \"arn:aws:iam::<AWS Account ID>:role/<sample-tvm-role-name>\"},\"Action\": \"sts:AssumeRole\"}]}"
L'exemple d'application Lambda assume ce rôle avec une politique définie pour obtenir un accès basé sur le locataire à un compartiment S3. | Administrateur du cloud |
Créez une politique de rôle d'application en ligne. | Utilisez l'une des commandes suivantes AWS CLI pour créer une politique IAM. Indiquez les <sample-app-bucket-name> valeurs <sample-app-role-name> et dans la commande. Pour les shells macOS ou Linux : aws iam put-role-policy \
--role-name <sample-app-role-name> \
--policy-name s3-bucket-access \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::<sample-app-bucket-name>/*"
},
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": "arn:aws:s3:::<sample-app-bucket-name>"
}
]}'
Pour la ligne de commande Windows : aws iam put-role-policy ^
--role-name <sample-app-role-name> ^
--policy-name s3-bucket-access ^
--policy-document "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Effect\": \"Allow\", \"Action\": [\"s3:PutObject\", \"s3:GetObject\", \"s3:DeleteObject\"], \"Resource\": \"arn:aws:s3:::<sample-app-bucket-name>/*\"}, {\"Effect\": \"Allow\", \"Action\": [\"s3:ListBucket\"], \"Resource\": \"arn:aws:s3:::<sample-app-bucket-name>\"}]}"
Cette politique est associée au rôle d'application. Il fournit un accès étendu aux objets du compartiment S3. Lorsque l'exemple d'application assume le rôle, ces autorisations sont étendues à un locataire spécifique avec la politique générée dynamiquement par le TVM. | Administrateur du cloud |
Tâche | Description | Compétences requises |
---|
Téléchargez les fichiers source compilés. | Téléchargez les tvm-layer.zip fichiers s3UploadSample.jar et, qui sont inclus sous forme de pièces jointes. Le code source utilisé pour créer ces artefacts et les instructions de compilation sont fournis dans. token-vending-machine-sample-app.zip | Administrateur du cloud |
Créez la couche Lambda. | Utilisez la AWS CLI commande suivante pour créer une couche Lambda, qui rend le TVM accessible à Lambda. Si vous n'exécutez pas cette commande depuis l'emplacement où vous l'avez téléchargée tvm-layer.zip , indiquez le chemin d'accès correct tvm-layer.zip dans le --zip-file paramètre. aws lambda publish-layer-version \
--layer-name sample-token-vending-machine \
--compatible-runtimes java11 \
--zip-file fileb://tvm-layer.zip
Pour la ligne de commande Windows : aws lambda publish-layer-version ^
--layer-name sample-token-vending-machine ^
--compatible-runtimes java11 ^
--zip-file fileb://tvm-layer.zip
Cette commande crée une couche Lambda qui contient la bibliothèque TVM réutilisable. | Administrateur cloud, développeur d'applications |
Créez la fonction Lambda. | Utilisez la AWS CLI commande suivante pour créer une fonction Lambda. Indiquez les <sample-app-role-name> valeurs <sample-app-function-name> <AWS Account ID> ,<AWS Region> , <sample-tvm-role-name> <sample-app-bucket-name> ,, et dans la commande. Si vous n'exécutez pas cette commande depuis l'emplacement où vous l'avez téléchargées3UploadSample.jar , indiquez le chemin d'accès correct s3UploadSample.jar dans le --zip-file paramètre. aws lambda create-function \
--function-name <sample-app-function-name> \
--timeout 30 \
--memory-size 256 \
--runtime java11 \
--role arn:aws:iam::<AWS Account ID>:role/<sample-tvm-role-name> \
--handler com.amazon.aws.s3UploadSample.App \
--zip-file fileb://s3UploadSample.jar \
--layers arn:aws:lambda:<AWS Region>:<AWS Account ID>:layer:sample-token-vending-machine:1 \
--environment "Variables={S3_BUCKET=<sample-app-bucket-name>,
ROLE=arn:aws:iam::<AWS Account ID>:role/<sample-app-role-name>}"
Pour la ligne de commande Windows : aws lambda create-function ^
--function-name <sample-app-function-name> ^
--timeout 30 ^
--memory-size 256 ^
--runtime java11 ^
--role arn:aws:iam::<AWS Account ID>:role/<sample-tvm-role-name> ^
--handler com.amazon.aws.s3UploadSample.App ^
--zip-file fileb://s3UploadSample.jar ^
--layers arn:aws:lambda:<AWS Region>:<AWS Account ID>:layer:sample-token-vending-machine:1 ^
--environment "Variables={S3_BUCKET=<sample-app-bucket-name>,ROLE=arn:aws:iam::<AWS Account ID>:role/<sample-app-role-name>}"
Cette commande crée une fonction Lambda avec l'exemple de code d'application et la couche TVM attachés. Il définit également deux variables d'environnement : S3_BUCKET etROLE . L'exemple d'application utilise ces variables pour déterminer le rôle à assumer et le compartiment S3 dans lequel télécharger les documents JSON. | Administrateur cloud, développeur d'applications |
Tâche | Description | Compétences requises |
---|
Appelez l'exemple d'application Lambda. | Utilisez l'une des AWS CLI commandes suivantes pour démarrer l'exemple d'application Lambda avec la charge utile attendue. Indiquez les <sample-tenant-name> valeurs <sample-app-function-name> et dans la commande. Pour les shells macOS et Linux : aws lambda invoke \
--function <sample-app-function-name> \
--invocation-type RequestResponse \
--payload '{"tenant": "<sample-tenant-name>"}' \
--cli-binary-format raw-in-base64-out response.json
Pour la ligne de commande Windows : aws lambda invoke ^
--function <sample-app-function-name> ^
--invocation-type RequestResponse ^
--payload "{\"tenant\": \"<sample-tenant-name>\"}" ^
--cli-binary-format raw-in-base64-out response.json
Cette commande appelle la fonction Lambda et renvoie le résultat dans un response.json document. Sur de nombreux systèmes basés sur Unix, vous pouvez passer response.json /dev/stdout à pour afficher les résultats directement dans votre shell sans créer un autre fichier. La modification de la <sample-tenant-name> valeur lors des appels ultérieurs de cette fonction Lambda modifie l'emplacement du document JSON et les autorisations fournies par le jeton. | Administrateur cloud, développeur d'applications |
Consultez le compartiment S3 pour voir les objets créés. | Accédez au compartiment S3 (<sample-app-bucket-name> ) que vous avez créé précédemment. Ce compartiment contient un préfixe d'objet S3 dont la valeur est. <sample-tenant-name> Sous ce préfixe, vous trouverez un document JSON nommé avec un UUID. Le fait d'invoquer plusieurs fois l'exemple d'application permet d'ajouter d'autres documents JSON. | Administrateur du cloud |
Consultez les journaux de l'exemple d'application dans CloudWatch Logs. | Affichez les journaux associés à la fonction Lambda nommée <sample-app-function-name> dans CloudWatch Logs. Pour obtenir des instructions, consultez la section Envoi des journaux de fonctions Lambda vers CloudWatch Logs dans la documentation Lambda. Vous pouvez consulter la politique définie par le locataire générée par le TVM dans ces journaux. Cette politique limitée au locataire donne des autorisations pour l'exemple d'application à Amazon S3 PutObject,, GetObject, et DeleteObjectListBucket APIs, mais uniquement pour le préfixe d'objet associé à. <sample-tenant-name> Lors des appels ultérieurs de l'exemple d'application, si vous modifiez<sample-tenant-name> , le TVM met à jour la politique étendue pour qu'elle corresponde au locataire indiqué dans la charge utile d'invocation. Cette politique générée dynamiquement montre comment l'accès limité au locataire peut être maintenu avec un TVM dans les applications SaaS. La fonctionnalité TVM est fournie dans une couche Lambda afin qu'elle puisse être associée à d'autres fonctions Lambda utilisées par une application sans avoir à répliquer le code. Pour une illustration de la politique générée dynamiquement, consultez la section Informations supplémentaires. | Administrateur du cloud |
Ressources connexes
Informations supplémentaires
Le journal suivant montre la politique générée dynamiquement produite par le code TVM selon ce modèle. Dans cette capture d'écran, le <sample-app-bucket-name>
est DOC-EXAMPLE-BUCKET
et le <sample-tenant-name>
esttest-tenant-1
. Les informations d'identification STS renvoyées par cette politique étendue ne peuvent effectuer aucune action sur les objets du compartiment S3, à l'exception des objets associés au préfixe de clé test-tenant-1
d'objet.
Pièces jointes
Pour accéder au contenu supplémentaire associé à ce document, décompressez le fichier suivant : attachment.zip