例 3: RBAC によるマルチテナントアクセスコントロール - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

例 3: RBAC によるマルチテナントアクセスコントロール

前の RBAC の例について詳しく説明するために、SaaS プロバイダーの一般的な要件である SaaS マルチテナンシーを含めるように要件を拡張できます。マルチテナントソリューションでは、リソースアクセスは常に特定のテナントに代わって提供されます。つまり、テナント A のユーザーは、データが論理的または物理的にシステムにコロケーションされている場合でも、テナント B のデータを表示できません。次の例は、複数の Verified Permissions ポリシーストアを使用してテナント分離を実装する方法と、ユーザーロールを使用してテナント内のアクセス許可を定義する方法を示しています。

テナントごとのポリシーストア設計パターンを使用することは、Verified Permissions によるアクセスコントロールを実装しながらテナントの分離を維持するためのベストプラクティスです。このシナリオでは、テナント A とテナント B のユーザーリクエストはDATAMICROSERVICE_POLICYSTORE_B、それぞれ個別のポリシーストア DATAMICROSERVICE_POLICYSTORE_Aおよび に対して検証されます。マルチテナント SaaS アプリケーションの Verified Permissions 設計上の考慮事項の詳細については、「Verified Permissions マルチテナント設計上の考慮事項」セクションを参照してください。

RBAC、Amazon Verified Permissions、Cedar を使用したマルチテナントアクセスコントロールの例

次のポリシーは、DATAMICROSERVICE_POLICYSTORE_Aポリシーストアにあります。プリンシパルがタイプ allAccessRoleのグループの一部であることを確認しますRole。この場合、プリンシパルはテナント A に関連付けられているすべてのリソースに対して viewDataおよび updateDataアクションを実行できます。

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

次のポリシーは、DATAMICROSERVICE_POLICYSTORE_Bポリシーストアにあります。最初のポリシーは、プリンシパルがタイプ のupdateDataRoleグループの一部であることを確認しますRole。その場合、テナント B に関連付けられているリソースに対してupdateDataアクションを実行するアクセス許可をプリンシパルに付与します。

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

この 2 番目のポリシーでは、タイプ のviewDataRoleグループの一部であるプリンシパルが、テナント B に関連付けられているリソースに対して viewDataアクションを実行することを許可Roleする必要があります。

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

テナント A から行われた認可リクエストは、DATAMICROSERVICE_POLICYSTORE_Aポリシーストアに送信され、そのストアに属するポリシーによって検証される必要があります。この場合、この例の一部として前述した最初のポリシーによって検証されます。この認可リクエストでは、 の値Userを持つ タイプのプリンシパルAliceviewData アクションの実行をリクエストしています。プリンシパルは、タイプ allAccessRoleのグループに属しますRole。Alice はSampleDataリソースに対して viewDataアクションを実行しようとしています。Alice には allAccessRoleロールがあるため、この評価では がALLOW決定されます。

{ "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": [] } ] } }

代わりに、 によってテナント B から行われたリクエストを表示するとUser Bob、次のような承認リクエストが表示されます。リクエストはテナント B から発信されるため、DATAMICROSERVICE_POLICYSTORE_Bポリシーストアに送信されます。このリクエストでは、プリンシパルはリソース updateDataに対して アクションを実行したいBobと考えていますSampleData。ただし、 Bobは、そのリソースupdateDataに対する アクションにアクセスできるグループの一部ではありません。したがって、リクエストはDENY決定になります。

{ "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": [] } ] } }

この 3 番目の例では、 はリソース に対して viewDataアクションを実行User Alice しようとしますSampleData。このリクエストは、プリンシパルがテナント A にAlice属しているため、DATAMICROSERVICE_POLICYSTORE_Aポリシーストアに送信されます。 Aliceはタイプ allAccessRoleのグループの一部でありRole、 リソースに対して viewDataアクションを実行することを許可します。そのため、リクエストは ALLOW決定になります。

{ "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": [] } ] } }