复杂的Righty系统:ACL,RBAC还有什么?

时间:2012-11-27 09:10:18

标签: php security zend-framework2 acl rbac

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

假设您有以下实体:

  1. 用户,具有不同的角色,即
    • 项目负责人
    • 工人
    • 管理
  2. 项目
  3. 指定用户
  4. 项目中的任务
  5. 现在应该表达以下规则: 具有角色工作人员用户仅允许查看与其分配到的项目相关的任务

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

    我们会使用RBAC为角色提供实际阅读任务的权限。但由于涉及特定实体,因此不适用该条件。可以使用ACL,但我们担心保持ACL条目符合要求的噩梦(用户可以更改,角色可以更改,新任务可以介绍一个必须得到正确的条目,这同样复杂)。

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

    我如何确保诸如“获取当前用户可以看到的前25个任务”之类的内容,而无需从数据库加载所有任务,然后根据ACL进行过滤,即处理分页。

2 个答案:

答案 0 :(得分:2)

您需要超越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

答案 1 :(得分:1)

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

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

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

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

相关问题