

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Implemente o isolamento de inquilinos de SaaS para o Amazon S3 usando uma máquina de venda automática de tokens AWS Lambda
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine"></a>

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

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

Os aplicativos SaaS multilocação devem implementar sistemas para garantir que o isolamento dos inquilinos seja mantido. Quando você armazena dados de inquilinos no mesmo AWS recurso, como quando vários inquilinos armazenam dados no mesmo bucket do Amazon Simple Storage Service (Amazon S3), você deve garantir que o acesso entre inquilinos não ocorra. As máquinas de venda automática de tokens (TVMs) são uma forma de fornecer isolamento de dados do inquilino. Essas máquinas fornecem um mecanismo para obter tokens e, ao mesmo tempo, abstrair a complexidade de como esses tokens são gerados. Os desenvolvedores podem usar uma TVM sem ter conhecimento detalhado de como ela produz tokens.

Esse padrão implementa um TVM usando. AWS Lambda A TVM gera um token que consiste em credenciais temporárias de serviço de token de segurança (STS) que limitam o acesso aos dados de um único inquilino SaaS em um bucket S3.

TVMse o código fornecido com esse padrão são normalmente usados com declarações derivadas de JSON Web Tokens (JWTs) para associar solicitações de AWS recursos a uma política com escopo de inquilino (IAM AWS Identity and Access Management ). Você pode usar o código deste padrão como base para implementar um aplicativo SaaS que gera credenciais STS temporárias e com escopo com base nas declarações fornecidas em um token JWT.

## Pré-requisitos e limitações
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-prereqs"></a>

**Pré-requisitos **
+ Um ativo Conta da AWS.
+ AWS Command Line Interface (AWS CLI) [versão 1.19.0 ou posterior](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html), instalada e configurada no macOS, Linux ou Windows. Como alternativa, você pode usar a AWS CLI [versão 2.1 ou posterior](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html).

**Limitações**
+ Este código é executado em Java e atualmente não oferece suporte a outras linguagens de programação. 
+ O aplicativo de amostra não inclui suporte AWS entre regiões ou recuperação de desastres (DR). 
+ Este padrão demonstra como uma TVM do Lambda para um aplicativo SaaS pode fornecer acesso de inquilino com escopo definido. Este padrão não é recomendado para uso em ambientes de produção sem que testes de segurança adicionais sejam realizados como parte da sua aplicação ou do caso de uso específico.

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

**Pilha de tecnologias de destino**
+ AWS Lambda
+ Amazon S3
+ IAM
+ AWS Security Token Service (AWS STS)

**Arquitetura de destino**

![\[Geração de um token para obter credenciais temporárias do STS e acessar os dados em um bucket do S3.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/97a34c8e-d04e-40b6-acbf-1baa176d22a9/images/14d0508a-703b-4229-85e6-c5094de7fe01.png)


 

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

**Serviços da AWS**
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) é uma ferramenta de código aberto que ajuda você a interagir Serviços da AWS por meio de comandos em seu shell de linha de comando.
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) ajuda você a gerenciar com segurança o acesso aos seus AWS recursos controlando quem está autenticado e autorizado a usá-los.
+ O [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) é um serviço de computação que ajuda a executar código sem exigir provisionamento ou gerenciamento de servidores. Ele executa o código somente quando necessário e dimensiona automaticamente, assim, você paga apenas pelo tempo de computação usado.
+ [AWS Security Token Service (AWS STS)](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html) ajuda você a solicitar credenciais temporárias com privilégios limitados para os usuários.
+ O [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) é um serviço de armazenamento de objetos baseado na nuvem que ajuda você a armazenar, proteger e recuperar qualquer quantidade de dados.

**Código **

O código-fonte deste padrão está disponível como anexo e inclui os seguintes arquivos:
+ `s3UploadSample.jar` fornece o código-fonte para uma função do Lambda que carrega um documento JSON em um bucket do S3.
+ `tvm-layer.zip` oferece uma biblioteca Java reutilizável que fornece um token (credenciais temporárias STS) para que a função do Lambda acesse o bucket do S3 e faça o upload do documento JSON.
+ `token-vending-machine-sample-app.zip` fornece o código-fonte usado para criar esses artefatos e instruções de compilação.

Para usar esses arquivos, siga as instruções da próxima seção.

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

### Determinar os valores das variáveis
<a name="determine-variable-values"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Determinar os valores das variáveis. | A implementação deste padrão inclui vários nomes de variáveis que devem ser usados de forma consistente. Determine os valores que devem ser usados para cada variável e forneça esse valor quando solicitado nas etapas subsequentes.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine.html) | Administrador de nuvem | 

