

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Implemente el aislamiento de inquilinos de SaaS para Amazon S3 mediante una máquina expendedora de AWS Lambda fichas
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine"></a>

*Tabby Ward, Thomas Davis y Sravan Periyathambi, Amazon Web Services*

## Resumen
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-summary"></a>

Las aplicaciones SaaS multiusuario deben implementar sistemas para garantizar que se mantenga el aislamiento de los usuarios. Cuando almacenas datos de inquilinos en el mismo AWS recurso (por ejemplo, cuando varios inquilinos almacenan datos en el mismo depósito de Amazon Simple Storage Service (Amazon S3), debes asegurarte de que no se pueda producir el acceso entre inquilinos. Las máquinas expendedoras de fichas (TVMs) son una forma de aislar los datos de los inquilinos. Estas máquinas proporcionan un mecanismo para obtener tokens y, al mismo tiempo, simplifican la complejidad inherente a la creación de dichos tokens. Los desarrolladores pueden usar una TVM sin tener un conocimiento detallado de cómo la máquina produce los tokens.

Este patrón implementa una TVM mediante el uso de. AWS Lambda La TVM genera un token con credenciales del servicio de token de seguridad (STS) temporales que limitan el acceso a los datos de un único usuario de SaaS en un bucket de S3.

TVMs, y el código que se proporciona con este patrón, se suelen utilizar con afirmaciones derivadas de los JSON Web Tokens (JWTs) para asociar las solicitudes de AWS recursos a una política orientada a los inquilinos AWS Identity and Access Management (IAM). Puede usar el código de este patrón como base para implementar una aplicación SaaS que genere credenciales STS temporales y limitadas en función de las afirmaciones proporcionadas en un token JWT.

## Requisitos previos y limitaciones
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-prereqs"></a>

**Requisitos previos **
+ Un activo. Cuenta de AWS
+ AWS Command Line Interface (AWS CLI) [versión 1.19.0 o posterior](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html), instalada y configurada en macOS, Linux o Windows. Como alternativa, puede utilizar la AWS CLI [versión 2.1 o posterior](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html).

**Limitaciones**
+ Este código se ejecuta en Java y, actualmente, no es compatible con otros lenguajes de programación. 
+ La aplicación de ejemplo no incluye compatibilidad AWS entre regiones ni con la recuperación ante desastres (DR). 
+ Este patrón demuestra cómo puede proporcionar acceso limitado a los usuarios una TVM de Lambda para una aplicación SaaS. Este patrón no está diseñado para usarse en entornos de producción sin pruebas de seguridad adicionales como parte de su aplicación o caso de uso específicos.

## Arquitectura
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-architecture"></a>

**Pila de tecnología de destino**
+ AWS Lambda
+ Amazon S3
+ IAM
+ AWS Security Token Service (AWS STS)

**Arquitectura de destino**

![\[Generación de un token para obtener credenciales de STS temporales para acceder a los datos de un bucket de S3.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/97a34c8e-d04e-40b6-acbf-1baa176d22a9/images/14d0508a-703b-4229-85e6-c5094de7fe01.png)


 

## Tools (Herramientas)
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-tools"></a>

**Servicios de AWS**
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) es una herramienta de código abierto que te ayuda a interactuar Servicios de AWS mediante comandos en el shell de la línea de comandos.
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) le ayuda a administrar de forma segura el acceso a sus AWS recursos al controlar quién está autenticado y autorizado a usarlos.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) es un servicio de computación que ayuda a ejecutar código sin necesidad de aprovisionar ni administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.
+ [AWS Security Token Service (AWS STS)](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html) le ayuda a solicitar credenciales temporales con privilegios limitados para los usuarios.
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) es un servicio de almacenamiento de objetos basado en la nube que lo ayuda a almacenar, proteger y recuperar cualquier cantidad de datos.

**Código**

