

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

# 一个共享的多租户策略存储
<a name="avp-design-shared-store"></a>

一个共享的多租户策略存储设计模型在 Amazon 中为所有租户使用 SaaS 解决方案中所有租户的单个多租户策略存储经过验证的权限。这种方法的主要好处是简化了管理和操作，特别是因为在租户入职期间，您不必创建额外的策略存储库。这种方法的缺点包括策略更新或部署中的任何失败或错误所造成的影响范围扩大，以及更容易受到[噪音邻居](https://docs.aws.amazon.com/wellarchitected/latest/saas-lens/noisy-neighbor.html)效应的影响。此外，如果您的解决方案要求每个租户都有独特的策略，我们不建议使用这种方法。在这种情况下，请改用每租户策略存储模型，以保证使用正确租户的策略。

一个共享的多租户策略存储方法类似于 SaaS [池化隔离模型](https://docs.aws.amazon.com/wellarchitected/latest/saas-lens/pool-isolation.html)。如果您的 SaaS 应用程序需要，它可以提供一种共享的租户隔离方法。如果您的 SaaS 解决方案对其微服务应用[孤立隔离](https://docs.aws.amazon.com/wellarchitected/latest/saas-lens/silo-isolation.html)，则也可以使用此模型。选择模型时，应独立评估租户数据隔离要求和 SaaS 应用程序所需的已验证权限策略结构。

如前所述，为了在整个 SaaS 解决方案中采用一致的方式共享租户标识符，最好在用户注册期间将标识符映射到用户的 SaaS 身份。您可以将 SaaS 应用程序作为 IdP 的一部分或外部数据源（例如 DynamoDB）进行维护，从而将其提供给 SaaS 应用程序。我们还建议您将共享策略存储 ID 映射到用户。尽管 ID 不用作租户隔离的一部分，但这是一种很好的做法，因为它有助于将来的更改。

以下示例显示了 API 端点如何为属于不同租户但与策略存储 ID 共享策略存储以`store-multi-tenant`进行授权的用户`Alice`和`Bob`发送 JWT。由于所有租户共享一个策略存储，因此您无需在令牌或数据库中维护策略存储 ID。由于所有租户共享一个策略存储 ID，因此您可以将该 ID 作为环境变量提供，您的应用程序可以使用该变量来调用策略存储。

![\[已验证权限共享设计模型\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/avp-shared.png)


以下示例策略说明了一个共享的多租户策略设计范例。在此策略中`MultiTenantApp::User`，`MultiTenantApp::Role``Admin`拥有父项的委托人有权查看所有资源的数据。

```
permit (
    principal in MultiTenantApp::Role::"Admin",
    action == MultiTenantApp::Action::"viewData",
    resource
);
```

由于使用的是单个策略存储，因此已验证权限策略存储必须确保与委托人关联的租赁属性与与资源关联的租赁属性相匹配。这可以通过在策略存储中加入以下策略来实现，以确保所有在资源和委托人上没有匹配租赁属性的授权请求都被拒绝。

```
forbid(
    principal, 
    action, 
    resource
)
unless {
    resource.Tenant == principal.Tenant
};
```

对于使用一个共享的多租户策略存储模型的授权请求，策略存储 ID 是共享策略存储的标识符。在以下请求中 `User``Alice`，允许访问是因为她有 of`Admin`，并且与资源和委托人关联的`Tenant`属性都是`TenantA`。`Role`

```
{
   "policyStoreId":"store-multi-tenant",
   "principal":{
      "entityType":"MultiTenantApp::User",
      "entityId":"Alice"
   },
   "action":{
      "actionType":"MultiTenantApp::Action",
      "actionId":"viewData"
   },
   "resource":{
      "entityType":"MultiTenantApp::Data",
      "entityId":"my_example_data"
   },
   "entities":{
      "entityList":[
         {
            "identifier":{
               "entityType":"MultiTenantApp::User",
               "entityId":"Alice"
            },
            "attributes": {
                {
                    "Tenant": {
                        "entityIdentifier": {
                            "entityType":"MultitenantApp::Tenant",
                            "entityId":"TenantA"
                        }
                    }
                }
            },
            "parents":[
               {
                  "entityType":"MultiTenantApp::Role",
                  "entityId":"Admin"
               }
            ]
         },
         {
            "identifier":{
               "entityType":"MultiTenantApp::Data",
               "entityId":"my_example_data"
            },
            "attributes": {
                {
                    "Tenant": {
                        "entityIdentifier": {
                            "entityType":"MultitenantApp::Tenant",
                            "entityId":"TenantA"
                        }
                    }
                }
            },
            "parents":[]
         }
      ]
   }
}
```

使用已验证的权限，可以将 IdP 与策略存储集成，但不是必需的。这种集成允许策略将身份存储中的委托人明确引用为策略的主体。[有关如何作为已验证权限的 IdP 与 Amazon Cognito 集成的更多信息，请参阅已验证权限文档和 [Amazon](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/identity-providers.html) Cognito 文档。](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-authorization-with-avp.html)

将策略存储与 IdP 集成时，每个策略存储只能使用一个[身份源](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/identity-providers.html)。例如，如果您选择将已验证权限与 Amazon Cognito 集成，则必须镜像用于隔离已验证权限策略存储和 Amazon Cognito 用户池的租户策略。策略存储库和用户池也必须位于同一位置 AWS 账户。

![\[在共享设计模型中将经过验证的权限与 Amazon Cognito 集成\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/cognito-shared.png)


从运营和审计的角度来看，一个共享的多租户策略存储模式有一个缺点，因为[记录的活动 AWS CloudTrail](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/monitoring-overview.html)需要更多的复杂查询才能筛选出租户上的单个活动，因为每个记录的 CloudTrail 呼叫都使用相同的策略存储。在这种情况下，将每个租户维度上的其他自定义指标记录 CloudWatch 到 Amazon 会很有帮助，这样可以确保适当的可观察性和审计能力水平。

单一共享的多租户策略存储方法还需要密切关注[已验证的权限配额](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/quotas.html)，以确保它们不会干扰 SaaS 解决方案的运行。特别是，我们建议您监控每个*区域每个账户的每秒IsAuthorized 请求*量配额，以确保不超过其限制。您可以申请增加此配额。