### Criar um bucket do S3.
<a name="create-an-s3-bucket"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Criar um ambiente do bucket do S3 para o aplicativo de exemplo. | Use o AWS CLI comando a seguir para criar um bucket do S3. Forneça o valor de** **`<sample-app-bucket-name>` no trecho de código:<pre>aws s3api create-bucket --bucket <sample-app-bucket-name></pre>O aplicativo de exemplo Lambda carrega arquivos JSON nesse bucket. | Administrador de nuvem | 

### Criar uma política e um perfil do TVM do IAM
<a name="create-the-iam-tvm-role-and-policy"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Criar um perfil TVM. | Use um dos AWS CLI comandos a seguir para criar uma função do IAM. Forneça o valor de** **`<sample-tvm-role-name>` no comando.Para shells no macOS ou 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>Para a linha de comando do 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>O aplicativo de exemplo do Lambda assume essa função quando o aplicativo é invocado. A capacidade de assumir o perfil do aplicativo com uma política de escopo fornece ao código permissões mais amplas para acessar o bucket do S3. | Administrador de nuvem | 
| Criar uma política de função de TVM em linha. | Use um dos AWS CLI comandos a seguir para criar uma política do IAM. Forneça os valores de `<sample-tvm-role-name>`,** **`<AWS Account ID>` e `<sample-app-role-name>` no comando.Para shells no macOS ou 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>Para a linha de comando do 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 é anexada à função da TVM. Dá ao código a capacidade de assumir o perfil do aplicativo que possui permissões mais amplas para acessar o bucket do S3. | Administrador de nuvem | 
| Anexar a política gerenciada do Lambda. | Use o AWS CLI comando a seguir para anexar a política `AWSLambdaBasicExecutionRole` do IAM. Forneça o valor de `<sample-tvm-role-name>` no 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>Para a linha de comando do 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>Essa política gerenciada é anexada à função TVM para permitir que o Lambda envie registros para a Amazon. CloudWatch | Administrador de nuvem | 

### Criar uma política e um perfil do aplicativo IAM
<a name="create-the-iam-application-role-and-policy"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Criar o perfil do aplicativo. | Use um dos AWS CLI comandos a seguir para criar uma função do IAM. Forneça os valores de `<sample-app-role-name>`, `<AWS Account ID>` e `<sample-tvm-role-name>` no comando:Para shells no macOS ou 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>Para a linha de comando do 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>O aplicativo de exemplo Lambda assume essa função com uma política de escopo para obter acesso baseado em inquilinos a um bucket do S3. | Administrador de nuvem | 
| Criar uma política de função de aplicativo embutida. | Use um dos comandos a seguir AWS CLI para criar uma política do IAM. Forneça os valores de** **`<sample-app-role-name>` e `<sample-app-bucket-name>` no comando.Para shells no macOS ou 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>Para a linha de comando do 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 é anexada ao perfil do aplicativo. Ela fornece amplo acesso aos objetos no bucket do S3. Quando o aplicativo de exemplo assume o perfil, essas permissões são atribuídas a um inquilino específico com a política gerada dinamicamente pela TVM. | Administrador de nuvem | 

### Crie o aplicativo de exemplo Lambda com a TVM
<a name="create-the-lam-sample-application-with-tvm"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Baixe os arquivos de origem compilados. | Baixe os arquivos `s3UploadSample.jar` e `tvm-layer.zip`****, que estão incluídos como anexos. O código-fonte usado para criar esses artefatos e instruções de compilação são fornecidos em `token-vending-machine-sample-app.zip`. | Administrador de nuvem | 
| Criar a camada do Lambda. | Use o AWS CLI comando a seguir para criar uma camada Lambda, que torna o TVM acessível ao Lambda. Se você não estiver executando este comando do local em que fez o download do arquivo ` tvm-layer.zip`, forneça o caminho correto para o arquivo `tvm-layer.zip` no 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>Para a linha de comando do 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>Esse comando cria uma camada Lambda que contém a biblioteca TVM reutilizável. | Administrador da nuvem, desenvolvedor de aplicativos | 
| Criar a função do Lambda. | Use o AWS CLI comando a seguir para criar uma função Lambda. Forneça os valores de `<sample-app-function-name>`, `<AWS Account ID>`, `<AWS Region>`, `<sample-tvm-role-name>`, `<sample-app-bucket-name>` e `<sample-app-role-name>` no comando. Se você não estiver executando este comando do local em que fez o download do arquivo `s3UploadSample.jar`, forneça o caminho correto para o arquivo `s3UploadSample.jar` no 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>Para a linha de comando do 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>Esse comando cria uma função do Lambda com o código do aplicativo de exemplo e a camada TVM anexada. Ele também define duas variáveis de ambiente: `S3_BUCKET` e `ROLE`. O aplicativo de exemplo usa essas variáveis para determinar a função a ser assumida e o bucket do S3 para o qual carregar documentos JSON. | Administrador da nuvem, desenvolvedor de aplicativos | 