El código fuente de este patrón está disponible como archivo adjunto, e incluye los siguientes archivos:
+ `s3UploadSample.jar` proporciona el código fuente de una función de Lambda que carga un documento JSON en un bucket de S3.
+ `tvm-layer.zip` proporciona una biblioteca Java reutilizable que suministra un token (credenciales temporales de STS) para que la función de Lambda acceda al bucket de S3 y cargue el documento JSON.
+ `token-vending-machine-sample-app.zip` proporciona el código fuente usado para crear estos artefactos y las instrucciones de compilación.

Para usar el código de muestra, siga las instrucciones de la siguiente sección.

## Epics
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-epics"></a>

### Determine los valores de las variables
<a name="determine-variable-values"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Determine los valores de las variables. | La implementación de este patrón incluye varios nombres de variables que deben usarse de manera coherente. Determine los valores a usar para cada variable y proporcione cada valor cuando se le solicite en los siguientes pasos.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine.html) | Administrador de la nube | 

### Creación de un bucket de S3
<a name="create-an-s3-bucket"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un bucket de S3 para la aplicación de ejemplo. | Usa el siguiente AWS CLI comando para crear un bucket de S3. Proporcione el valor de `<sample-app-bucket-name>`** **en el fragmento de código:<pre>aws s3api create-bucket --bucket <sample-app-bucket-name></pre>La aplicación de ejemplo de Lambda carga archivos JSON en este bucket. | Administrador de la nube | 

### Creación de una política y un rol de IAM TVM
<a name="create-the-iam-tvm-role-and-policy"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Crear un rol de TVM. | Utilice uno de los siguientes AWS CLI comandos para crear un rol de IAM. Proporcione el valor de `<sample-tvm-role-name>`** **en el comando.Para los intérprete de comandos para macOS o Linux:<pre>aws iam create-role \<br />--role-name <sample-tvm-role-name> \<br />--assume-role-policy-document '{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Action": [<br />                "sts:AssumeRole"<br />            ],<br />            "Principal": {<br />                "Service": [<br />                    "lambda.amazonaws.com"<br />                ]<br />            },<br />            "Condition": {<br />                "StringEquals": {<br />                    "aws:SourceAccount": "<AWS Account ID>"<br />                }<br />            }<br />        }<br />    ]<br />}'</pre>En la línea de comandos de Windows:<pre>aws iam create-role ^<br />--role-name <sample-tvm-role-name> ^<br />--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>\"}}}]}"</pre>La aplicación de ejemplo de Lambda asume este rol cuando se invoca la aplicación. La capacidad de asumir el rol de aplicación con una política específica otorga al código permisos más amplios para acceder al bucket de S3. | Administrador de la nube | 
| Cree una política de rol de TVM en línea. | Utilice uno de los siguientes AWS CLI comandos para crear una política de IAM. Proporcione los valores de `<sample-tvm-role-name>`,** **`<AWS Account ID>` y `<sample-app-role-name>` en el comando.Para los intérprete de comandos para macOS o Linux:<pre>aws iam put-role-policy \<br />--role-name <sample-tvm-role-name> \<br />--policy-name assume-app-role \<br />--policy-document '{<br />    "Version": "2012-10-17",		 	 	  <br />    "Statement": [<br />        {<br />            "Effect": "Allow", <br />            "Action": "sts:AssumeRole", <br />            "Resource": "arn:aws:iam::<AWS Account ID>:role/<sample-app-role-name>"<br />        }<br />    ]}'</pre>En la línea de comandos de Windows:<pre>aws iam put-role-policy ^<br />--role-name <sample-tvm-role-name> ^<br />--policy-name assume-app-role ^<br />--policy-document "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Effect\": \"Allow\", \"Action\": \"sts:AssumeRole\", \"Resource\": \"arn:aws:iam::<AWS Account ID>:role/<sample-app-role-name>\"}]}"</pre>Esta política está asociada al rol de TVM. Proporciona la capacidad de asumir el rol de aplicación que otorga permisos más amplios para acceder al bucket de S3. | Administrador de la nube | 
| Adjunte la política de Lambda gestionada. | Utilice el siguiente AWS CLI comando para adjuntar la política de `AWSLambdaBasicExecutionRole` IAM. Proporcione el valor de `<sample-tvm-role-name>` en el comando:<pre>aws iam attach-role-policy \<br />--role-name <sample-tvm-role-name> \<br />--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole</pre>En la línea de comandos de Windows:<pre>aws iam attach-role-policy ^<br />--role-name <sample-tvm-role-name> ^<br />--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole</pre>Esta política gestionada se adjunta a la función TVM para permitir que Lambda envíe registros a Amazon. CloudWatch | Administrador de la nube | 

