8

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

假设您有以下实体:

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

现在应该表达以下规则:具有角色工作者的用户只被允许查看与他分配到的项目相关的任务。

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

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

当然,在查看特定项目时可能会有特定WHERE project_id = 123查询(每一个条目。

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

4

2 回答 2

6

您需要超越 ACL 和 RBAC 并考虑基于属性的访问控制(ABAC - 请参阅此处的 NIST 指南)。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'”

高温高压

于 2013-09-30T16:44:35.633 回答
1

好吧,我使用带有漂亮 RBAC 层的Yii 框架。我最近对 ​​ACL 不太熟悉,也不需要熟悉。

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

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

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

于 2012-11-27T11:09:09.587 回答