Implementieren Sie die SaaS-Mandantenisolierung für Amazon S3 mithilfe eines AWS Lambda-Token-Verkaufsautomaten - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Implementieren Sie die SaaS-Mandantenisolierung für Amazon S3 mithilfe eines AWS Lambda-Token-Verkaufsautomaten

Erstellt von Tabby Ward (AWS), Sravan Periyathambi () und Thomas Davis () AWS AWS

Umgebung: PoC oder Pilotprojekt

Technologien: Modernisierung

AWSDienste: AWS Identity and Access Management; AWS Lambda; Amazon S3; AWS STS

Übersicht

Mehrmandantenfähige SaaS-Anwendungen müssen Systeme implementieren, um sicherzustellen, dass die Mandantenisolierung aufrechterhalten wird. Wenn Sie Mandantendaten auf derselben Amazon Web Services (AWS) -Ressource speichern, z. B. wenn mehrere Mandanten Daten in demselben Amazon Simple Storage Service (Amazon S3) -Bucket speichern, müssen Sie sicherstellen, dass kein mandantenübergreifender Zugriff möglich ist. Token-Verkaufsautomaten (TVMs) sind eine Möglichkeit, die Daten von Mietern zu isolieren. Diese Maschinen bieten einen Mechanismus zum Abrufen von Token und abstrahieren gleichzeitig die Komplexität der Token-Generierung. Entwickler können a verwenden, TVM ohne detaillierte Kenntnisse darüber zu haben, wie es Token erzeugt.

Dieses Muster implementiert a mithilfe TVM von AWS Lambda. Das TVM generiert ein Token, das aus temporären Security Token Service (STS) -Anmeldeinformationen besteht, die den Zugriff auf die Daten eines einzelnen SaaS-Mandanten in einem S3-Bucket einschränken.

TVMs, und der Code, der mit diesem Muster bereitgestellt wird, werden in der Regel mit Ansprüchen verwendet, die von JSON Web Tokens (JWTs) abgeleitet werden, um Anfragen nach AWS Ressourcen einer mandantenbezogenen AWS Identity and Access Management () -Richtlinie zuzuordnen. IAM Sie können den Code in diesem Muster als Grundlage für die Implementierung einer SaaS-Anwendung verwenden, die temporäre STS Anmeldeinformationen mit Gültigkeitsbereich auf der Grundlage der in einem JWT Token angegebenen Ansprüche generiert.

Voraussetzungen und Einschränkungen

Voraussetzungen

Einschränkungen

  • Dieser Code läuft in Java und unterstützt derzeit keine anderen Programmiersprachen. 

  • Die Beispielanwendung bietet keine AWS regionsübergreifende Unterstützung oder Unterstützung für Disaster Recovery (DR). 

  • Dieses Muster zeigt, wie eine Lambda TVM für eine SaaS-Anwendung begrenzten Mandantenzugriff bereitstellen kann. Es ist nicht für den Einsatz in Produktionsumgebungen vorgesehen.

Architektur

Zieltechnologie-Stack

  • AWSLambda

  • Amazon S3

  • IAM

  • AWSSicherheitstoken-Dienst () AWS STS

Zielarchitektur

Generieren eines Tokens, um temporäre STS Anmeldeinformationen für den Zugriff auf Daten in einem S3-Bucket zu erhalten.

Tools

AWSDienste

  • AWSCommand Line Interface (AWSCLI) ist ein Open-Source-Tool, mit dem Sie über Befehle in Ihrer Befehlszeilen-Shell mit AWS Diensten interagieren können.

  • AWSIdentity and Access Management (IAM) hilft Ihnen dabei, den Zugriff auf Ihre AWS Ressourcen sicher zu verwalten, indem kontrolliert wird, wer authentifiziert und autorisiert ist, diese zu verwenden.

  • AWSLambda ist ein Rechendienst, mit dem Sie Code ausführen können, ohne Server bereitstellen oder verwalten zu müssen. Er führt Ihren Code nur bei Bedarf aus und skaliert automatisch, sodass Sie nur für die tatsächlich genutzte Rechenzeit zahlen.

  • AWSDer Security Token Service (AWSSTS) hilft Ihnen dabei, temporäre Anmeldeinformationen mit eingeschränkten Rechten für Benutzer anzufordern.

  • Amazon Simple Storage Service (Amazon S3) ist ein cloudbasierter Objektspeicherservice, der Sie beim Speichern, Schützen und Abrufen beliebiger Datenmengen unterstützt.

Code

