【SaaS架构】多租户SaaS授权和API访问控制--实施注意事项
视频号
微信公众号
知识星球
DevOps、监控和日志记录
在这个建议的授权范式中,策略集中在授权服务中。这种集中是故意的,因为本指南中讨论的设计模型的目标之一是实现策略解耦,或从应用程序中的其他组件中删除授权逻辑。开放策略代理(OPA)提供了一种在需要更改授权逻辑时更新策略的机制。此功能由一个简单的REST API提供,您可以将其配置为从已建立的位置拉取新版本的策略(或捆绑包)或按需推送策略。我们建议您创建一个健壮的CI/CD管道,以增强OPA用于进行授权决策的版本控制、验证和更新策略的控制平面。此外,OPA提供了一种基本的发现服务,在该服务中,可以动态配置新的代理,并由分发发现捆绑包的控制平面集中管理。此功能可以减轻管理分布式策略决策点(PDP)的管理负担。
控制平面也为监控和审计提供了额外的好处。您可以通过控制平面监视OPA状态。也许更重要的是,包含OPA授权决策的日志可以导出到远程HTTP服务器以进行日志聚合。这些决策日志对于审计目的非常有用。如果您正在考虑采用访问控制决策与应用程序分离的授权模型,请确保您的授权服务具有有效的监控、日志记录和CI/CD管理功能,以启用新的PDP或更新策略。
检索PDP的外部数据
PDP可能需要额外的数据来做出超出作为输入提供的授权决策。例如,您可能将特定于用户或租户的属性存储在数据库中,PDP必须引用这些属性才能做出授权决策。对于OPA,如果授权决策所需的所有数据都可以作为输入或作为作为查询组件传递的JSON Web令牌(JWT)的一部分提供,则不需要额外配置。(将JWT和SaaS上下文数据作为查询输入的一部分传递给OPA相对简单。)OPA可以通过所谓的重载输入方法接受任意JSON输入。如果PDP需要的数据超出了可以作为输入或JWT令牌的范围,OPA提供了几种检索这些数据的选项。其中包括绑定、推送数据(复制)和动态数据检索。
捆绑
OPA绑定功能支持以下外部数据检索过程:
- 策略执行点(PEP)请求授权决策。
- OPA下载新的政策包,包括外部数据。
- 绑定服务从数据源复制数据。
当您使用捆绑功能时,OPA会定期从集中捆绑服务下载策略和数据捆绑包。(捆绑服务的实现和设置不是OPA提供的。)从捆绑服务中提取的所有策略和外部数据都存储在内存中。如果外部数据大小太大,无法存储在内存中,或者数据更改太频繁,则此选项将不起作用。
有关捆绑功能的更多信息,请参阅OPA文档。
复制(推送数据)
OPA复制方法支持以下外部数据检索过程:
- 策略执行点(PEP)请求授权决策。
- 数据复制器将数据推送到OPA。
- 数据复制器从数据源复制数据。
在捆绑方法的另一种选择中,数据被推送到OPA,而不是被OPA周期性地拉取。(OPA不提供复制器的实现和设置。)推送方法与捆绑方法具有相同的数据大小限制,因为OPA将所有数据存储在内存中。推送选项的主要优点是,您可以使用增量更新OPA中的数据,而不是每次替换所有外部数据。这使得推送选项更适合频繁变化的数据集。
有关复制选项的更多信息,请参阅OPA文档。
动态数据检索
如果要检索的外部数据太大,无法缓存在OPA的内存中,则可以在评估授权决策期间从外部源动态提取数据。使用此方法时,数据始终是最新的。这种方法有两个缺点:网络延迟和可访问性。目前,OPA只能通过HTTP请求在运行时检索数据。如果到外部数据源的调用不能以HTTP响应的形式返回数据,则需要自定义API或其他机制来将这些数据提供给OPA。由于OPA只能通过HTTP请求检索数据,检索数据的速度至关重要,因此我们建议您尽可能使用Amazon ElastiCache或Amazon DynamoDB等AWS服务保存外部数据。
有关拉动方法的更多信息,请参阅OPA文档。
使用授权服务实现
当您使用绑定、复制或动态拉取方法获取外部数据时,我们建议授权服务促进这种交互。这是因为授权服务可以检索外部数据并将其转换为JSON,以便OPA做出授权决策。下图显示了授权服务如何使用这三种外部数据检索方法。
Retrieving external data for OPA flow – bundle or dynamic data retrieval at decision time:
OPA调用授权服务本地API端点 此端点被配置为在授权决策期间充当捆绑包端点或动态数据检索的端点。 |
|
授权服务查询或调用外部数据源以检索数据。 (对于捆绑包端点,此数据还应包含OPA策略和规则。捆绑包更新将替换OPA缓存中的所有数据和策略。) |
|
授权服务对返回的数据执行任何必要的转换,以将其转换为预期的JSON输入。 |
|
数据返回OPA。它被缓存在内存中用于捆绑包配置,并立即用于动态授权决策。 |
Retrieving external data for OPA flow – replicator:
复制器(授权服务的一部分)调用外部数据源并检索OPA中要更新的任何数据。 这可以包括策略、规则和外部数据。此调用可以以设置的节奏进行,也可以响应外部源中的数据更新而进行。 |
|
授权服务对返回的数据执行任何必要的转换,以将其转换为预期的JSON输入。 |
|
授权服务调用OPA并将数据缓存在内存中。授权服务可以选择性地更新数据、策略和规则。 |
RBAC租户隔离和外部数据隐私建议
上一节提供了将外部数据导入OPA以帮助做出授权决策的几种方法。在可能的情况下,我们建议您使用重载输入方法将SaaS上下文数据传递给OPA,以做出授权决策。然而,在基于角色的访问控制(RBAC)或RBAC和基于属性访问控制(ABAC)混合模型中,这些数据通常不够,因为必须引用角色和权限才能做出授权决策。为了维护租户隔离和角色映射的隐私,这些数据不应驻留在OPA中。RBAC数据应驻留在外部数据源中,例如数据库。此外,OPA不应用于将预定义角色映射到特定权限,因为这使得租户难以定义自己的角色和权限。它还使您的授权逻辑僵化,需要不断更新。
维护RBAC数据隐私和租户隔离的一些安全方法是使用动态数据检索或复制器方法获取OPA的外部数据。这是因为前一图中所示的授权服务可用于仅提供租户特定或用户特定的外部数据,以进行授权决策。例如,当用户登录时,可以使用复制器向OPA缓存提供RBAC数据或权限矩阵,并根据输入数据中提供的用户引用数据。您可以对动态提取的数据使用类似的方法,以便仅检索相关数据以进行授权决策。此外,在动态数据检索方法中,这些数据不必缓存在OPA中。绑定方法在维护租户隔离方面不如动态检索方法有效,因为它更新OPA缓存中的所有内容,无法处理精确的更新。捆绑模型仍然是更新OPA策略和非RBAC数据的好方法。
- 37 次浏览