Contoh 3: Kontrol akses multi-penyewa dengan RBAC - AWS Bimbingan Preskriptif

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

Contoh 3: Kontrol akses multi-penyewa dengan RBAC

Untuk menguraikan contoh RBAC sebelumnya, Anda dapat memperluas persyaratan Anda untuk memasukkan multi-tenancy SaaS, yang merupakan persyaratan umum untuk penyedia SaaS. Dalam solusi multi-penyewa, akses sumber daya selalu disediakan atas nama penyewa tertentu. Artinya, pengguna Tenant A tidak dapat melihat data Tenant B, bahkan jika data tersebut secara logis atau fisik ditempatkan dalam suatu sistem. Contoh berikut menggambarkan bagaimana Anda dapat menerapkan isolasi penyewa dengan menggunakan beberapa penyimpanan kebijakan Izin Terverifikasi, dan bagaimana Anda dapat menggunakan peran pengguna untuk menentukan izin dalam penyewa.

Menggunakan pola desain Toko Kebijakan Per Penyewa adalah praktik terbaik untuk mempertahankan isolasi penyewa sambil menerapkan kontrol akses dengan Izin Terverifikasi. Dalam skenario ini, permintaan pengguna Penyewa A dan Penyewa B diverifikasi terhadap penyimpanan kebijakan terpisah, DATAMICROSERVICE_POLICYSTORE_A danDATAMICROSERVICE_POLICYSTORE_B, masing-masing. Untuk informasi selengkapnya tentang pertimbangan desain Izin Terverifikasi untuk aplikasi SaaS multi-penyewa, lihat bagian pertimbangan desain multi-penyewa Izin Terverifikasi.

Contoh kontrol akses multi-tenant dengan RBAC, Izin Terverifikasi Amazon, dan Cedar

Kebijakan berikut berada di toko DATAMICROSERVICE_POLICYSTORE_A kebijakan. Ini memverifikasi bahwa kepala sekolah akan menjadi bagian dari kelompok allAccessRole tipeRole. Dalam hal ini, kepala sekolah akan diizinkan untuk melakukan viewData dan updateData tindakan pada semua sumber daya yang terkait dengan Penyewa A.

permit ( principal in MultitenantApp::Role::"allAccessRole", action in [ MultitenantApp::Action::"viewData", MultitenantApp::Action::"updateData" ], resource );

Kebijakan berikut berada di toko DATAMICROSERVICE_POLICYSTORE_B kebijakan. Kebijakan pertama memverifikasi bahwa prinsipal adalah bagian dari updateDataRole kelompok tipeRole. Dengan asumsi demikian, ia memberikan izin kepada kepala sekolah untuk melakukan updateData tindakan pada sumber daya yang terkait dengan Penyewa B.

permit ( principal in MultitenantApp::Role::"updateDataRole", action == MultitenantApp::Action::"updateData", resource );

Kebijakan kedua ini mengamanatkan bahwa kepala sekolah yang merupakan bagian dari viewDataRole kelompok tipe Role harus diizinkan untuk melakukan viewData tindakan terhadap sumber daya yang terkait dengan Penyewa B.

permit ( principal in MultitenantApp::Role::"viewDataRole", action == MultitenantApp::Action::"viewData", resource );

Permintaan otorisasi yang dibuat dari Penyewa A perlu dikirim ke toko DATAMICROSERVICE_POLICYSTORE_A kebijakan dan diverifikasi oleh kebijakan milik toko tersebut. Dalam hal ini, ini diverifikasi oleh kebijakan pertama yang dibahas sebelumnya sebagai bagian dari contoh ini. Dalam permintaan otorisasi ini, prinsipal tipe User dengan nilai Alice meminta untuk melakukan tindakan. viewData Kepala sekolah termasuk dalam kelompok allAccessRole tipeRole. Alice sedang mencoba untuk melakukan viewData tindakan pada SampleData sumber daya. Karena Alice memiliki allAccessRole peran, evaluasi ini menghasilkan ALLOW keputusan.

{ "policyStoreId": "DATAMICROSERVICE_POLICYSTORE_A", "principal": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "action": { "actionType": "MultitenantApp::Action", "actionId": "viewData" }, "resource": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "entities": { "entityList": [ { "identifier": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "attributes": {}, "parents": [ { "entityType": "MultitenantApp::Role", "entityId": "allAccessRole" } ] }, { "identifier": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "attributes": {}, "parents": [] } ] } }

Jika, sebaliknya, Anda melihat permintaan yang dibuat dari Penyewa B olehUser Bob, Anda akan melihat sesuatu seperti permintaan otorisasi berikut. Permintaan dikirim ke toko DATAMICROSERVICE_POLICYSTORE_B kebijakan karena berasal dari Penyewa B. Dalam permintaan ini, kepala sekolah Bob ingin melakukan tindakan updateData pada sumber daya. SampleData Namun, Bob bukan bagian dari grup yang memiliki akses ke tindakan updateData pada sumber daya itu. Oleh karena itu, permintaan menghasilkan DENY keputusan.

{ "policyStoreId": "DATAMICROSERVICE_POLICYSTORE_B", "principal": { "entityType": "MultitenantApp::User", "entityId": "Bob" }, "action": { "actionType": "MultitenantApp::Action", "actionId": "updateData" }, "resource": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "entities": { "entityList": [ { "identifier": { "entityType": "MultitenantApp::User", "entityId": "Bob" }, "attributes": {}, "parents": [ { "entityType": "MultitenantApp::Role", "entityId": "viewDataRole" } ] }, { "identifier": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "attributes": {}, "parents": [] } ] } }

Dalam contoh ketiga ini, User Alice cobalah untuk melakukan viewData tindakan pada sumber dayaSampleData. Permintaan ini diarahkan ke toko DATAMICROSERVICE_POLICYSTORE_A kebijakan karena kepala sekolah Alice milik Penyewa A. Alice adalah bagian allAccessRole dari kelompok tipeRole, yang memungkinkannya untuk melakukan viewData tindakan pada sumber daya. Dengan demikian, permintaan menghasilkan ALLOW keputusan.

{ "policyStoreId": "DATAMICROSERVICE_POLICYSTORE_A", "principal": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "action": { "actionType": "MultitenantApp::Action", "actionId": "viewData" }, "resource": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "entities": { "entityList": [ { "identifier": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "attributes": {}, "parents": [ { "entityType": "MultitenantApp::Role", "entityId": "allAccessRole" } ] }, { "identifier": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "attributes": {}, "parents": [] } ] } }