标签: abac

用于资源列表的微服务架构中的基于属性的访问控制 (ABAC)

我正在研究构建一个系统的选项,以在基于微服务的架构中提供“实体访问控制”,以根据请求用户限制对某些数据的访问。已经实施了完整的基于角色的访问控制 (RBAC) 系统来限制某些操作(基于 API 端点),但是没有实施任何措施来限制针对一个数据实体的这些操作而不是另一个数据实体。因此需要基于属性的访问控制 (ABAC) 系统。

考虑到系统要求适合用途以及我自己的优先事项,以遵循安全逻辑实现的最佳实践以保持在一个位置,我设计创建了一个外部化的“实体访问控制”API。

我设计的最终结果类似于我看到的下图(我认为来自 axiomatics.com)

EAC API 实现概念

问题在于,当您开始谈论以结果列表作为响应的 API 的那一刻,整个事情就失败了。

例如。客户 API 上的 /api/customers 端点,它接受查询过滤器、排序、顺序和限制/偏移值等参数以促进分页,并将客户列表返回到前端。那么,您如何在微服务环境中为每个实体提供 ABAC?

到目前为止测试的上述问题的可怕解决方案:

  • 获取第一页结果,将所有结果发送到 EAC API,获取响应,删除响应中被拒绝的结果,从数据库中获取更多客户,检查这些......并重复,直到获得页面结果或数据库中的客户用完。测试了 14,000 条记录(在我的情况下绝对在合理范围内)需要 30 秒才能为具有零权限查看任何客户的人获得 API 响应。
  • 对于所有客户端点的每个请求,都会向原始请求用户可用的每个客户的 EAC API 发送一个请求。经测试,对于 14,000 条记录,对于有权查看所有客户的人来说,响应负载将超过半兆字节。我可以将其拆分为多个请求,但是您只是在平衡有效负载大小与请求垃圾邮件,而性能损失不会去任何地方。
  • 放弃在列表中查看多条记录的能力。这完全打破了 API 用于客户需求。
  • 在每个 API 中存储执行 ABAC 控制所需的所有数据和逻辑。这充满危险,考虑到我在其中工作的领域,基本上保证会以超出我的风险偏好的方式失败。

注意:我测试了 14,000 条记录,因为它是我们当前数据状态的基准。一个 API 可以服务 100,000 或 1m 条记录是完全可行的,因此任何涉及迭代整个数据集或通过网络传输整个数据集的事情都是完全不可持续的。

那么,问题就在这里......你如何在微服务架构中实现一个外部化的 ABAC 系统(如图所示),同时还能够通过查询过滤器、排序、排序和限制来处理响应多个实体的请求/offset 值以方便分页。

microservices abac

19
推荐指数
1
解决办法
2533
查看次数

Spring Security和ABAC(基于属性的访问控制)

我们有一个中等规模的商业应用程序,我们大量使用Spring Security角色和权限(RBAC)来为某些实例打开和关闭角色以及隐藏在@PreAuthorize标记内的SpEL中的规则.

我认为我们实际实施了什么(不知道它是ABAC).XACML看起来非常复杂和臃肿,所以我不喜欢这里的答案:

如何通过上下文更改Spring Security角色?

有没有人在没有XACML的情况下完成了轻量级的ABAC实施?我希望能够让我们分离关注点,因为域对象只是做@PreAuthorize(WRITE)等,我们的授权策略将与它分离.

从我读过的内容来看,ABAC的基本原理非常简单.您有一个Action(非常像Permission)和一种机制来解决当前Principal是否具有给定Subject的权限.

我知道AccessDecisionVoter大致是正确的接口类型,但我不认为它是用于对权限进行投票.然而,实施我们的授权政策与这样的事件似乎非常有吸引力.

抱歉这个漫无边际的问题!基本上我对ABAC很感兴趣,但我想避免家酿,但担心当我们需要Cessna时XACML是一架大型喷气式飞机.

spring-security rbac xacml abac

11
推荐指数
2
解决办法
7159
查看次数

使用开放策略代理 (OPA) 作为 ABAC 系统

