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
Tabby Ward, Thomas Davis e Sravan Periyathambi, Amazon Web Services
Riepilogo
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
Prerequisiti
Un attivo. Account AWS
AWS Command Line Interface (AWS CLI) versione 1.19.0 o successiva, installata e configurata su macOS, Linux o Windows. In alternativa, è possibile utilizzare la AWS CLI versione 2.1 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.
Architettura
Stack tecnologico Target
Architettura di destinazione
Servizi AWS
AWS Command Line Interface (AWS CLI) è uno strumento open source che consente di interagire Servizi AWS tramite comandi nella shell della riga di comando.
AWS Identity and Access Management (IAM) ti aiuta a gestire in modo sicuro l'accesso alle tue AWS risorse controllando chi è autenticato e autorizzato a utilizzarle.
AWS Lambda è 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) consente di richiedere credenziali temporanee con privilegi limitati per gli utenti.
Amazon Simple Storage Service (Amazon S3) è 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.jarfornisce il codice sorgente per una funzione Lambda che carica un documento JSON in un bucket S3.
tvm-layer.zipfornisce 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.zipfornisce 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
| Attività | Descrizione | 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. <AWS Account ID>─ L'ID dell'account a 12 cifre associato al modello in cui Account AWS stai implementando questo modello. Per informazioni su come trovare il tuo Account AWS ID, consulta Usare un alias per il tuo Account AWS ID nella documentazione IAM.
<AWS Region>─ Il Regione AWS modo in cui stai implementando questo modello. Per ulteriori informazioni Regioni AWS, consulta Regioni e zone di disponibilità sul AWS sito Web.
<sample-tenant-name>─ Il nome di un inquilino da utilizzare nell'applicazione. Si consiglia di utilizzare solo caratteri alfanumerici in questo valore per semplicità, ma è possibile utilizzare qualsiasi nome valido per una chiave oggetto S3.
<sample-tvm-role-name>─ Il nome del ruolo IAM associato alla funzione Lambda che esegue TVM e l'applicazione di esempio. Il nome del ruolo è una stringa composta da caratteri alfanumerici maiuscoli e minuscoli senza spazi. È inoltre possibile includere uno qualsiasi dei seguenti caratteri: trattino basso (_), segno più (+), segno uguale (=), virgola (,), punto (.), segno chiocciola (@) e trattino (-). Il nome del ruolo deve essere univoco all'interno dell'account.
<sample-app-role-name>─ Il nome del ruolo IAM assunto dalla funzione Lambda quando genera credenziali STS temporanee e con ambito. Il nome del ruolo è una stringa composta da caratteri alfanumerici maiuscoli e minuscoli senza spazi. È inoltre possibile includere uno qualsiasi dei seguenti caratteri: trattino basso (_), segno più (+), segno uguale (=), virgola (,), punto (.), segno chiocciola (@) e trattino (-). Il nome del ruolo deve essere univoco all'interno dell'account.
<sample-app-function-name>─ Il nome della funzione Lambda. Si tratta di una stringa che può contenere fino a 64 caratteri.
<sample-app-bucket-name>─ Il nome di un bucket S3 a cui è necessario accedere con autorizzazioni limitate a un tenant specifico. Nomi dei bucket S3:
Devono contenere da 3 a 63 caratteri. Deve essere composto solo da lettere minuscole, numeri, punti (.) e trattini (-). Deve iniziare e terminare con una lettera o un numero. Non devono avere il formato di un indirizzo IP (ad esempio, 192.168.5.4). Deve essere univoco all'interno di una partizione. Una partizione è un raggruppamento di regioni. AWS attualmente ha tre partizioni: aws per le regioni standard, aws-cn per le regioni della Cina e aws-us-gov per AWS GovCloud (US) Regions.
| Amministratore cloud |
| Attività | Descrizione | 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: aws s3api create-bucket --bucket <sample-app-bucket-name>
L'applicazione di esempio Lambda carica i file JSON in questo bucket. | Amministratore cloud |
| Attività | Descrizione | 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: 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>"
}
}
}
]
}'
Per la riga di comando di 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'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: 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>"
}
]}'
Per la riga di comando di 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>\"}]}"
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: aws iam attach-role-policy \
--role-name <sample-tvm-role-name> \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Per la riga di comando di Windows: aws iam attach-role-policy ^
--role-name <sample-tvm-role-name> ^
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Questa policy gestita è allegata al ruolo TVM per consentire a Lambda di inviare log ad Amazon. CloudWatch | Amministratore cloud |
| Attività | Descrizione | 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: 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"
}
]}'
Per la riga di comando di 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'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: 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>"
}
]}'
Per la riga di comando di 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>\"}]}"
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 |
| Attività | Descrizione | 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 parametrotvm-layer.zip. --zip-file aws lambda publish-layer-version \
--layer-name sample-token-vending-machine \
--compatible-runtimes java11 \
--zip-file fileb://tvm-layer.zip
Per la riga di comando di Windows: aws lambda publish-layer-version ^
--layer-name sample-token-vending-machine ^
--compatible-runtimes java11 ^
--zip-file fileb://tvm-layer.zip
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 scaricatos3UploadSample.jar, fornisci il percorso corretto s3UploadSample.jar nel --zip-file parametro. 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>}"
Per la riga di comando di 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>}"
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 |
| Attività | Descrizione | 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: 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
Per la riga di comando di 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
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 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 PutObjectGetObjectDeleteObjectListBucket 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. | Amministratore cloud |
Risorse correlate
Informazioni aggiuntive
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
Allegati
Per accedere al contenuto aggiuntivo associato a questo documento, decomprimi il seguente file: attachment.zip