

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Implementa l'isolamento dei tenant SaaS per Amazon S3 utilizzando un distributore automatico di token 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*

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

Le applicazioni SaaS multitenant devono implementare sistemi per garantire il mantenimento dell'isolamento dei tenant. Quando memorizzi i dati dei tenant sulla stessa AWS risorsa, ad esempio quando più tenant archiviano i dati nello stesso bucket Amazon Simple Storage Service (Amazon S3) Simple Storage Service (Amazon S3), devi assicurarti che l'accesso tra tenant non possa avvenire. I distributori automatici di token () sono un modo per garantire l'isolamento dei dati dei tenant. TVMs Queste macchine forniscono un meccanismo per ottenere token e al contempo astrarre la complessità del modo in cui questi token vengono generati. Gli sviluppatori possono utilizzare una TVM senza avere una conoscenza dettagliata di come produce i token.

Questo modello implementa una TVM utilizzando. AWS Lambda Il TVM genera un token costituito da credenziali temporanee del servizio token di sicurezza (STS) che limitano l'accesso ai dati di un singolo tenant SaaS in un bucket S3.

TVMs, e il codice fornito con questo modello, vengono in genere utilizzati con attestazioni derivate da JSON Web Tokens (JWTs) per associare le richieste di AWS risorse a una policy tenant-scoped (IAM). AWS Identity and Access Management È possibile utilizzare il codice in questo modello come base per implementare un'applicazione SaaS che genera credenziali STS temporanee e con ambito basate sulle affermazioni fornite in un token JWT.

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

**Prerequisiti**
+ Un attivo. Account AWS
+ AWS Command Line Interface (AWS CLI) [versione 1.19.0 o successiva](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html), installata e configurata su macOS, Linux o Windows. In alternativa, è possibile utilizzare la AWS CLI [versione 2.1](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) o successiva.

**Limitazioni**
+ Questo codice viene eseguito in Java e attualmente non supporta altri linguaggi di programmazione. 
+ L'applicazione di esempio non include il supporto AWS interregionale o di disaster recovery (DR). 
+ Questo modello dimostra come una Lambda TVM per un'applicazione SaaS possa fornire un accesso mirato ai tenant. Questo modello non è destinato all'uso in ambienti di produzione senza ulteriori test di sicurezza come parte dell'applicazione o del caso d'uso specifici.

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

**Stack tecnologico Target**
+ AWS Lambda
+ Simple Storage Service (Amazon S3)
+ IAM
+ AWS Security Token Service (AWS STS)

**Architettura di destinazione**

![\[Generazione di un token per ottenere credenziali STS temporanee per accedere ai dati in un bucket S3.\]](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/images/pattern-img/97a34c8e-d04e-40b6-acbf-1baa176d22a9/images/14d0508a-703b-4229-85e6-c5094de7fe01.png)


 

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

**Servizi AWS**
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) è uno strumento open source che consente di interagire Servizi AWS tramite comandi nella shell della riga di comando.
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) ti aiuta a gestire in modo sicuro l'accesso alle tue AWS risorse controllando chi è autenticato e autorizzato a utilizzarle.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) è un servizio di calcolo che consente di eseguire il codice senza gestire i server o effettuarne il provisioning. Esegue il codice solo quando necessario e si ridimensiona automaticamente, quindi paghi solo per il tempo di elaborazione che utilizzi.
+ [AWS Security Token Service (AWS STS)](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html) consente di richiedere credenziali temporanee con privilegi limitati per gli utenti.
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) è un servizio di archiviazione degli oggetti basato sul cloud che consente di archiviare, proteggere e recuperare qualsiasi quantità di dati.

**Codice**

Il codice sorgente di questo pattern è disponibile come allegato e include i seguenti file:
+ `s3UploadSample.jar`fornisce il codice sorgente per una funzione Lambda che carica un documento JSON in un bucket S3.
+ `tvm-layer.zip`fornisce una libreria Java riutilizzabile che fornisce un token (credenziali temporanee STS) per la funzione Lambda per accedere al bucket S3 e caricare il documento JSON.
+ `token-vending-machine-sample-app.zip`fornisce il codice sorgente usato per creare questi artefatti e le istruzioni di compilazione.

Per utilizzare questi file, seguite le istruzioni riportate nella sezione successiva.

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

### Determina i valori delle variabili
<a name="determine-variable-values"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Determina i valori delle variabili. | L'implementazione di questo modello include diversi nomi di variabili che devono essere usati in modo coerente. Determina i valori da utilizzare per ogni variabile e fornisci quel valore quando richiesto nei passaggi successivi.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine.html) | Amministratore cloud | 