我有一个项目需要 ABAC 对我的项目资源进行访问控制。我一直在研究 OPA 和 authzforce 作为实现 ABAC 的选项,而 OPA 看起来可能没有 authzforce 复杂。我看到 OPA 将自己与其他系统和范式进行了比较,但它为 ABAC 提供的示例还有很多不足之处。主要是因为 ABAC 需要使用点来执行策略、围绕策略做出决策、为策略决策获取主体和客体属性。我觉得 OPA 拥有除最后一部分之外的所有内容,但很难判断这是否属实,因为他们的 ABAC 示例只是一次性的。

我一直在互联网上寻找 OPA 用作 ABAC 实现的示例,但我什么也没找到。

我的项目是一个 Web 应用程序,它允许最终用户创建资源并为其资源创建策略。我计划为最终用户创建一个 UI 来创建他们的策略。我的计划是抽象掉它的编码方面,而是为它们提供下拉菜单和按钮,这个 UI 将在幕后使用自定义语法,我将其解释为 OPA 策略。

我遇到的主要问题是如何将其作为 ABAC 来实现,它是否像构建将获取主题、对象和环境的属性并在它和 OPA 之间创建胶水的部分一样直接(本质上是创建一个 PIP ) 因为 OPA 本身似乎是事实上的 PEP 和 PDP?

我觉得我被文档淹没了,而且 OPA 自己的文档中似乎缺少很多来解释如何做到这一点。

authorization xacml alfa abac open-policy-agent

10
推荐指数
2
解决办法
4315
查看次数

RBAC/ABAC通过XACML策略

我正在研究各种类型的访问控制模型,并且知道是受欢迎的模型.

对于我的一个项目,我有一个基本的场景,我无法理解我应该选择RBAC还是ABAC.显然RBACABAC我应该去的子集,ABAC但是ABAC需要一些经验才能在编写策略.我们正在使用WSOIS和APIM.

我的身份服务器(IS)中有管理员,所有者和成员角色.

  • 管理员可以查看,删除和更新用户.
  • 所有者可以查看和更新​​.
  • 会员只能查看.

在某个时刻,我使用HTTP动词来实现愿望结果,即所有者无法访问DELETE请求,成员无法访问PUT&DELETE.

问题

我有一个仪表板,我在其中显示不同的部分,如最高用户,计费,服务,顶级消费者等.

  1. 我需要nav-bar根据服务器的用户角色和属性进行填充,例如,成员不应该有权访问其他用户(添加,列表)nav-bar.nav-bar项目依赖于用户角色,以便我们可以通过RBAC
  2. 我们已经计划增加与OPS一样,营销的作用,支持等等.这是否意味着我们需要创建一个单独的DB-模式,以保持每个角色的访问权限?
  3. 在仪表板中,我需要隐藏/显示用户,服务等中的视图,更新和删除按钮.现在,成员可以看到用户但无权更新或删除它们.无法查看统计信息,结算和其他私人信息.
  4. 所有者可以查看与其部门/组织相关的所有用户,但管理员可以查看所有部门/组织的所有用户.在这里,我们需要为所有消费者使用相同的API,但api对不同的角色应该有不同的响应.角色可以是10s和100s,因此ee不能为每个角色创建不同的api.

我们可以实现所有这些场景,RBAC但是为了管理nav-bar和查看相关的实现,我们需要在服务器中添加业务逻辑而不是使用WSO2-ISWSO2-APIM.有没有办法管理隐藏/显示按钮和部分等视图权限,甚至消费相同,API但它应该为不同的api消费者返回不同的结果.

authorization rbac xacml wso2is abac

8
推荐指数
2
解决办法
1021
查看次数

Web应用程序的细粒度授权

我有一个C#.net应用程序,它为公司的内部用户和外部客户提供服务.我需要做一些细粒度的授权,比如访问哪些资源.所以我需要基于资源或基于属性的东西,而不是基于角色的授权.

我想到的是:

  1. 为我的.net应用程序实现自己的授权机制和sql表
  2. 使用/实现标准机制,如已实施XACML的软件(例如Axiomatics)

第一种方法的问题在于它不是集中式的,也不是标准的,因此其他系统不能将其用于授权.

第二种方法的问题是它可能更慢(由于每个资源需要额外的调用).此外,我不确定市场上的应用程序如何支持像XACML这样的标准授权,以便于将来的集成.