### Testar o aplicativo de exemplo e a TVM
<a name="test-the-sample-application-and-tvm"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Invocar o aplicativo de exemplo do Lambda. | Use um dos AWS CLI comandos a seguir para iniciar o aplicativo de amostra Lambda com a carga esperada. Forneça os valores de `<sample-app-function-name>` e `<sample-tenant-name>` no comando.Para shells no macOS ou 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>Para a linha de comando do 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>Esse comando chama a função do Lambda e retorna o resultado em um documento `response.json`. Em muitos sistemas baseados em Unix, você pode alterar `response.json` para `/dev/stdout` para enviar os resultados diretamente para o shell sem criar outro arquivo. Ao alterar o valor de `<sample-tenant-name>` nas invocações subsequentes desta função do Lambda, o local do documento em JSON e as permissões concedidas pelo token são alterados. | Administrador da nuvem, desenvolvedor de aplicativos | 
| Visualizar o bucket do S3 para ver os objetos criados. | Acesse o bucket do S3 (`<sample-app-bucket-name>`) que você criou anteriormente. Este bucket contém um prefixo de objeto do S3 com o valor de `<sample-tenant-name>`. Sob esse prefixo, você encontrará um documento JSON chamado com um UUID. Invocar o aplicativo de exemplo várias vezes adiciona mais documentos JSON. | Administrador de nuvem | 
| Veja os registros do aplicativo de amostra em CloudWatch Logs. | Visualize os registros associados à função Lambda nomeada `<sample-app-function-name>` em CloudWatch Logs. Para obter instruções, consulte [Enviar registros da função Lambda para CloudWatch Logs na documentação](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html) do Lambda. Você pode visualizar a política com escopo de inquilino gerada pela TVM nesses logs. Essa política com escopo de locatário concede permissões para o aplicativo de amostra para o Amazon S3 **PutObject**,,, e **GetObject**DeleteObject**ListBucket****** APIs, mas somente para o prefixo de objeto associado a. `<sample-tenant-name>` Em invocações subsequentes da aplicação de amostra, se você alterar `<sample-tenant-name>`, a TVM atualiza a política com escopo para corresponder ao locatário fornecido na carga útil da invocação. Essa política gerada dinamicamente mostra como o acesso com escopo de inquilino pode ser mantido com uma TVM em aplicativos SaaS. A funcionalidade da TVM é fornecida em uma camada Lambda para que possa ser anexada a outras funções do Lambda usadas por um aplicativo sem precisar replicar o código.Para obter uma ilustração da política gerada dinamicamente, consulte a seção [Informações adicionais](#implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-additional). | Administrador de nuvem | 

## Recursos relacionados
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-resources"></a>
+ [Isolar inquilinos com políticas do IAM geradas dinamicamente](https://aws.amazon.com/blogs/apn/isolating-saas-tenants-with-dynamically-generated-iam-policies/) (publicação do blog)
+ [Applying Dynamically Generated Isolation Policies in SaaS Environments](https://aws.amazon.com/blogs/apn/applying-dynamically-generated-isolation-policies-in-saas-environments/) (publicação do blog)
+ [SaaS ativado AWS](https://aws.amazon.com/saas/)

## Mais informações
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-additional"></a>

O log apresentado a seguir mostra a política gerada dinamicamente pelo código da TVM neste padrão. Nesta captura de tela, o `<sample-app-bucket-name>` é `DOC-EXAMPLE-BUCKET` e o `<sample-tenant-name>` é `test-tenant-1`. As credenciais STS retornadas por essa política de escopo não conseguem realizar nenhuma ação em objetos no bucket do S3, exceto os objetos associados ao prefixo da chave do objeto `test-tenant-1`.

![\[Log demonstrando uma política gerada dinamicamente pelo código da TVM.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/97a34c8e-d04e-40b6-acbf-1baa176d22a9/images/d4776ebe-fb8f-41ac-b8c5-b4f97a821c8c.png)


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

Para acessar o conteúdo adicional associado a este documento, descompacte o seguinte arquivo:[ attachment.zip](samples/p-attach/97a34c8e-d04e-40b6-acbf-1baa176d22a9/attachments/attachment.zip)