Der Quellcode für dieses Muster ist als Anlage verfügbar und umfasst die folgenden Dateien:

  • s3UploadSample.jarstellt den Quellcode für eine Lambda-Funktion bereit, die ein JSON Dokument in einen S3-Bucket hochlädt.

  • tvm-layer.zipstellt eine wiederverwendbare Java-Bibliothek bereit, die ein Token (STStemporäre Anmeldeinformationen) für die Lambda-Funktion bereitstellt, um auf den S3-Bucket zuzugreifen und das JSON Dokument hochzuladen.

  • token-vending-machine-sample-app.zipstellt den Quellcode bereit, der zur Erstellung dieser Artefakte und Kompilierungsanweisungen verwendet wurde.

Folgen Sie den Anweisungen im nächsten Abschnitt, um diese Dateien zu verwenden.

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Ermitteln Sie Variablenwerte.

Die Implementierung dieses Musters umfasst mehrere Variablennamen, die konsistent verwendet werden müssen. Ermitteln Sie die Werte, die für jede Variable verwendet werden sollen, und geben Sie diesen Wert an, wenn Sie in den nachfolgenden Schritten dazu aufgefordert werden.

< AWS Konto-ID> ─ Die 12-stellige Konto-ID, die dem AWS Konto zugeordnet ist, in dem Sie dieses Muster implementieren. Informationen dazu, wie Sie Ihre Konto-ID finden, AWS finden Sie in der Dokumentation unter Ihre AWS Konto-ID und deren Alias. IAM

< AWS Region> ─ Die AWS Region, in der Sie dieses Muster implementieren. Weitere Informationen zu AWS Regionen finden Sie auf der AWS Website unter Regionen und Verfügbarkeitszonen.

< sample-tenant-name > ─ Der Name eines Mandanten, der in der Anwendung verwendet werden soll. Der Einfachheit halber empfehlen wir, in diesem Wert nur alphanumerische Zeichen zu verwenden. Sie können jedoch jeden gültigen Namen für einen S3-Objektschlüssel verwenden.

< sample-tvm-role-name > ─ Der Name der IAM Rolle, die der Lambda-Funktion zugewiesen ist, die die TVM Beispielanwendung ausführt. Der Rollenname ist eine Zeichenfolge, die aus alphanumerischen Groß- und Kleinbuchstaben ohne Leerzeichen besteht. Sie können auch eines der folgenden Zeichen verwenden: Unterstrich (_), Pluszeichen (+), Gleichheitszeichen (=), Komma (,), Punkt (.), At-Zeichen (@) und Bindestrich (-). Der Rollenname muss innerhalb des Kontos eindeutig sein.

< sample-app-role-name > ─ Der Name der IAM Rolle, der von der Lambda-Funktion übernommen wird, wenn sie temporäre Anmeldeinformationen mit Gültigkeitsbereich generiert. STS Der Rollenname ist eine Zeichenfolge, die aus alphanumerischen Groß- und Kleinbuchstaben ohne Leerzeichen besteht. Sie können auch eines der folgenden Zeichen verwenden: Unterstrich (_), Pluszeichen (+), Gleichheitszeichen (=), Komma (,), Punkt (.), At-Zeichen (@) und Bindestrich (-). Der Rollenname muss innerhalb des Kontos eindeutig sein.

< sample-app-function-name > ─ Der Name der Lambda-Funktion. Dies ist eine Zeichenfolge mit einer Länge von bis zu 64 Zeichen.

< sample-app-bucket-name > ─ Der Name eines S3-Buckets, auf den mit Berechtigungen zugegriffen werden muss, die auf einen bestimmten Mandanten beschränkt sind. S3-Bucket-Namen:

  • Muss zwischen 3 und 63 Zeichen lang sein.

  • Darf nur aus Kleinbuchstaben, Zahlen, Punkten (.) und Bindestrichen (-) bestehen.

  • Muss mit einem Buchstaben oder einer Zahl beginnen und enden.

  • Darf nicht als IP-Adresse (z. B. 192.168.5.4) formatiert sein.

  • Muss innerhalb einer Partition eindeutig sein. Eine Partition ist eine Gruppe von Regionen. AWShat derzeit drei Partitionen: aws  (Standardregionen), aws-cn (Regionen China) und aws-us-gov (Regionen AWS GovCloud [USA]).

Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie einen S3-Bucket für die Beispielanwendung.

Verwenden Sie den folgenden AWS CLI Befehl, um einen S3-Bucket zu erstellen. Geben Sie den Wert < sample-app-bucket-name > im Codeausschnitt an:

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

Die Lambda-Beispielanwendung lädt JSON Dateien in diesen Bucket hoch.

Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie eine TVM Rolle.

Verwenden Sie einen der folgenden AWS CLI Befehle, um eine IAM Rolle zu erstellen. Geben Sie den Wert < sample-tvm-role-name > im Befehl ein.

