View a markdown version of this page

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

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

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

前のセクションの RBAC の例を強化するために、ユーザーに属性を追加して、マルチテナントアクセスコントロールの RBAC-ABAC ハイブリッドアプローチを作成できます。この例では、前の例と同じロールが含まれていますが、ユーザー属性 account_lockout_flagとコンテキストパラメータ を追加しますuses_mfa。この例では、RBAC と ABAC の両方を使用してマルチテナントアクセスコントロールを実装するアプローチも異なり、テナントごとに異なるポリシーストアではなく 1 つの共有ポリシーストアを使用します。

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

この例は、前の例と同様に、テナント A とテナント B の承認決定を行う必要があるマルチテナント SaaS ソリューションを表します。

ユーザーロック機能を実装するために、この例では、認可リクエストのUserエンティティプリンシパルaccount_lockout_flagに 属性を追加します。このフラグは、システムへのユーザーアクセスをロックし、ロックアウトされたユーザーに対するDENYすべての権限を付与します。account_lockout_flag 属性はUserエンティティに関連付けられ、フラグが複数のセッションにわたってアクティブに取り消Userされるまで に対して有効です。この例では、 when条件を使用して を評価しますaccount_lockout_flag

この例では、リクエストとセッションに関する詳細も追加します。コンテキスト情報は、セッションが多要素認証を使用して認証されたことを指定します。この検証を実装するために、この例では when条件を使用して、コンテキストフィールドの一部として uses_mfaフラグを評価します。コンテキストを追加するためのベストプラクティスの詳細については、Cedar ドキュメントを参照してください。

permit ( principal in MultitenantApp::Role::"allAccessRole", action in [ MultitenantApp::Action::"viewData", MultitenantApp::Action::"updateData" ], resource ) when { principal.account_lockout_flag == false && context.uses_mfa == true && resource in principal.Tenant };

このポリシーは、リソースがリクエスト元のプリンシパルの Tenant 属性と同じグループにある場合を除き、リソースへのアクセスを禁止します。テナント分離を維持するためのこのアプローチは、1 つの共有マルチテナントポリシーストアアプローチと呼ばれます。マルチテナント SaaS アプリケーションの Verified Permissions 設計上の考慮事項の詳細については、「Verified Permissions マルチテナント設計上の考慮事項」セクションを参照してください。

このポリシーは、プリンシパルが のメンバーであることも保証allAccessRoleし、アクションを viewDataおよび に制限しますupdateData。さらに、このポリシーは、 account_lockout_flagfalseであり、 のコンテキスト値が にuses_mfa評価されることを確認しますtrue

同様に、次のポリシーでは、プリンシパルとリソースの両方が同じテナントに関連付けられていることを確認し、クロステナントアクセスを防止します。このポリシーは、プリンシパルが のメンバーであることも保証viewDataRoleし、アクションを に制限しますviewData。さらに、 account_lockout_flagfalseであり、 のコンテキスト値が にuses_mfa評価されることを確認しますtrue

permit ( principal in MultitenantApp::Role::"viewDataRole", action == MultitenantApp::Action::"viewData", resource ) when { principal.account_lockout_flag == false && context.uses_mfa == true && resource in principal.Tenant };

3 番目のポリシーは、前のポリシーと似ています。このポリシーでは、リソースが で表されるエンティティに対応するグループのメンバーであることが必要ですprincipal.Tenant。これにより、プリンシパルとリソースの両方がテナント B に関連付けられ、クロステナントアクセスが防止されます。このポリシーは、プリンシパルが のメンバーであることを保証updateDataRoleし、アクションを に制限しますupdateData。さらに、このポリシーは、 account_lockout_flagが であり、 のコンテキスト値が にuses_mfa評価falseされることを確認しますtrue

permit ( principal in MultitenantApp::Role::"updateDataRole", action == MultitenantApp::Action::"updateData", resource ) when { principal.account_lockout_flag == false && context.uses_mfa == true && resource in principal.Tenant };

次の認可リクエストは、このセクションで前述した 3 つのポリシーによって評価されます。この認可リクエストでは、 型のプリンシパルUserと の値が のプリンシパルは、ロール を使用してupdateDataリクエストAliceを行いますallAccessRoleAlice には、値が Tenantである 属性がありますTenant::"TenantA"。実行Aliceしようとしているアクションは updateData,で、適用するリソースのタイプは SampleData ですDataSampleData は親エンティティTenantAとして を持ちます。

ポリシーストアの最初の<DATAMICROSERVICE_POLICYSTOREID>ポリシーに従って、 はポリシーの when句の条件が満たされていると仮定して、リソースに対して updateData アクションを実行Aliceできます。最初の条件では、 principal.Tenant 属性を に評価する必要がありますTenantA。2 番目の条件では、プリンシパルの 属性を account_lockout_flagにする必要がありますfalse。最後の条件では、コンテキストを にuses_mfaする必要がありますtrue。3 つの条件がすべて満たされるため、リクエストはALLOW決定を返します。

{ "policyStoreId": "DATAMICROSERVICE_POLICYSTORE", "principal": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "action": { "actionType": "MultitenantApp::Action", "actionId": "updateData" }, "resource": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "context": { "contextMap": { "uses_mfa": { "boolean": true } } }, "entities": { "entityList": [ { "identifier": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "attributes": { { "account_lockout_flag": { "boolean": false }, "Tenant": { "entityIdentifier": { "entityType":"MultitenantApp::Tenant", "entityId":"TenantA" } } } }, "parents": [ { "entityType": "MultitenantApp::Role", "entityId": "allAccessRole" } ] }, { "identifier": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "attributes": {}, "parents": [ { "entityType": "MultitenantApp::Tenant", "entityId": "TenantA" } ] } ] } }