Menerapkan isolasi penyewa SaaS untuk Amazon S3 dengan menggunakan mesin penjual otomatis token AWS Lambda - AWS Prescriptive Guidance

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menerapkan isolasi penyewa SaaS untuk Amazon S3 dengan menggunakan mesin penjual otomatis token AWS Lambda

Tabby Ward, Thomas Davis, dan Sravan Periyathambi, Amazon Web Services

Ringkasan

Aplikasi SaaS multitenant harus menerapkan sistem untuk memastikan bahwa isolasi penyewa dipertahankan. Saat menyimpan data penyewa pada AWS sumber daya yang sama—seperti saat beberapa penyewa menyimpan data dalam ember Amazon Simple Storage Service (Amazon S3) S3—Anda harus memastikan bahwa akses lintas penyewa tidak dapat terjadi. Token vending machine (TVMs) adalah salah satu cara untuk menyediakan isolasi data penyewa. Mesin-mesin ini menyediakan mekanisme untuk mendapatkan token sambil mengabstraksi kompleksitas bagaimana token ini dihasilkan. Pengembang dapat menggunakan TVM tanpa memiliki pengetahuan rinci tentang bagaimana menghasilkan token.

Pola ini mengimplementasikan TVM dengan menggunakan. AWS Lambda TVM menghasilkan token yang terdiri dari kredenal layanan token keamanan sementara (STS) yang membatasi akses ke data penyewa SaaS tunggal dalam bucket S3.

TVMs, dan kode yang disediakan dengan pola ini, biasanya digunakan dengan klaim yang berasal dari JSON Web Tokens (JWTs) untuk mengaitkan permintaan AWS sumber daya dengan kebijakan cakupan penyewa (IAM AWS Identity and Access Management ). Anda dapat menggunakan kode dalam pola ini sebagai dasar untuk mengimplementasikan aplikasi SaaS yang menghasilkan kredensi STS sementara cakupan berdasarkan klaim yang diberikan dalam token JWT.

Prasyarat dan batasan

Prasyarat

Batasan

  • Kode ini berjalan di Java dan saat ini tidak mendukung bahasa pemrograman lainnya. 

  • Aplikasi sampel tidak menyertakan dukungan AWS Cross-region atau disaster recovery (DR). 

  • Pola ini menunjukkan bagaimana TVM Lambda untuk aplikasi SaaS dapat menyediakan akses penyewa cakupan. Pola ini tidak dimaksudkan untuk digunakan di lingkungan produksi tanpa pengujian keamanan tambahan sebagai bagian dari aplikasi atau kasus penggunaan spesifik Anda.

Arsitektur

Tumpukan teknologi target

  • AWS Lambda

  • Amazon S3

  • IAM

  • AWS Security Token Service (AWS STS)

Arsitektur target

Menghasilkan token untuk mendapatkan kredensi STS sementara untuk mengakses data dalam bucket S3.

Alat

Layanan AWS

  • AWS Command Line Interface (AWS CLI) adalah alat sumber terbuka yang membantu Anda berinteraksi Layanan AWS melalui perintah di shell baris perintah Anda.

  • AWS Identity and Access Management (IAM) membantu Anda mengelola akses ke AWS sumber daya dengan aman dengan mengontrol siapa yang diautentikasi dan diberi wewenang untuk menggunakannya.

  • AWS Lambdaadalah layanan komputasi yang membantu Anda menjalankan kode tanpa perlu menyediakan atau mengelola server. Ini menjalankan kode Anda hanya bila diperlukan dan skala secara otomatis, jadi Anda hanya membayar untuk waktu komputasi yang Anda gunakan.

  • AWS Security Token Service (AWS STS) membantu Anda meminta kredensil hak istimewa terbatas sementara untuk pengguna.

  • Amazon Simple Storage Service (Amazon S3) adalah layanan penyimpanan objek berbasis cloud yang membantu Anda menyimpan, melindungi, dan mengambil sejumlah data.

Kode

