Spring安全性访问控制列表数十亿行

时间:2015-11-25 13:04:41

标签: performance spring-security authorization user-permissions spring-security-acl

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

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

想知道处理此类情况的最佳做法。

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

1 个答案:

答案 0 :(得分:8)

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

首先,ACL非常好且易于配置,但它们不能很好地扩展。

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

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

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

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

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

  

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

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

  

具有角色==经理的用户可以执行操作=='查看事务',如果   user.department == transaction.department

XACML - ABAC的实现

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

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

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

  • 项目#1 ACL
    • Alice,请阅读
    • Alice,写
    • Bob,请阅读
    • 卡罗尔,请阅读
  • 项目#2
    • ...

如果您有100万个项目和10,000个用户,则可能有100万x 10k x 3个动作(读取,写入,删除)=总计300亿行。这等同于管理噩梦,但也可能是性能问题。

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

  • 项目#1
    • 编辑,阅读
    • 编辑,编辑
    • 查看器,阅读

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

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

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