基于 Spring Security 框架特别是其 acl 模块实现安全解决方案。
应用程序中有数百万个域对象和数百个用户。
使用 Spring Security Acl 模块,acl_sid 和其他相关表中的条目会增长到数十亿,这会影响应用程序的性能。
想知道处理这种情况的最佳实践。
是否有任何可用的替代安全框架可以有效地处理类似情况。
1 回答
有几个框架可以使访问控制更易于管理。
首先,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 可以更好地扩展。