### Cree la política y el rol de aplicación de IAM
<a name="create-the-iam-application-role-and-policy"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Crear el rol de la aplicación. | Utilice uno de los siguientes AWS CLI comandos para crear un rol de IAM. Proporcione los valores de `<sample-app-role-name>`, `<AWS Account ID>` y `<sample-tvm-role-name>` en el comando.Para los intérprete de comandos para macOS o Linux:<pre>aws iam create-role \<br />--role-name <sample-app-role-name> \<br />--assume-role-policy-document '{<br />    "Version": "2012-10-17",		 	 	  <br />    "Statement": [<br />        {<br />            "Effect": <br />            "Allow",<br />            "Principal": {<br />                "AWS": "arn:aws:iam::<AWS Account ID>:role/<sample-tvm-role-name>"<br />            },<br />            "Action": "sts:AssumeRole"<br />        }<br />    ]}'</pre>En la línea de comandos de Windows:<pre>aws iam create-role ^<br />--role-name <sample-app-role-name> ^<br />--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\"}]}"</pre>La aplicación de ejemplo de Lambda asume esta función con una política específica para obtener acceso basado en usuario a un bucket de S3. | Administrador de la nube | 
| Cree una política de rol de aplicación en línea. | Utilice uno de los siguientes comandos para crear una AWS CLI política de IAM. Proporcione los valores de `<sample-app-role-name>` y `<sample-app-bucket-name>`** **en el comando.Para los intérprete de comandos para macOS o Linux:<pre>aws iam put-role-policy \<br />--role-name <sample-app-role-name> \<br />--policy-name s3-bucket-access \<br />--policy-document '{<br />    "Version": "2012-10-17",		 	 	  <br />    "Statement": [<br />        {<br />            "Effect": "Allow", <br />            "Action": [<br />                "s3:PutObject", <br />                "s3:GetObject", <br />                "s3:DeleteObject"<br />            ], <br />            "Resource": "arn:aws:s3:::<sample-app-bucket-name>/*"<br />        }, <br />        {<br />            "Effect": "Allow", <br />            "Action": ["s3:ListBucket"], <br />            "Resource": "arn:aws:s3:::<sample-app-bucket-name>"<br />        }<br />    ]}'</pre>En la línea de comandos de Windows:<pre>aws iam put-role-policy ^<br />--role-name <sample-app-role-name> ^<br />--policy-name s3-bucket-access ^<br />--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>\"}]}"</pre>Esta política está asociada al rol de la aplicación. Proporciona un acceso amplio a los objetos del bucket de S3. Cuando la aplicación de ejemplo asume el rol, estos permisos se asignan a un usuario específico con la política de TVM generada de forma dinámica. | Administrador de la nube | 

