翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
例 4: RBAC と ABAC によるマルチテナントアクセスコントロール
前のセクションの RBAC の例を強化するために、ユーザーに属性を追加して、マルチテナントアクセスコントロールの RBAC-ABAC ハイブリッドアプローチを作成できます。この例では、前の例と同じロールが含まれていますが、ユーザー属性 account_lockout_flag
とコンテキストパラメータ を追加しますuses_mfa
。この例では、RBAC と ABAC の両方を使用してマルチテナントアクセスコントロールを実装するために異なるアプローチを採用しており、テナントごとに異なるポリシーストアではなく 1 つの共有ポリシーストアを使用しています。

この例では、前の例と同様に、テナント 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_flag
が false
であり、 のコンテキスト値が にuses_mfa
評価されることを検証しますtrue
。
同様に、次のポリシーにより、プリンシパルとリソースの両方が同じテナントに関連付けられ、クロステナントアクセスが防止されます。このポリシーは、プリンシパルが のメンバーであることも保証viewDataRole
し、アクションを に制限しますviewData
。さらに、 account_lockout_flag
が false
であり、 のコンテキスト値が に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
を行いますallAccessRole
。 Alice
には、値が 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" } ] } ] } }