9

基于 Spring Security 框架特别是其 acl 模块实现安全解决方案。
应用程序中有数百万个域对象和数百个用户。

使用 Spring Security Acl 模块,acl_sid 和其他相关表中的条目会增长到数十亿,这会影响应用程序的性能。

想知道处理这种情况的最佳实践。

是否有任何可用的替代安全框架可以有效地处理类似情况。

4

1 回答 1

20

有几个框架可以使访问控制更易于管理。

首先,ACL 非常棒且易于配置,但无法很好地扩展。

选项 #1:基于角色的访问控制 (RBAC)

RBAC 是 NIST 在 1992 年定义的著名模型。许多应用程序和框架都实现了 RBAC 模型。在 RBAC 中,您给用户一组角色,每个角色都有一组权限。因此,用户继承了这些权限。例如,您可以拥有一个有权查看所有交易的经理角色。

Spring Security、Apache Shiro、JAAS 和许多其他框架(开源、商业......)实现了 RBAC。

选项 #2:基于属性的访问控制 (ABAC)

有时 RBAC 是不够的。特别是当您想使用上下文或关系时。例如,在 RBAC 中,很难实现可以处理以下内容的角色和权限:

经理可以查看自己部门的交易

为此,您将使用 ABAC。您将定义一个角色属性、一个用户部门属性和一个事务部门属性。然后,您可以将这些属性组合在一个策略中:

如果 user.department==transaction.department,则角色==manager 的用户可以执行 action=='view transaction'

XACML - ABAC 的实现

XACML 是可扩展访问控制标记语言,是 OASIS 定义的标准,越来越多地用于实现复杂的授权挑战。今天有几个实现:

  • 开源
    • SunXACML
    • WSO2
  • 商业的

RBAC和ABAC如何减轻管理负担?

在访问控制列表中,每个要保护的项目都有一个列表,并且必须在这些列表中插入用户身份。您可能还想添加操作数据,以便最终得到:

  • 项目 #1 ACL
    • 爱丽丝,读
    • 爱丽丝,写
    • 鲍勃,读
    • 卡罗尔,读
  • 项目 #2
    • ...

如果您有 100 万个项目和 10,000 个用户,那么您可能有 100 万 x 10k x 3 次操作(读取、写入、删除)= 总计 300 亿行。这相当于一场管理噩梦,但也可能是一个绩效问题。

现在 RBAC 的想法是简化一点。我们不是将用户分配给 ACL 中的项目,而是使用角色和权限作为间接级别。所以爱丽丝将成为一名编辑。Bob 和 Carol 将成为观众。您的 ACL 现在更简单了:

  • 项目 #1
    • 编辑,阅读
    • 编辑,编辑
    • 观看者,阅读

名单越来越小。然而,RBAC 仍然存在一些问题。每个对象仍然必须有一个 ACL。如果你有一百万个对象,你仍然会有几百万行(尽管仍然好于 300 亿)。

使用 ABAC,您可以选择使用对象属性,例如部门或分类。对象不再具有 ACL,您最终会编写使用这些属性的策略。这使得策略的数量更小(通常为数百个)。

由于属性,ABAC 可以更好地扩展。

于 2015-11-25T23:42:47.563 回答