Implemente el aislamiento de usuarios de SaaS para Amazon S3 mediante una máquina expendedora de tokens de AWS Lambda - Recomendaciones de AWS

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 usuarios de SaaS para Amazon S3 mediante una máquina expendedora de tokens de AWS Lambda

Creado por Tabby Ward (AWS), Sravan Periyathambi (AWS) y Thomas Davis (AWS)

Entorno: PoC o piloto

Tecnologías: modernización; SaaS

Servicios de AWS: AWS Identity and Access Management; AWS Lambda; Amazon S3; AWS STS

Resumen

Las aplicaciones SaaS multiusuario deben implementar sistemas para garantizar que se mantenga el aislamiento de los usuarios. Cuando almacena datos de usuarios en un mismo recurso de Amazon Web Services (AWS) (por ejemplo, varios usuarios almacenan datos en un mismo bucket de Amazon Simple Storage Service (Amazon S3), debe asegurarse de impedir el acceso cruzado de los usuarios. Las máquinas expendedoras de tokens (TVM) permiten aislar los datos de los usuarios. 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 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.

Las TVM, y el código que se proporciona con este patrón, suelen usarse con afirmaciones derivadas de los JSON Web Tokens (JWT) para asociar las solicitudes de recursos de AWS a una política de AWS Identity and Access Management (IAM) dirigida a los usuarios. 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

Requisitos previos

Limitaciones

  • Este código se ejecuta en Java y, actualmente, no es compatible con otros lenguajes de programación. 

  • La aplicación de muestra no incluye soporte multirregional ni de recuperación de desastres (DR) de AWS. 

  • Este patrón demuestra cómo puede proporcionar acceso limitado a los usuarios una TVM de Lambda para una aplicación SaaS. No está diseñado para usarse en entornos de producción.

Arquitectura

Pila de tecnología de destino

  • AWS Lambda

  • Amazon S3

  • IAM

  • AWS Security Token Service (AWS STS)

Arquitectura de destino

Herramientas

Servicios de AWS

  • La interfaz de la línea de comandos de AWS (AWS CLI) es una herramienta de código abierto que le permite interactuar con los servicios de AWS mediante comandos en su intérprete de comandos de línea de comandos.

  • AWS Identity and Access Management (IAM) le permite administrar de forma segura el acceso a los recursos de AWS mediante el control de quién está autenticado y autorizado a utilizarlos.

  • AWS Lambda 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) le ayuda a solicitar credenciales temporales con privilegios limitados para los usuarios.

  • Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos basado en la nube que le 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

TareaDescripciónHabilidades 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.

<AWS Account ID> ─ La ID de 12 dígitos asociada a la cuenta de AWS en la que está implementando este patrón. Para obtener información acerca de cómo encontrar su ID de su cuenta AWS, consulte su ID de cuenta AWS y alias en la documentación de IAM.

<AWS Region> ─ La región de AWS en la que está implementando este patrón. Para obtener más información sobre las regiones de AWS, consulte Regiones y zonas de disponibilidad en la web de AWS.

< sample-tenant-name > ─ El nombre del inquilino que se utilizará en la solicitud. Le recomendamos que introduzca únicamente caracteres alfanuméricos en este valor por motivos de simplicidad, pero puede usar cualquier nombre válido para una clave de objeto de S3.

< sample-tvm-role-name > ─ El nombre de la función de IAM asociada a la función Lambda que ejecuta la TVM y la aplicación de ejemplo. El nombre del rol es una cadena compuesta por caracteres alfanuméricos en mayúscula y minúscula sin espacios. También puede incluir los siguientes caracteres: guion bajo (_), signo más (+), signo igual (=), coma (,), punto (.), arroba (@) y guion (-). El nombre del rol debe ser único dentro de la cuenta.

< sample-app-role-name > ─ El nombre de la función de IAM que asume la función Lambda cuando genera credenciales STS temporales y con ámbito específico. El nombre del rol es una cadena compuesta por caracteres alfanuméricos en mayúscula y minúscula sin espacios. También puede incluir los siguientes caracteres: guion bajo (_), signo más (+), signo igual (=), coma (,), punto (.), arroba (@) y guion (-). El nombre del rol debe ser único dentro de la cuenta.

< sample-app-function-name > ─ El nombre de la función Lambda. Es una cadena de hasta 64 caracteres de longitud.

< sample-app-bucket-name > ─ El nombre de un bucket de S3 al que se debe acceder con permisos que estén sujetos a un inquilino específico. Nombre del bucket de S3:

  • Deben tener entre 3 y 63 caracteres de longitud.

  • Deben contener solo letras minúsculas, números, puntos (.) y guiones (-).

  • Deben comenzar y terminar por una letra o un número.

  • No pueden tener el formato de una dirección IP (por ejemplo, 192.168.5.4).

  • Debe ser exclusivo dentro de una partición. Una partición es un grupo de regiones. Actualmente, AWS tiene tres particiones: aws  (regiones estándar), aws-cn (regiones de China) y aws-us-gov (regiones de AWS GovCloud [EE. UU.]).

Administrador de la nube
TareaDescripciónHabilidades requeridas

Cree un bucket de S3 para la aplicación de ejemplo.

