例 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 ソリューションを表します。

この例では、ユーザーロック機能を実装account_lockout_flagするために、認可リクエストのUserエンティティプリンシパルに 属性を追加します。このフラグは、システムへのユーザーアクセスをロックし、ロックアウトされたユーザーに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 ですData。親エンティティTenantAとして SampleData があります。

ポリシーストアの最初の<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" } ] } ] } }