### Creare un bucket S3
<a name="create-an-s3-bucket"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea un bucket S3 per l'applicazione di esempio. | Usa il seguente AWS CLI comando per creare un bucket S3. Fornisci il `<sample-app-bucket-name>`**** valore nel frammento di codice:<pre>aws s3api create-bucket --bucket <sample-app-bucket-name></pre>L'applicazione di esempio Lambda carica i file JSON in questo bucket. | Amministratore cloud | 

### Crea il ruolo e la policy di IAM TVM
<a name="create-the-iam-tvm-role-and-policy"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea un ruolo TVM. | Utilizza uno dei seguenti AWS CLI comandi per creare un ruolo IAM. Fornisci il `<sample-tvm-role-name>`**** valore nel comando.Per le shell 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>Per la riga di comando di 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>L'applicazione di esempio Lambda assume questo ruolo quando viene richiamata l'applicazione. La capacità di assumere il ruolo dell'applicazione con una policy mirata offre al codice autorizzazioni più ampie per accedere al bucket S3. | Amministratore cloud | 
| Crea una politica di ruolo TVM in linea. | Utilizzate uno dei seguenti AWS CLI comandi per creare una policy IAM. Fornisci i `<sample-app-role-name>` valori `<sample-tvm-role-name>` **`<AWS Account ID>`**, e nel comando.Per le shell 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>Per la riga di comando di 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>Questa policy è associata al ruolo TVM. Fornisce al codice la capacità di assumere il ruolo dell'applicazione, che dispone di autorizzazioni più ampie per accedere al bucket S3. | Amministratore cloud | 
| Allega la policy Lambda gestita. | Usa il AWS CLI comando seguente per allegare la policy `AWSLambdaBasicExecutionRole` IAM. Fornisci il `<sample-tvm-role-name>` valore nel 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>Per la riga di comando di 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>Questa policy gestita è allegata al ruolo TVM per consentire a Lambda di inviare log ad Amazon. CloudWatch | Amministratore cloud | 

### Crea il ruolo e la policy dell'applicazione IAM
<a name="create-the-iam-application-role-and-policy"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea il ruolo dell'applicazione. | Utilizza uno dei seguenti AWS CLI comandi per creare un ruolo IAM. Fornisci i `<sample-tvm-role-name>` valori `<sample-app-role-name>``<AWS Account ID>`, e nel comando.Per le shell 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>Per la riga di comando di 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>L'applicazione di esempio Lambda assume questo ruolo con una policy mirata per ottenere l'accesso basato su tenant a un bucket S3. | Amministratore del cloud | 
| Crea una politica in linea per i ruoli delle applicazioni. | Utilizza uno dei seguenti AWS CLI comandi per creare una policy IAM. Fornisci i `<sample-app-bucket-name>`**** valori `<sample-app-role-name>` and nel comando.Per le shell 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>Per la riga di comando di 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>Questa politica è allegata al ruolo dell'applicazione. Fornisce un ampio accesso agli oggetti nel bucket S3. Quando l'applicazione di esempio assume il ruolo, queste autorizzazioni sono limitate a un tenant specifico con la policy generata dinamicamente da TVM. | Amministratore cloud | 

