【问题标题】:Complex Righty System: ACL, RBAC and more what?复杂的 Righty 系统:ACL、RBAC 等等什么?
【发布时间】:2012-11-27 09:10:17
【问题描述】:

我们目前正在开发一个项目管理软件。而且我们在决定实施安全性的正确方法时遇到了麻烦。我们已经查看了 ACL 和 RBAC,并且已经非常确定出于特定原因我们至少需要两者的组合。但是有几个问题在这两个世界中都没有很好的解决方案。让我解释一下:

假设您有以下实体:

  1. 用户,具有不同的角色,即
    • 项目负责人
    • 工人
    • 管理员
  2. 项目
  3. 分配的用户
  4. 项目中的任务

现在应该表达以下规则: 具有Worker 角色的用户 只能查看与他分配到的项目相关的任务

这导致用户只被允许查看整个列表中的一些任务

我们将使用 RBAC 授予角色实际读取任务的权限。但由于涉及特定实体,因此不适用该条件。可以使用 ACL,但我们担心保持 ACL 条目与要求一致(用户可以改变,角色可以改变,新的任务 可以引入一个必须得到正确的条目,这同样复杂)。

当然,在查看特定项目 (WHERE project_id = 123) 时可能会有特定的查询,但这对于“查看我当前的所有任务”没有帮助,基本上每个任务都可以考虑显示,但必须检查每个条目的 ACL。

以及如何确保“获取当前用户允许查看的前 25 个任务”之类的内容,而不从数据库中加载所有任务,然后根据 ACL 进行过滤,即处理分页。

【问题讨论】:

    标签: php security zend-framework2 acl rbac


    【解决方案1】:

    您需要超越 ACL 和 RBAC 并考虑基于属性的访问控制(ABAC - 请参阅 NIST 的指南 here)。 Gartner 将此空间称为“外部授权管理”。

    使用 ABAC,您可以轻松表达任何规则,不仅要考虑用户是谁,还要考虑用户想要做什么、在哪里、何时、为什么以及如何做。使用属性来定义授权,您可以使用 XACML 来实施策略。 XACML 是 OASIS 标准(就像 SAML)。

    使用 XACML,您可以获得一个 API,您可以在其中提出问题,例如:Alice 可以查看此记录吗? 但在您的情况下,这还不够,因为您想从数据库中过滤掉记录。而且,正如您所描述的,您希望查询从一开始就是正确的,而不是在获得正确数量的授权记录之前来回访问数据库。这就是 XACML 变得特别有趣的地方,因为它是技术中立的。您可以将 XACML 应用于 Java、C# 和其他语言,例如Python 也将 XACML 应用于不同的层(表示、API 和...数据库)。可以通过反向查询方式查询 XACML 以生成 SQL 语句,然后您可以使用该语句在后端数据库中查询相关记录:

    • Alice 可以查看哪些记录?
    • Alice 可以查看加利福尼亚州产生“SELECT * FROM records WHERE location='CA'”的记录

    HTH

    【讨论】:

      【解决方案2】:

      嗯,我使用 Yii framework 和它的漂亮 RBAC 层。我对 ACL 不太熟悉,最近也不需要。

      在 Yii RBAC 术语中,解决方案的关键是使用“业务规则”。 Bizrules 是附加到“权限”或“角色”(Yii 术语中的“授权项”)的小代码 sn-ps。当需要确定对某个“权限”的访问时,此代码会动态运行(比如说,但它也可以附加到“角色”),并且它会收到“有问题的项目”(您的示例中的任务)和确定对特定任务的实际访问权与否。 这是一个更详细的示例:

      • 说你需要有以下权限:
        • 编辑任务(应允许具有“任务管理员”角色的任何人)
        • 编辑自己的任务(应该允许提交任务的人)。
      • 现在,在“任务编辑”代码部分,您将首先检查“编辑任务”权限。如果可以 - 允许。
      • 如果不允许,还要检查“编辑自己的任务”(使用 else-if 结构)。现在在最后提到的权限上应该附加一个 bizrule(=php 代码),它接受一个“任务”对象并将其“创建者 ID”与“当前检查的用户 ID”进行比较。如果相等,则返回 true,表示应授予访问权限。

      简而言之。如果您对更多内容感兴趣,请参阅官方指南的this section。如果您需要,还有很多其他资源。

      【讨论】:

      • 感谢您的回答。据我了解,这些业务规则就是我所说的“在应用程序代码中过滤”,这并不能解决我的问题。我会进行查询以检索任务 (25),然后可能某些结果会被业务规则过滤掉。然后我需要再次调用数据库并再次过滤,直到我可以返回 25 个结果。在我看来,这不是很好。在我看来,我希望将业务规则应用于 SQL 查询并立即检索 25 个结果。
      • 这个问题是用 PHP 标记的。如果决定的话,您能否阐明您正在构建的框架/库(如果有的话)?它可以使讨论更加富有成果...... .
      • 我们将使用 ZF2。 ZF2/ACL 和 ZfcRbac 作为模块。但我猜 PHP 可能是错误的标签?
      • 首先,我认为使用 PHP 进行标记很好,尤其是在您制定了技术决策之后。我当然也会添加 ZF 或 ZF2 标签,因为有两种方法可以解决这个问题 - 第一种是从理论方面,第二种是从技术方面。很有可能 ZF 社区中的某个人已经解决了类似的用例,并且可以用骨架设计作为解决方案(无需深入了解理论背景)。
      • 至于你的问题,我部分地从袖子里抽出来:(1)我上面描述的设置中的业务规则可以被认为是“运行时动态过滤”(在代码中,是的) . (2)(这是我从袖子里抽出来的地方)如果你设置一个将 UID 链接到任务 ID 的“连接表”,那么我可以在 SQL 级别,也许结合一些代码来制作这个 SQL,来实现所需的逻辑,这意味着您上面详述的“分配的用户”实体将表示为“关系”,并且将在运行时检查该关系。
      猜你喜欢
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 2011-03-01
      • 2020-06-21
      • 2018-01-13
      • 1970-01-01
      • 2018-01-07
      • 2019-09-15
      相关资源
      最近更新 更多