Für macOS- oder Linux-Shells:

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

Für die Windows-Befehlszeile:

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

Die Lambda-Beispielanwendung übernimmt diese Rolle, wenn die Anwendung aufgerufen wird. Durch die Möglichkeit, die Anwendungsrolle mit einer bereichsbezogenen Richtlinie zu übernehmen, erhält der Code umfassendere Zugriffsberechtigungen auf den S3-Bucket.

Cloud-Administrator

Erstellen Sie eine TVM Inline-Rollenrichtlinie.

Verwenden Sie einen der folgenden AWS CLI Befehle, um eine IAM Richtlinie zu erstellen. Geben Sie die Werte < sample-tvm-role-name >, < AWS Account-ID> und < sample-app-role-name > in den Befehl ein.

Für macOS- oder Linux-Shells:

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

Für die Windows-Befehlszeile:

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

Diese Richtlinie ist an die TVM Rolle angehängt. Sie gibt dem Code die Möglichkeit, die Anwendungsrolle zu übernehmen, die über umfassendere Berechtigungen für den Zugriff auf den S3-Bucket verfügt.

Cloud-Administrator

Hängen Sie die verwaltete Lambda-Richtlinie an.

Verwenden Sie den folgenden AWS CLI Befehl, um die AWSLambdaBasicExecutionRole IAM Richtlinie anzuhängen. Geben Sie den Wert < sample-tvm-role-name > im Befehl ein:

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

Für die Windows-Befehlszeile:

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

Diese verwaltete Richtlinie ist der TVM Rolle zugeordnet, sodass Lambda Protokolle an Amazon CloudWatch senden kann.

Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie die Anwendungsrolle.

Verwenden Sie einen der folgenden AWS CLI Befehle, um eine IAM Rolle zu erstellen. Geben Sie die Werte < sample-app-role-name >, < AWS Account-ID> und < sample-tvm-role-name > in den Befehl ein.

Für macOS- oder Linux-Shells:

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

Für die Windows-Befehlszeile:

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

Die Lambda-Beispielanwendung übernimmt diese Rolle mit einer bereichsbezogenen Richtlinie, um mandantenbasierten Zugriff auf einen S3-Bucket zu erhalten.

Cloud-Administrator

Erstellen Sie eine Inline-Rollenrichtlinie für Anwendungen.

Verwenden Sie einen der folgenden AWS CLI Befehle, um eine IAM Richtlinie zu erstellen. Geben Sie die Werte < sample-app-role-name > und < sample-app-bucket-name > im Befehl ein.

Für macOS- oder Linux-Shells:

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

Für die Windows-Befehlszeile:

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

Diese Richtlinie ist der Anwendungsrolle zugeordnet. Sie bietet umfassenden Zugriff auf Objekte im S3-Bucket. Wenn die Beispielanwendung die Rolle übernimmt, werden diese Berechtigungen auf einen bestimmten Mandanten mit der dynamisch generierten Richtlinie TVM von beschränkt.

Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Laden Sie die kompilierten Quelldateien herunter.

Laden Sie die tvm-layer.zip Dateien s3UploadSample.jar und herunter, die als Anlagen enthalten sind. Den Quellcode, der zur Erstellung dieser Artefakte verwendet wurde, sowie Anweisungen zur Kompilierung finden Sie unter. token-vending-machine-sample-app.zip

Cloud-Administrator

Erstellen Sie die Lambda-Schicht.

Verwenden Sie den folgenden AWS CLI Befehl, um eine Lambda-Schicht zu erstellen, die Lambda TVM zugänglich macht. 

Hinweis: Wenn Sie diesen Befehl nicht von dem Speicherort aus ausführen, den Sie heruntergeladen haben tvm-layer.zip, geben Sie tvm-layer.zip im Parameter den richtigen Pfad zu an. --zip-file 

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

Für die Windows-Befehlszeile:

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

Dieser Befehl erstellt eine Lambda-Schicht, die die wiederverwendbare TVM Bibliothek enthält.

Cloud-Administrator, App-Entwickler

So erstellen Sie die Lambda-Funktion:

Verwenden Sie den folgenden AWS CLI Befehl, um eine Lambda-Funktion zu erstellen. Geben Sie die Werte < sample-app-function-name >, < AWS Account-ID>, < AWS Region>, < sample-tvm-role-name >, < sample-app-bucket-name > und < sample-app-role-name > in den Befehl ein. 

Hinweis: Wenn Sie diesen Befehl nicht von dem Speicherort aus ausführen, an dem Sie ihn heruntergeladen habens3UploadSample.jar, geben Sie s3UploadSample.jar im Parameter den richtigen Pfad zu an. --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>}"

Für die Windows-Befehlszeile:

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