Kode sumber untuk pola ini tersedia sebagai lampiran dan termasuk file-file berikut:

  • s3UploadSample.jarmenyediakan kode sumber untuk fungsi Lambda yang mengunggah dokumen JSON ke bucket S3.

  • tvm-layer.zipmenyediakan pustaka Java yang dapat digunakan kembali yang memasok token (kredensi sementara STS) untuk fungsi Lambda untuk mengakses bucket S3 dan mengunggah dokumen JSON.

  • token-vending-machine-sample-app.zipmenyediakan kode sumber yang digunakan untuk membuat artefak dan instruksi kompilasi ini.

Untuk menggunakan file-file ini, ikuti instruksi di bagian selanjutnya.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Tentukan nilai variabel.

Implementasi pola ini mencakup beberapa nama variabel yang harus digunakan secara konsisten. Tentukan nilai yang harus digunakan untuk setiap variabel, dan berikan nilai itu ketika diminta dalam langkah selanjutnya.

  • <AWS Account ID>─ 12 digit ID akun yang terkait dengan Akun AWS Anda menerapkan pola ini. Untuk informasi tentang cara menemukan Akun AWS ID Anda, lihat Menggunakan alias untuk Akun AWS ID Anda dalam dokumentasi IAM.

  • <AWS Region>─ Di Wilayah AWS mana Anda menerapkan pola ini. Untuk informasi selengkapnya Wilayah AWS, lihat Wilayah dan Zona Ketersediaan di AWS situs web.

  • <sample-tenant-name>─ Nama penyewa untuk digunakan dalam aplikasi. Kami menyarankan Anda hanya menggunakan karakter alfanumerik dalam nilai ini untuk kesederhanaan, tetapi Anda dapat menggunakan nama yang valid untuk kunci objek S3.

  • <sample-tvm-role-name>─ Nama peran IAM yang melekat pada fungsi Lambda yang menjalankan TVM dan aplikasi sampel. Nama peran adalah string yang terdiri dari karakter alfanumerik huruf besar dan kecil tanpa spasi. Anda juga dapat menyertakan salah satu karakter berikut: garis bawah (_), tanda plus (+), tanda sama dengan (=), koma (,), titik (.), di tanda (@), dan tanda hubung (-). Nama peran harus unik dalam akun tersebut.

  • <sample-app-role-name>─ Nama peran IAM yang diasumsikan oleh fungsi Lambda ketika menghasilkan kredenal STS sementara yang terbatas. Nama peran adalah string yang terdiri dari karakter alfanumerik huruf besar dan kecil tanpa spasi. Anda juga dapat menyertakan salah satu karakter berikut: garis bawah (_), tanda plus (+), tanda sama dengan (=), koma (,), titik (.), di tanda (@), dan tanda hubung (-). Nama peran harus unik dalam akun tersebut.

  • <sample-app-function-name>─ Nama fungsi Lambda. Ini adalah string yang panjangnya hingga 64 karakter.

  • <sample-app-bucket-name>─ Nama bucket S3 yang harus diakses dengan izin yang dicakup oleh penyewa tertentu. Nama ember S3:

    • Panjangnya harus antara 3 dan 63 karakter.

    • Harus terdiri dari hanya huruf kecil, angka, titik (.), dan tanda hubung (-).

    • Harus dimulai dan diakhiri dengan huruf atau angka.

    • Tidak boleh diformat sebagai alamat IP (misalnya, 192.168.5.4).

    • Harus unik di dalam partisi. Partisi adalah pengelompokan Wilayah. AWS saat ini memiliki tiga partisi: aws untuk Wilayah Standar, aws-cn untuk Wilayah Tiongkok, dan aws-us-gov untuk. AWS GovCloud (US) Regions

Administrator awan
TugasDeskripsiKeterampilan yang dibutuhkan

Buat bucket S3 untuk aplikasi sampel.

Gunakan AWS CLI perintah berikut untuk membuat bucket S3. Berikan <sample-app-bucket-name> nilai dalam cuplikan kode:

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

Aplikasi sampel Lambda mengunggah file JSON ke bucket ini.

Administrator awan
TugasDeskripsiKeterampilan yang dibutuhkan

Buat peran TVM.