### Cree la aplicación de muestra de Lambda con TVM
<a name="create-the-lam-sample-application-with-tvm"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Descargue los archivos fuente compilados. | Descargue los archivos `s3UploadSample.jar` y `tvm-layer.zip`****, que se incluyen como adjuntos. El código fuente utilizado para crear estos artefactos y las instrucciones de compilación se proporcionan en `token-vending-machine-sample-app.zip`. | Administrador de la nube | 
| Cree la capa de Lambda. | Utilice el siguiente AWS CLI comando para crear una capa Lambda, que haga que Lambda pueda acceder a la TVM. Si no ejecuta este comando desde la ubicación en la que descargó ` tvm-layer.zip`, indique la ruta correcta a `tvm-layer.zip` en el parámetro `--zip-file`. <pre>aws lambda publish-layer-version \<br />--layer-name sample-token-vending-machine \<br />--compatible-runtimes java11 \<br />--zip-file fileb://tvm-layer.zip</pre>En la línea de comandos de Windows:<pre>aws lambda publish-layer-version ^<br />--layer-name sample-token-vending-machine ^<br />--compatible-runtimes java11 ^<br />--zip-file fileb://tvm-layer.zip</pre>Este comando crea una capa de Lambda que contiene la biblioteca TVM reutilizable. | Administrador de la nube, desarrollador de aplicaciones | 
| Crear la función de Lambda. | Utilice el siguiente AWS CLI comando para crear una función Lambda. Proporcione los valores de `<sample-app-function-name>`, `<AWS Account ID>`, `<AWS Region>`, `<sample-tvm-role-name>`, `<sample-app-bucket-name>` y `<sample-app-role-name>` en el comando. Si no ejecuta este comando desde la ubicación en la que descargó `s3UploadSample.jar`, indique la ruta correcta a `s3UploadSample.jar` en el parámetro `--zip-file`. <pre>aws lambda create-function \<br />--function-name <sample-app-function-name>  \<br />--timeout 30 \<br />--memory-size 256 \<br />--runtime java11 \<br />--role arn:aws:iam::<AWS Account ID>:role/<sample-tvm-role-name> \<br />--handler com.amazon.aws.s3UploadSample.App \<br />--zip-file fileb://s3UploadSample.jar \<br />--layers arn:aws:lambda:<AWS Region>:<AWS Account ID>:layer:sample-token-vending-machine:1 \<br />--environment "Variables={S3_BUCKET=<sample-app-bucket-name>,<br />ROLE=arn:aws:iam::<AWS Account ID>:role/<sample-app-role-name>}"</pre>En la línea de comandos de Windows:<pre>aws lambda create-function ^<br />--function-name <sample-app-function-name>  ^<br />--timeout 30 ^<br />--memory-size 256 ^<br />--runtime java11 ^<br />--role arn:aws:iam::<AWS Account ID>:role/<sample-tvm-role-name> ^<br />--handler com.amazon.aws.s3UploadSample.App ^<br />--zip-file fileb://s3UploadSample.jar ^<br />--layers arn:aws:lambda:<AWS Region>:<AWS Account ID>:layer:sample-token-vending-machine:1 ^<br />--environment "Variables={S3_BUCKET=<sample-app-bucket-name>,ROLE=arn:aws:iam::<AWS Account ID>:role/<sample-app-role-name>}"</pre>Este comando crea una función de Lambda con el código de la aplicación de ejemplo y la capa de TVM adjunta. También establece dos variables de entorno: `S3_BUCKET` y `ROLE`. La aplicación de ejemplo usa estas variables para determinar el rol que debe asumir y el bucket de S3 en el que se deben cargar los documentos JSON. | Administrador de la nube, desarrollador de aplicaciones | 