### Crea l'applicazione di esempio Lambda con TVM
<a name="create-the-lam-sample-application-with-tvm"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Scarica i file sorgente compilati. | Scaricate i `tvm-layer.zip`**** file `s3UploadSample.jar` and, che sono inclusi come allegati. Il codice sorgente utilizzato per creare questi artefatti e le istruzioni di compilazione sono forniti in. `token-vending-machine-sample-app.zip` | Amministratore cloud | 
| Crea il livello Lambda. | Utilizzate il seguente AWS CLI comando per creare un layer Lambda, che renda la TVM accessibile a Lambda. Se non state eseguendo questo comando dalla posizione in cui lo avete scaricato` tvm-layer.zip`, fornite il percorso corretto del parametro`tvm-layer.zip`. `--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>Per la riga di comando di 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>Questo comando crea un layer Lambda che contiene la libreria TVM riutilizzabile. | Amministratore cloud, sviluppatore di app | 
| Creazione della funzione Lambda | Usa il AWS CLI comando seguente per creare una funzione Lambda. Fornisci i `<sample-app-role-name>` valori `<sample-app-function-name>` `<AWS Account ID>``<AWS Region>`, `<sample-tvm-role-name>``<sample-app-bucket-name>`,, e nel comando. Se non esegui questo comando dalla posizione in cui lo hai scaricato`s3UploadSample.jar`, fornisci il percorso corretto `s3UploadSample.jar` nel `--zip-file` parametro. <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>Per la riga di comando di 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>Questo comando crea una funzione Lambda con il codice dell'applicazione di esempio e il livello TVM collegato. Imposta inoltre due variabili di ambiente: `S3_BUCKET` e. `ROLE` L'applicazione di esempio utilizza queste variabili per determinare il ruolo da assumere e il bucket S3 in cui caricare i documenti JSON. | Amministratore cloud, sviluppatore di app | 

### Prova l'applicazione di esempio e TVM
<a name="test-the-sample-application-and-tvm"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Richiama l'applicazione di esempio Lambda. | Utilizza uno dei seguenti AWS CLI comandi per avviare l'applicazione di esempio Lambda con il payload previsto. Fornisci i `<sample-tenant-name>` valori `<sample-app-function-name>` and nel comando.Per le shell macOS e 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>Per la riga di comando di 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>Questo comando richiama la funzione Lambda e restituisce il risultato in un `response.json` documento. In molti sistemi basati su Unix, è possibile passare `response.json` a per `/dev/stdout` inviare i risultati direttamente alla shell senza creare un altro file. La modifica del `<sample-tenant-name>` valore nelle chiamate successive di questa funzione Lambda modifica la posizione del documento JSON e le autorizzazioni fornite dal token. | Amministratore cloud, sviluppatore di app | 
| Visualizza il bucket S3 per vedere gli oggetti creati. | Vai al bucket S3 (`<sample-app-bucket-name>`) che hai creato in precedenza. Questo bucket contiene un prefisso di oggetto S3 con il valore di. `<sample-tenant-name>` Sotto quel prefisso, troverai un documento JSON denominato con un UUID. Richiamando più volte l'applicazione di esempio vengono aggiunti altri documenti JSON. | Amministratore cloud | 
| Visualizza i log dell'applicazione di esempio in CloudWatch Logs. | Visualizza i log associati alla funzione Lambda `<sample-app-function-name>` denominata CloudWatch in Logs. Per istruzioni, consulta [Invio dei log delle funzioni Lambda ai CloudWatch registri nella](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html) documentazione di Lambda. È possibile visualizzare la politica basata sull'ambito dei tenant generata da TVM in questi log. Questa politica con ambito tenant fornisce le autorizzazioni per l'applicazione di esempio ad Amazon S3,, e **PutObject**GetObject**DeleteObject**ListBucket******** APIs, ma solo per il prefisso dell'oggetto a cui è associato. `<sample-tenant-name>` Nelle chiamate successive dell'applicazione di esempio, in caso di modifiche`<sample-tenant-name>`, TVM aggiorna la policy di ambito in modo che corrisponda al tenant fornito nel payload di chiamata. Questa policy generata dinamicamente mostra come è possibile mantenere l'accesso con ambito tenant con una TVM nelle applicazioni SaaS. La funzionalità TVM è fornita in un livello Lambda in modo che possa essere collegata ad altre funzioni Lambda utilizzate da un'applicazione senza dover replicare il codice.[Per un'illustrazione della policy generata dinamicamente, consultate la sezione Informazioni aggiuntive.](#implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-additional) | Amministratore cloud | 

## Risorse correlate
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-resources"></a>
+ [Isolamento dei tenant con policy IAM generate dinamicamente](https://aws.amazon.com/blogs/apn/isolating-saas-tenants-with-dynamically-generated-iam-policies/) (post sul blog)
+ [Applicazione di politiche di isolamento generate dinamicamente in ambienti SaaS](https://aws.amazon.com/blogs/apn/applying-dynamically-generated-isolation-policies-in-saas-environments/) (post sul blog)
+ [SaaS attivo AWS](https://aws.amazon.com/saas/)

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

Il registro seguente mostra la politica generata dinamicamente dal codice TVM secondo questo schema. In questa schermata, il `<sample-app-bucket-name>` è `DOC-EXAMPLE-BUCKET` e il è. `<sample-tenant-name>` `test-tenant-1` Le credenziali STS restituite da questa policy con ambito non sono in grado di eseguire alcuna azione sugli oggetti nel bucket S3 ad eccezione degli oggetti associati al prefisso object key. `test-tenant-1`

![\[Log che mostra una policy generata dinamicamente prodotta dal codice TVM.\]](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/images/pattern-img/97a34c8e-d04e-40b6-acbf-1baa176d22a9/images/d4776ebe-fb8f-41ac-b8c5-b4f97a821c8c.png)


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

[Per accedere al contenuto aggiuntivo associato a questo documento, decomprimi il seguente file: attachment.zip](samples/p-attach/97a34c8e-d04e-40b6-acbf-1baa176d22a9/attachments/attachment.zip)