Gunakan salah satu AWS CLI perintah berikut untuk membuat peran IAM. Berikan <sample-tvm-role-name> nilai dalam perintah.

Untuk shell macOS atau 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>" } } } ] }'

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

Contoh aplikasi Lambda mengasumsikan peran ini saat aplikasi dipanggil. Kemampuan untuk mengambil peran aplikasi dengan kebijakan cakupan memberikan izin kode yang lebih luas untuk mengakses bucket S3.

Administrator awan

Buat kebijakan peran TVM sebaris.

Gunakan salah satu AWS CLI perintah berikut untuk membuat kebijakan IAM. Berikan<sample-tvm-role-name>, <AWS Account ID>, dan <sample-app-role-name> nilai dalam perintah.

Untuk shell macOS atau 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>" } ]}'

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

Kebijakan ini dilampirkan pada peran TVM. Ini memberi kode kemampuan untuk mengambil peran aplikasi, yang memiliki izin yang lebih luas untuk mengakses bucket S3.

Administrator awan

Lampirkan kebijakan Lambda yang dikelola.

Gunakan AWS CLI perintah berikut untuk melampirkan kebijakan AWSLambdaBasicExecutionRole IAM. Berikan <sample-tvm-role-name> nilai dalam perintah:

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

Untuk baris perintah Windows:

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

Kebijakan terkelola ini dilampirkan pada peran TVM untuk mengizinkan Lambda mengirim log ke Amazon. CloudWatch

Administrator awan
TugasDeskripsiKeterampilan yang dibutuhkan

Buat peran aplikasi.

Gunakan salah satu AWS CLI perintah berikut untuk membuat peran IAM. Berikan<sample-app-role-name>,<AWS Account ID>, dan <sample-tvm-role-name> nilai dalam perintah.

Untuk shell macOS atau 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" } ]}'

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

Aplikasi sampel Lambda mengasumsikan peran ini dengan kebijakan cakupan untuk mendapatkan akses berbasis penyewa ke bucket S3.

Administrator awan

Buat kebijakan peran aplikasi inline.

Gunakan salah satu AWS CLI mmands berikut untuk membuat kebijakan IAM. Berikan <sample-app-role-name> dan <sample-app-bucket-name> nilai dalam perintah.

Untuk shell macOS atau 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>" } ]}'

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

Kebijakan ini dilampirkan pada peran aplikasi. Ini menyediakan akses luas ke objek di bucket S3. Saat aplikasi sampel mengasumsikan peran tersebut, izin ini akan dicakup oleh penyewa tertentu dengan kebijakan TVM yang dihasilkan secara dinamis.

Administrator awan
TugasDeskripsiKeterampilan yang dibutuhkan

Unduh file sumber yang dikompilasi.

Unduh tvm-layer.zip file s3UploadSample.jar dan, yang disertakan sebagai lampiran. Kode sumber yang digunakan untuk membuat artefak dan instusi kompilasi ini disediakan di. token-vending-machine-sample-app.zip

Administrator awan

Buat layer Lambda.

Gunakan AWS CLI perintah berikut untuk membuat layer Lambda, yang membuat TVM dapat diakses oleh Lambda. 

catatan

Jika Anda tidak menjalankan perintah ini dari lokasi di mana Anda mengunduh tvm-layer.zip, berikan jalur yang benar ke tvm-layer.zip dalam --zip-file parameter. 

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

Untuk baris perintah Windows:

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

Perintah ini membuat lapisan Lambda yang berisi pustaka TVM yang dapat digunakan kembali.

Administrator cloud, Pengembang aplikasi

Buat fungsi Lambda.

Gunakan AWS CLI perintah berikut untuk membuat fungsi Lambda. Berikan<sample-app-function-name>,<AWS Account ID>,<AWS Region>,<sample-tvm-role-name>,<sample-app-bucket-name>, dan <sample-app-role-name> nilai dalam perintah. 

catatan

Jika Anda tidak menjalankan perintah ini dari lokasi di mana Anda mengunduhs3UploadSample.jar, berikan jalur yang benar ke s3UploadSample.jar dalam --zip-file parameter. 

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