Dieser Befehl erstellt eine Lambda-Funktion mit dem Beispielanwendungscode und der angehängten TVM Ebene. Außerdem werden zwei Umgebungsvariablen festgelegt: S3_BUCKET undROLE. Die Beispielanwendung verwendet diese Variablen, um die Rolle zu bestimmen, die übernommen werden soll, und den S3-Bucket, in den JSON Dokumente hochgeladen werden sollen.

Cloud-Administrator, App-Entwickler
AufgabeBeschreibungErforderliche Fähigkeiten

Rufen Sie die Lambda-Beispielanwendung auf.

Verwenden Sie einen der folgenden AWS CLI Befehle, um die Lambda-Beispielanwendung mit der erwarteten Nutzlast zu starten. Geben Sie die Werte < sample-app-function-name > und < sample-tenant-name > im Befehl ein.

Für macOS- und Linux-Shells:

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

Für die Windows-Befehlszeile:

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

Dieser Befehl ruft die Lambda-Funktion auf und gibt das Ergebnis in einem response.json Dokument zurück. Auf vielen UNIX-basierten Systemen können Sie response.json zu ändern, /dev/stdout um die Ergebnisse direkt in Ihrer Shell auszugeben, ohne eine weitere Datei zu erstellen. 

Hinweis: Wenn Sie den Wert < sample-tenant-name > in nachfolgenden Aufrufen dieser Lambda-Funktion ändern, werden der Speicherort des JSON Dokuments und die vom Token bereitgestellten Berechtigungen geändert.

Cloud-Administrator, App-Entwickler

Sehen Sie sich den S3-Bucket an, um die erstellten Objekte zu sehen.

Navigieren Sie zu dem S3-Bucket (< sample-app-bucket-name >), den Sie zuvor erstellt haben. Dieser Bucket enthält ein S3-Objektpräfix mit dem Wert < sample-tenant-name >. Unter diesem Präfix finden Sie ein JSON Dokument, das mit einem benannt istUUID. Wenn Sie die Beispielanwendung mehrmals aufrufen, werden weitere JSON Dokumente hinzugefügt.

Cloud-Administrator

Sehen Sie sich die Cloudwatch-Protokolle für die Beispielanwendung an.

Sehen Sie sich die Cloudwatch-Protokolle an, die der Lambda-Funktion mit dem Namen < > sample-app-function-name zugeordnet sind. Anweisungen finden Sie unter Zugreifen auf CloudWatch Amazon-Logs für AWS Lambda in der AWS Lambda-Dokumentation. In diesen Protokollen können Sie die Richtlinie für den Mandantenbereich einsehen, die durch die generiert wurde. TVM Diese mandantenspezifische Richtlinie gewährt Amazon S3,, und Berechtigungen für die Beispielanwendung PutObjectGetObject, DeleteObjectjedoch nur für das Objektpräfix ListBucketAPIs, das mit < > verknüpft ist. sample-tenant-name Wenn Sie bei nachfolgenden Aufrufen der Beispielanwendung < sample-tenant-name > ändern, wird die bereichsbezogene Richtlinie so TVM aktualisiert, dass sie dem Mandanten entspricht, der in der Aufruf-Payload angegeben ist. Diese dynamisch generierte Richtlinie zeigt, wie der mandantenbezogene Zugriff mit SaaS-Anwendungen aufrechterhalten werden kann. TVM 

Die TVM Funktionalität wird in einer Lambda-Schicht bereitgestellt, sodass sie an andere Lambda-Funktionen angehängt werden kann, die von einer Anwendung verwendet werden, ohne dass der Code repliziert werden muss.

Eine Veranschaulichung der dynamisch generierten Richtlinie finden Sie im Abschnitt Zusätzliche Informationen.

Cloud-Administrator

Zugehörige Ressourcen

Zusätzliche Informationen

Das folgende Amazon Cloudwatch-Protokoll zeigt die dynamisch generierte Richtlinie, die durch den TVM Code in diesem Muster erstellt wurde. In diesem Screenshot ist < sample-app-bucket-name > DOC-EXAMPLE-BUCKET und < sample-tenant-name > isttest-tenant-1. Die von dieser bereichsbezogenen Richtlinie zurückgegebenen STS Anmeldeinformationen können keine Aktionen für Objekte im S3-Bucket ausführen, mit Ausnahme von Objekten, die dem Objektschlüsselpräfix zugeordnet sind. test-tenant-1

JSON policy document allowing S3 actions on a specific bucket with prefix conditions.

Anlagen

Um auf zusätzliche Inhalte zuzugreifen, die mit diesem Dokument verknüpft sind, entpacken Sie die folgende Datei: attachment.zip