从头开始在 nodejs/react 中实现 ABAC

zer*_*ero 6 mysql rest node.js express abac

我有一个需要在其中实施 ABAC 的项目。我一直在互联网上搜索有关 ABAC 如何从 Nodejs 的角度具体工作的信息。我了解 ABAC 的基本概念,但不知道如何成功实施它。我已经阅读了有关该主题的白皮书,并试图检查一些声称已实施 ABAC 但似乎并不完整或清晰的项目。

首先我想从高层次描述我的项目,然后我计划如何在我的项目中实施 ABAC。我希望有人可以就这个主题给我指导,以及我想要实施 ABAC 的方式是好是坏,或者我遗漏了一些东西并且需要一些工作。

我的技术栈:

以下是我的堆栈中最重要的技术部分

  1. 反应
  2. 节点
  3. 表达
  4. MySQL
  5. JSON 网络令牌

我的项目:

它是一个电子商务平台,允许用户创建某些资源,这些资源可以出售和/或与系统中的其他用户共享。当这些资源被共享或被出售时,ABAC 就会“介入”。该项目将有一个界面,允许其最终用户为其资源创建 ABAC 策略。这些策略将影响其他用户和用户所在的组织。可能有 1000 多个用户和 100 多个 1000 资源。

我可能的 ABAC 实现:

所以我想做的第一件事是重组我的数据库,以便每个对象和主题(在这种情况下,将是用户及其资源)将有一个只用于其属性的表和一个查找表,用于跟踪哪个对象/主题具有哪些属性键/值对。例如:如果有一个users表,那么将有一个包含用户属性键的表和一个查找表,用于跟踪哪个用户分配给他们的属性键和该键的值。例子:

| userId | attr_key   | attr_val |
|--------|------------|----------|
| 1      | department | sales    |
Run Code Online (Sandbox Code Playgroud)

我的项目将有一个用户界面供最终用户为其资源创建策略。UI 将允许用户根据 4 个主要的 ABAC 原则创建策略:主体、客体、动作和环境(在这种情况下,“环境”将是时间)。在 UI 中,这些原则中的每一个都有一个按钮,用户可以向其添加属性和逻辑运算符。用户完成策略创建后,UI 将以特定方式将其保存到 MySQL 数据库中,以便在需要执行时查询。

鉴于我上面写的内容,我看到 ABAC 在我的项目中以这种方式工作:

  1. 创建一个允许或拒绝用户访问资源的策略(我将创建一个可以存储在数据库中的策略语法,以后可以检索以进行解释和计算)
  2. 当用户尝试在特定 RESTFUL 路由上对资源执行操作(假设他们想要查看/获取)时,我将创建的 PEP 将拦截 RESTFUL 请求并提取请求中发送的所有数据,然后 PEP 将使用从请求中提取的数据向 PDP 发送请求,以询问连接到用户和请求资源的策略。
  3. PDP 将拉取该资源的策略以及与该策略相关的所有属性(这将是对 PIP 的主题、客体和环境的请求),然后它会组合该策略。
  4. 将根据请求数据、当前属性和用于计算属性的值计算组合策略,并生成布尔决策。
  5. 布尔决定将用于返回请求的资源或将拒绝的原因返回到发起请求的路由。

那么首先,上述方式可行吗?第二,实用吗?最后,ABAC 范式在我计划的实施中是否缺少任何内容或有关如何改进它的任何建议?

小智 0

首先,您要解决的问题很复杂,需要不断更新,并且可能会在将来给您带来麻烦。在数据库上不使用任何策略引擎来解释策略会浪费您的时间,并可能迫使您维护它。根据技术堆栈来回答,OPA Rest API https://www.openpolicyagent.org/docs/latest/rest-api/将帮助您管理和执行您的策略。

OPA RBAC 策略示例

package app.abac

default allow = false

allow {
   user_is_owner
}

allow {
   user_is_in_sales_department
   user_is_senior
}

user_is_owner {
   input.user.id == input.resource.owner_id
}

user_is_in_sales_department {
   input.user.attributes.department == "sales"
}

user_is_senior {
   input.user.attributes.tenure > 8
}
Run Code Online (Sandbox Code Playgroud)

如上例,可以用opa来比较用户属性和资源属性。

这将返回一个关于用户是否应该执行此事件的结果。

关于如何实现它有多种选项,您可以通过此链接访问它https://www.openpolicyagent.org/docs/latest/integration/

我通常在项目中使用golang。我认为将策略管理纳入我的核心业务逻辑中是不合理的,因此我使用 OPA 的 go 库创建了一个不同的服务来自己管理策略。