Puede utilizar el comando AWS CLI para crear el bucket de S3. Introduzca el valor < sample-app-bucket-name > en el fragmento de código:

aws s3api create-bucket --bucket <sample-app-bucket-name>

La aplicación de ejemplo de Lambda carga archivos JSON en este bucket.

Administrador de la nube
TareaDescripciónHabilidades requeridas

Crear un rol de TVM.

Ejecute uno de los siguientes comandos de la CLI de AWS para crear un rol de IAM. Proporcione el valor < sample-tvm-role-name > en el comando.

Para los intérprete de comandos para macOS o Linux:

aws iam create-role \ --role-name <sample-tvm-role-name> \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ]}'

En la línea de comandos de Windows:

aws iam create-role ^ --role-name <sample-tvm-role-name> ^ --assume-role-policy-document "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Effect\": \"Allow\", \"Principal\": {\"Service\": \"lambda.amazonaws.com\"}, \"Action\": \"sts:AssumeRole\"}]}"

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.

Ejecute uno de los siguientes comandos de CLI de AWS para crear una política de IAM. Proporcione los <AWS Account ID>valores < sample-tvm-role-name > y < sample-app-role-name > en el comando.

Para los intérprete de comandos para macOS o 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>" } ]}'

En la línea de comandos de 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>\"}]}"

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 comando de AWS CLI para adjuntar la política de IAM AWSLambdaBasicExecutionRole . Proporcione el valor < sample-tvm-role-name > en el comando:

aws iam attach-role-policy \ --role-name <sample-tvm-role-name> \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

En la línea de comandos de Windows:

aws iam attach-role-policy ^ --role-name <sample-tvm-role-name> ^ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

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
TareaDescripciónHabilidades requeridas

Crear el rol de la aplicación.

Ejecute uno de los siguientes comandos de la CLI de AWS para crear un rol de IAM. Proporcione los <AWS Account ID>valores < sample-app-role-name > y < sample-tvm-role-name > en el comando.

Para los intérprete de comandos para macOS o 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" } ]}'

En la línea de comandos de 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\"}]}"

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.

Ejecute uno de los siguientes comandos de CLI de AWS para crear una política de IAM. Proporcione los valores < sample-app-role-name > y < sample-app-bucket-name > en el comando.

Para los intérprete de comandos para macOS o 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>" } ]}'

En la línea de comandos de 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>\"}]}"

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
TareaDescripciónHabilidades 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.

Ejecute el siguiente comando en la CLI de AWS para crear una capa de Lambda que permita a Lambda acceder a la TVM. 

Nota: 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

aws lambda publish-layer-version \ --layer-name sample-token-vending-machine \ --compatible-runtimes java11 \ --zip-file fileb://tvm-layer.zip

En la línea de comandos de Windows:

aws lambda publish-layer-version ^ --layer-name sample-token-vending-machine ^ --compatible-runtimes java11 ^ --zip-file fileb://tvm-layer.zip

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.

Use el siguiente comando de la CLI para crear la función de Lambda. Proporcione los <AWS Account ID><AWS Region>valores < sample-app-function-name >,, < sample-tvm-role-name >, < sample-app-bucket-name > y < sample-app-role-name > en el comando. 

Nota: 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

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>}"

Para la línea de comandos de 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>}"

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
TareaDescripciónHabilidades requeridas

Invoque la aplicación de ejemplo de Lambda.

Ejecute uno de los siguientes comandos en la CLI de AWS para iniciar la aplicación de ejemplo de Lambda con la carga útil esperada. Proporcione los valores < sample-app-function-name > y < sample-tenant-name > en el comando.

Para intérprete de comandos macOS y 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

En la línea de comandos de 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

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. 

Nota: Al cambiar el valor < sample-tenant-name > en las siguientes invocaciones de esta función Lambda, se modifica la ubicación del documento JSON y los permisos que proporciona el token.

Administrador de la nube, desarrollador de aplicaciones

Acceda al bucket de S3 para ver los objetos creados.

Navegue hasta el bucket de S3 (< sample-app-bucket-name >) que creó anteriormente. Este depósito contiene un prefijo de objeto S3 con el valor < 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

Acceda a los registros de Cloudwatch de la aplicación de muestra.

Vea los registros de Cloudwatch asociados a la función Lambda denominada sample-app-function-name < >. Para obtener instrucciones, consulte Acceso a CloudWatch los registros de Amazon para AWS Lambda en la documentación de AWS 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 a ListBucketlas API GetObjectDeleteObject, pero solo para el prefijo de objeto asociado a < >. sample-tenant-name En las siguientes invocaciones de la aplicación de ejemplo, si se cambia la opción < sample-tenant-name >, el TVM actualiza la política de ámbito para que se ajuste 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.

Administrador de la nube

Recursos relacionados

Información adicional

El siguiente registro de Amazon Cloudwatch muestra la política generada de forma dinámica y creada por el código de TVM siguiendo este patrón. En esta captura de pantalla, < sample-app-bucket-name > es DOC-EXAMPLE-BUCKET y < > es. sample-tenant-name 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.

Conexiones

Para acceder al contenido adicional asociado a este documento, descomprima el archivo: attachment.zip