示例 3:使用 RBAC 进行多租户访问控制 - AWS 规范性指导

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

示例 3:使用 RBAC 进行多租户访问控制

要详细说明前面的 RBAC 示例,您可以扩展您的要求以包括 SaaS 多租户,这是 SaaS 提供商的常见要求。在多租户解决方案中,总是代表给定租户提供资源访问权限。也就是说,租户 A 的用户无法查看租户 B 的数据,即使这些数据在逻辑上或物理上并置在系统中。以下示例说明了如何使用多个已验证权限策略存储来实现租户隔离,以及如何使用用户角色在租户内定义权限。

使用每租户策略存储设计模式是在使用已验证权限实施访问控制的同时保持租户隔离的最佳实践。在这种情况下,租户 A 和租户 B 的用户请求将分别根据不同的策略存储DATAMICROSERVICE_POLICYSTORE_A和进行DATAMICROSERVICE_POLICYSTORE_B验证。有关多租户 SaaS 应用程序的已验证权限设计注意事项的更多信息,请参阅已验证权限多租户设计注意事项部分

使用 RBAC、Amazon 验证权限和 Cedar 进行多租户访问控制的示例

以下策略位于DATAMICROSERVICE_POLICYSTORE_A策略存储中。它验证主体是否将成为该类型RoleallAccessRole的一部分。在这种情况下,将允许委托人对与租户 A 关联的所有资源执行viewDataupdateData操作。

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

以下策略位于DATAMICROSERVICE_POLICYSTORE_B策略存储中。第一个策略验证委托人是否属于该类型updateDataRoleRole组。假设是这样,则它允许委托人对与租户 B 关联的资源执行操作。updateData

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

第二项政策规定,Role应允许属于该类型viewDataRole组的委托人对与租户 viewData B 关联的资源执行操作。

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

租户 A 发出的授权请求需要发送到DATAMICROSERVICE_POLICYSTORE_A策略存储区,并由属于该存储的策略进行验证。在本例中,前面作为本示例一部分讨论的第一个策略对其进行了验证。在此授权请求中,类型User为的委托人Alice正在请求执行viewData操作。主体属于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,则会看到类似以下授权请求的内容。该请求之所以被发送到DATAMICROSERVICE_POLICYSTORE_B策略存储,是因为它来自租户 B。在此请求中,委托Bob人想要updateData对资源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": [] } ] } }

在第三个示例中,User Alice 尝试对资源执行viewData操作SampleData。此请求被定向到DATAMICROSERVICE_POLICYSTORE_A策略存储,因为委托人Alice属于租户 AAlice,属于该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": [] } ] } }