### Pruebe la aplicación de muestra y TVM
<a name="test-the-sample-application-and-tvm"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Invoque la aplicación de ejemplo de Lambda. | Utilice uno de los siguientes AWS CLI comandos para iniciar la aplicación de ejemplo de Lambda con la carga útil esperada. Proporcione los valores de `<sample-app-function-name>` y `<sample-tenant-name>` en el comando.Para intérprete de comandos macOS y Linux:<pre>aws lambda invoke \<br />--function <sample-app-function-name> \<br />--invocation-type RequestResponse \<br />--payload '{"tenant": "<sample-tenant-name>"}' \<br />--cli-binary-format raw-in-base64-out response.json</pre>En la línea de comandos de Windows:<pre>aws lambda invoke ^<br />--function <sample-app-function-name> ^<br />--invocation-type RequestResponse ^<br />--payload "{\"tenant\": \"<sample-tenant-name>\"}" ^<br />--cli-binary-format raw-in-base64-out response.json</pre>Este comando llama a la función de Lambda y devuelve el resultado en un documento `response.json`. En muchos sistemas basados en Unix, puede cambiar `response.json` a `/dev/stdout` para enviar los resultados directamente a su intérprete de comandos sin necesidad de crear otro archivo. Si cambia el valor de `<sample-tenant-name>` en las siguientes invocaciones de esta función de Lambda, se modificará la ubicación del documento JSON y los permisos proporcionados por el token. | Administrador de la nube, desarrollador de aplicaciones | 
| Acceda al bucket de S3 para ver los objetos creados. | Acceda al bucket de S3 (`<sample-app-bucket-name>`) que creó anteriormente. Este bucket contiene un prefijo de objeto de S3 con el valor de `<sample-tenant-name>`. Bajo ese prefijo, encontrará un documento JSON denominado con un UUID. Si invoca la aplicación de ejemplo varias veces, se añadirán más documentos JSON. | Administrador de la nube | 
| Vea los registros de la aplicación de muestra en CloudWatch Logs. | Vea los registros que están asociados a la función Lambda nombrada `<sample-app-function-name>` en CloudWatch Logs. Para obtener instrucciones, consulte [Envío de registros de funciones de Lambda a CloudWatch registros](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html) en la documentación de Lambda. En estos registros puede ver la política basada en usuario generada por la TVM. Esta política dirigida al inquilino otorga permisos para la aplicación de ejemplo a Amazon S3 **PutObject**,, y **GetObject**DeleteObject**ListBucket****** APIs, pero solo para el prefijo de objeto al que está asociado. `<sample-tenant-name>` En las siguientes invocaciones de la aplicación de muestra, si cambia `<sample-tenant-name>`, la TVM actualizará la política con el ámbito de aplicación para adaptarla al inquilino proporcionado en la carga útil de invocación. Esta política generada dinámicamente muestra cómo se puede mantener el acceso basado en usuario con una TVM en aplicaciones SaaS. La funcionalidad de TVM se proporciona en una capa de Lambda. Así, es posible adjuntarla a otras funciones de Lambda usadas por una aplicación sin tener que replicar el código.Para ver un ejemplo de la política generada dinámicamente, consulte la sección de [Información adicional](#implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-additional). | Administrador de la nube | 

## Recursos relacionados
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-resources"></a>
+ [Aislar a los usuarios con políticas de IAM generadas dinámicamente](https://aws.amazon.com/blogs/apn/isolating-saas-tenants-with-dynamically-generated-iam-policies/) (publicación del blog)
+ [Applying Dynamically Generated Isolation Policies in SaaS Environments](https://aws.amazon.com/blogs/apn/applying-dynamically-generated-isolation-policies-in-saas-environments/) (entrada en el blog)
+ [SaaS en AWS](https://aws.amazon.com/saas/)

## Información adicional
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-additional"></a>

En el siguiente registro se muestra la política generada de forma dinámica y creada por el código de la TVM de este patrón. En esta captura de pantalla, `<sample-app-bucket-name>` es `DOC-EXAMPLE-BUCKET` y `<sample-tenant-name>` es `test-tenant-1`. Las credenciales de STS emitidas por esta política limitada no pueden realizar ninguna acción en los objetos del bucket de S3, excepto en aquellos objetos asociados al prefijo de clave de objeto `test-tenant-1`.

![\[Registro en el que se muestra una política generada de forma dinámica y creada por el código de la TVM.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/97a34c8e-d04e-40b6-acbf-1baa176d22a9/images/d4776ebe-fb8f-41ac-b8c5-b4f97a821c8c.png)


## Conexiones
<a name="attachments-97a34c8e-d04e-40b6-acbf-1baa176d22a9"></a>

Para acceder al contenido adicional asociado a este documento, descomprima el archivo: [attachment.zip](samples/p-attach/97a34c8e-d04e-40b6-acbf-1baa176d22a9/attachments/attachment.zip)