那么,一般来说,对于应该为内部用户和外部客户提供服务的Web应用程序进行细粒度授权的良好实践是什么

authorization xacml abac

6
推荐指数
1
解决办法
2160
查看次数

如何存储权利?XACML的替代品

我希望存储权利的概念证明.我知道有不同的访问控制方式(DAC,MAC,RBAC,..).我的第一个想法是使用数据库,但我正在寻找一些像XACML这样的更成熟的标准,但遗憾的是我还没有找到一些真正的替代品.感谢任何tipps!

authorization access-control xacml abac

6
推荐指数
1
解决办法
2814
查看次数

角色/索赔访问控制系统的替代方案

我正在为不断发展的系统开发REST API.一般来说,角色/声明访问控制工作完全像这样.

[HttpGet]
[Route("settings")]
[Authorization(Type = AuthorizationType.Admin, Permission = Permission.StoreSettings)]
public IHttpActionResult GetSettings() { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

当我有用户可以更深入地控制访问时,就会出现问题,如下图所示.这是系统的抽象示例.

用户类型

如果我需要在其中一个区域查询某些内容,那很简单,但是当我需要从中获取所有内容时Items,Departments我必须编写相同的丑陋代码,我无法重复使用.不是真正的代码,但看起来像这样.

Db.Items.Where(i =>
    i.Stores.Any(s => s.CityId == User.CityId) &&
    Db.UserDepartmentRights.Any(udr => udr.UserId == User.UserId && i.DepartmentId == udr.DepartmentId));
Run Code Online (Sandbox Code Playgroud)

它显然是丑陋的,很难维护,特别是如果我需要为系统带来另一个级别.

是否有任何框架可以处理这个或我可以实现的正式架构?

asp.net authorization access-control entity-framework-6 abac

6
推荐指数
1
解决办法
3766
查看次数

使用ABAC/XACML,您如何保护报告/大型结果集中的资源?

人们如何在运行报告时使用方法,甚至只是从数据库中选择多个记录?

例如,如果您有一个政策规定:

医生只能在医院看病人

显然,实现它的有效方法是在查询(where hospital = XXX)中包含一个过滤器,但这似乎与ABAC的主体打破,因为它将规则引入SQL本身.

我知道公理化提供,显然基于rules--为你过滤器反向查询机制,但我的系统有很多复杂的SQL,将不得不重构相当多与此有关的工作.

其他人如何处理这个问题?

authorization access-control xacml alfa abac

6
推荐指数
1
解决办法
557
查看次数

从头开始在 nodejs/react 中实现 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 …

mysql rest node.js express abac

6
推荐指数
1
解决办法
1012
查看次数

访问控制设计模式

我正在开发PHP应用程序,我想为某些对象添加访问控制。我没有将此问题标记为PHP,因为我认为该问题不是特定于语言的。

说我有一个“服务等级”

abstract class Service {


}
Run Code Online (Sandbox Code Playgroud)

许多服务都将此作为基类。一个伪示例为:

class Companies extends Service {

  function getCompanyInfo($id) {
      //...
  }

}
Run Code Online (Sandbox Code Playgroud)

稍后,我要添加访问控制。示例的“ getCompanyInfoById”方法是“读取”操作,因此这将需要“读取”权限。

此时,我可以通过以下方式实现此目的:

  1. 将accesscontrol添加到Service类。在完成操作并返回结果之前,每个方法(例如getCompanyInfoById)都必须在内部调用“ hasPrivilege”方法。
  2. 将所有Service对象包装在某种Proxy对象中,该对象将在调用内部对象中的方法之前检查特权。
  3. 完全独立的访问控制,并在调用方法之前强制“调用方”检查特权。

每个选项的缺点:

  1. 这要求更改所有服务,并要求他们了解访问控制。我认为这与关注点分离背道而驰。
  2. 这会破坏OOP功能,例如多态。呼叫者不再知道任何服务支持什么接口。
  3. 这是最灵活的方法,但是最大的缺点是检查权限现在是隐式的。开发人员可以“忘记”或复杂的代码路径可能导致未经授权的服务被调用。

是否有更好的方法可以完全解决此问题?

authorization design-patterns access-control rbac abac

5
推荐指数
1
解决办法
2869
查看次数