这是实施访问控制的好策略吗?

时间:2015-03-04 16:47:26

标签: acl crud rbac database-driven

我想实现一个数据库驱动的访问控制系统。我一直在阅读关于ACL,角色,RBAC等的内容,但似乎最常见的方案有一些主要缺点。例如,RBAC在实现细粒度访问控制时似乎很笨重(例如,允许某个角色只更新特定记录的特定列)。

如果我构建了这样的访问控制列表怎么办:

| role  | table | action | columns  | conditions        |
| ----- | ----- | ------ | -------- | ----------------- |
| user  | user  | view   | name, id | self.id = user.id |
| user  | user  | update | password | self.id = user.id |
| admin | user  | update | *        |                   |
| admin | user  | create | *        |                   |
| admin | user  | delete | *        |                   |

这个想法是,当用户尝试访问数据库时,将根据该表检查用户的角色(因此,在模型级别实现)。 action可以是{create, view, update, delete, list}中的任何一个。 self范围将是引用当前用户属性的保留关键字。例如,这将允许我们仅允许用户更新自己的密码(而不是其他人的密码)。

这很健壮吗?显然,我仍然需要一个单独的列表来控制对URI等其他类型资源的访问。

1 个答案:

答案 0 :(得分:4)

好问题。您正在达到ACL和RBAC的限制。另一种方法更灵活,称为基于属性的访问控制(ABAC)。

下图显示了访问控制随着时间的推移如何发展以迎合更复杂的方案(更多用户,更多数据,更多设备,更多上下文)。

Access control through the ages

更具体地说,您正在努力解决RBAC不支持关系的事实。然而,ABAC确实如此。 ABAC基于属性。属性只是一个键值对,例如 role == manager location == Arizona

ABAC使用带有属性的策略来表达授权方案。例如,在ABAC中,您可以表达以下情况:

  • 具有 role == doctor 的用户可以对 type == medical record 的资源执行 action == view 医生位置==患者位置

有一个名为XACML(可扩展访问控制标记语言)的标准,您可以使用它来实现ABAC。甚至有些产品专门为数据库和数据访问控制提供XACML,例如Axiomatics Data Access Filter

如果您想了解有关ABAC的更多信息,我建议您转向2个很棒的资源:

  1. NIST:基于属性的访问控制指南(ABAC)定义和注意事项(pdf
  2. Webinar在NIST文件上。