Untuk baris perintah 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>}"

Perintah ini menciptakan fungsi Lambda dengan kode aplikasi sampel dan lapisan TVM terpasang. Ini juga menetapkan dua variabel lingkungan: S3_BUCKET danROLE. Aplikasi sampel menggunakan variabel-variabel ini untuk menentukan peran yang akan diasumsikan dan bucket S3 untuk mengunggah dokumen JSON.

Administrator cloud, Pengembang aplikasi
TugasDeskripsiKeterampilan yang dibutuhkan

Memanggil aplikasi sampel Lambda.

Gunakan salah satu AWS CLI perintah berikut untuk memulai aplikasi sampel Lambda dengan muatan yang diharapkan. Berikan <sample-app-function-name> dan <sample-tenant-name> nilai dalam perintah.

Untuk shell macOS dan 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

Untuk baris perintah 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

Perintah ini memanggil fungsi Lambda dan mengembalikan hasilnya dalam dokumen. response.json Pada banyak sistem berbasis Unix, Anda dapat mengubah response.json /dev/stdout untuk menampilkan hasil langsung ke shell Anda tanpa membuat file lain. 

catatan

Mengubah <sample-tenant-name> nilai dalam pemanggilan berikutnya dari fungsi Lambda ini mengubah lokasi dokumen JSON dan izin yang diberikan token.

Administrator cloud, Pengembang aplikasi

Lihat bucket S3 untuk melihat objek yang dibuat.

Jelajahi bucket S3 (<sample-app-bucket-name>) yang Anda buat sebelumnya. Bucket ini berisi awalan objek S3 dengan nilai. <sample-tenant-name> Di bawah awalan itu, Anda akan menemukan dokumen JSON bernama dengan UUID. Memanggil aplikasi sampel beberapa kali menambahkan lebih banyak dokumen JSON.

Administrator awan

Lihat log untuk aplikasi sampel di CloudWatch Log.

Lihat log yang terkait dengan fungsi Lambda yang dinamai <sample-app-function-name> di CloudWatch Log. Untuk petunjuk, lihat Mengirim log fungsi Lambda ke CloudWatch Log dalam dokumentasi Lambda. Anda dapat melihat kebijakan cakupan penyewa yang dihasilkan oleh TVM di log ini. Kebijakan cakupan penyewa ini memberikan izin untuk aplikasi sampel ke Amazon S3,, dan PutObjectGetObjectDeleteObjectListBucket APIs, tetapi hanya untuk awalan objek yang terkait dengannya. <sample-tenant-name> Dalam pemanggilan aplikasi sampel berikutnya, jika Anda mengubah<sample-tenant-name>, TVM memperbarui kebijakan cakupan agar sesuai dengan penyewa yang disediakan dalam muatan pemanggilan. Kebijakan yang dihasilkan secara dinamis ini menunjukkan bagaimana akses cakupan penyewa dapat dipertahankan dengan TVM di aplikasi SaaS. 

Fungsionalitas TVM disediakan dalam lapisan Lambda sehingga dapat dilampirkan ke fungsi Lambda lain yang digunakan oleh aplikasi tanpa harus mereplikasi kode.

Untuk ilustrasi kebijakan yang dihasilkan secara dinamis, lihat bagian Informasi tambahan.

Administrator awan

Sumber daya terkait

Informasi tambahan

Log berikut menunjukkan kebijakan yang dihasilkan secara dinamis yang dihasilkan oleh kode TVM dalam pola ini. Dalam tangkapan layar ini, <sample-app-bucket-name> adalah DOC-EXAMPLE-BUCKET dan yang <sample-tenant-name> adatest-tenant-1. Kredensi STS yang dikembalikan oleh kebijakan cakupan ini tidak dapat melakukan tindakan apa pun pada objek di bucket S3 kecuali untuk objek yang terkait dengan awalan key objek. test-tenant-1

Log menunjukkan kebijakan yang dihasilkan secara dinamis yang dihasilkan oleh kode TVM.

Lampiran

Untuk mengakses konten tambahan yang terkait dengan dokumen ini, unzip file berikut: attachment.zip