ABAC 与 Monorepo 微服务:最好的方法是什么?
ABAC with Monorepo Microservices: What is the best approach?
在我的工作中,我的任务是搜索并找到解决方案,以在我们以 monorepo 组织的微服务中实施 ABAC 授权。我们有一些产品,我们使用领域的概念在同一个数据库中组织不同客户的数据。这里我们的要求大概是:
- 作为公司经理的用户只能查看您公司和您员工的数据。
- 同一个公司可以有N个地方,每个地方可以有一个经理。每个地方的经理只能从那里看到数据。
首先,我想构建一些代码,用于每个 API 的每个路由器,以验证授权并允许或拒绝请求。是这样的:
我想的另一件事是创建一个 API 而不是一个库。
因此,基于 this question,我发现 ABAC 可以从应用程序外部化(APIs),这对我来说很有意义,请参见下图。
但是我有一些问题。
按照我在第一张图片或第二张图片中的想法进行操作是不好的吗?
PDP 如何知道用户想要做什么?根据他打电话的路线?但是使用这种方法,单一责任将受到损害,因为 PDP 需要内部化(步骤 2)其他应用程序的功能,对吗?
PIP需要调用数据库进行PDP验证授权。所以这可能会很慢,因为相同的查询将执行 2 次,一次用于检查策略,另一次用于使用业务逻辑在服务内部。
实现此目的的现代方法是将您的策略和代码分离 - 即为授权提供单独的微服务 - here's a part in a talk I gave at OWASP DevSlop about it.
您希望中间件中的代码尽可能简单——基本上只是查询授权微服务。该服务基本上成为您的 PDP(在 XACML 术语中)。这对于单体和微服务都是如此(假设你最终会在你的单体旁边有更多的微服务)。
要实施授权微服务/PDP,您可以使用 OPA (OpenPolicyAgent.org) 之类的东西,然后使用 OPAL 作为 PAP 和 PIP 的管理器。 (完全公开我是 OPA 和 OPAL 的贡献者)
对 PDP 的查询应该包括用户正在做什么(而不是规则是什么)。您可以基于路由(通常在执行 service-mesh 时)执行此操作,但通常最好定义一个 resource/action 布局,它成为查询的一部分并直接独立于应用程序路由。看一下 Permit.io Policy-Editor 正是执行这种映射的。 (Permit 还在内部同时使用 OPA 和 OPAL;完全披露我是 Permit.io 的创始人之一)
说得很好。您不希望您的 PDP 在每个传入查询中不断查询其他来源(尽管如果您在一些边缘情况下这样做也没关系) - 您想要的是以异步方式在后台逐渐加载数据。理想情况下以 event-driven 方式(即让事件从数据源实时传播到 PDP)。这正是你可以用 OPAL.
做的
在我的工作中,我的任务是搜索并找到解决方案,以在我们以 monorepo 组织的微服务中实施 ABAC 授权。我们有一些产品,我们使用领域的概念在同一个数据库中组织不同客户的数据。这里我们的要求大概是:
- 作为公司经理的用户只能查看您公司和您员工的数据。
- 同一个公司可以有N个地方,每个地方可以有一个经理。每个地方的经理只能从那里看到数据。
首先,我想构建一些代码,用于每个 API 的每个路由器,以验证授权并允许或拒绝请求。是这样的:
我想的另一件事是创建一个 API 而不是一个库。
因此,基于 this question,我发现 ABAC 可以从应用程序外部化(APIs),这对我来说很有意义,请参见下图。
但是我有一些问题。
按照我在第一张图片或第二张图片中的想法进行操作是不好的吗?
PDP 如何知道用户想要做什么?根据他打电话的路线?但是使用这种方法,单一责任将受到损害,因为 PDP 需要内部化(步骤 2)其他应用程序的功能,对吗?
PIP需要调用数据库进行PDP验证授权。所以这可能会很慢,因为相同的查询将执行 2 次,一次用于检查策略,另一次用于使用业务逻辑在服务内部。
实现此目的的现代方法是将您的策略和代码分离 - 即为授权提供单独的微服务 - here's a part in a talk I gave at OWASP DevSlop about it. 您希望中间件中的代码尽可能简单——基本上只是查询授权微服务。该服务基本上成为您的 PDP(在 XACML 术语中)。这对于单体和微服务都是如此(假设你最终会在你的单体旁边有更多的微服务)。
要实施授权微服务/PDP,您可以使用 OPA (OpenPolicyAgent.org) 之类的东西,然后使用 OPAL 作为 PAP 和 PIP 的管理器。 (完全公开我是 OPA 和 OPAL 的贡献者)对 PDP 的查询应该包括用户正在做什么(而不是规则是什么)。您可以基于路由(通常在执行 service-mesh 时)执行此操作,但通常最好定义一个 resource/action 布局,它成为查询的一部分并直接独立于应用程序路由。看一下 Permit.io Policy-Editor 正是执行这种映射的。 (Permit 还在内部同时使用 OPA 和 OPAL;完全披露我是 Permit.io 的创始人之一)
说得很好。您不希望您的 PDP 在每个传入查询中不断查询其他来源(尽管如果您在一些边缘情况下这样做也没关系) - 您想要的是以异步方式在后台逐渐加载数据。理想情况下以 event-driven 方式(即让事件从数据源实时传播到 PDP)。这正是你可以用 OPAL.
做的