ABAC 与 Monorepo 微服务:最好的方法是什么?

Rua*_*fer 1 authorization microservices abac monorepo

在我的工作中,我的任务是搜索并找到解决方案,以在 monorepo 中组织的微服务中实施 ABAC 授权。我们有一些产品,我们使用领域的概念在同一数据库中组织不同客户端的数据。我们的要求可能是:

  • 用户(即其公司的经理)只能看到来自您公司和您员工的数据。
  • 同一个公司可以有N个地方,每个地方可以有一个经理。每个地方的管理者只能看到那里的数据。

首先,我想构建一些代码,供每个 API 的每个路由器使用,以验证授权并允许或拒绝请求。像这样的东西: 在此输入图像描述

我想到的另一件事是创建一个 API 而不是 lib。 在此输入图像描述

因此,基于这个问题,我发现 ABAC 可以从应用程序(API)中外部化,并且对我来说很有意义,请参见下图。

在此输入图像描述

但接下来我有一些问题。

  1. 按照我在第一张图片或第二张图片中的想法去做是不好的吗?

  2. PDP 如何知道用户想要做什么?根据他呼叫的路线?但通过这种方法,单一责任将会受到损害,因为 PDP 需要内化(步骤 2)其他应用程序的行为,对吧?

  3. PIP需要调用数据库来让PDP验证授权。因此,这可能会很慢,因为相同的查询将执行两次,一次用于检查策略,另一次在服务内部使用业务逻辑。

Or *_*eis 5

    \n
  1. 实现此目的的现代方法是解耦您的策略和代码 - 即拥有一个单独的授权微服务 -这是我在 OWASP DevSlop 上关于它的演讲中的一部分。\n您希望中间件中的代码尽可能简单 - 基本上只是查询授权微服务。该服务基本上成为您的 PDP(用 XACML 术语)。\xe2\x80\x82 对于单体应用和微服务来说都是如此(假设无论如何你最终都会在单体应用旁边拥有更多的微服务)。\xe2\x80 \x82
    \n要实现授权微服务/PDP,您可以使用 OPA (OpenPolicyAgent.org) 之类的东西,然后使用OPAL作为 PAP 和 PIP 管理器。(全面披露我是 OPA 和 OPAL 的贡献者)

    \n
  2. \n
  3. 对 PDP 的查询应包括用户正在做什么(但不包括规则是什么)。您可以基于路由(在执行服务网格时常见)来执行此操作,但通常最好定义一个资源/操作布局,该布局成为查询的一部分并且直接独立于应用程序路由。看一下Permit.io策略编辑器,它正是执行这种映射的。(Permit 在内部也使用了 OPA 和 OPAL;完全披露我是 Permit.io 的创始人之一)

    \n
  4. \n
  5. 非常好的一点。您不希望您的 PDP 在每次传入查询时不断查询其他源(尽管如果您针对一些边缘情况这样做也没关系) - 您想要的是以异步方式在后台逐渐加载数据。理想情况下采用事件驱动方式(即事件从数据源实时传播到 PDP)。这正是您可以使用OPAL做的事情。

    \n
  6. \n
\n