您将/曾经使用什么数据结构在混合 ACL/RBAC 系统中存储 ACL?

信息安全 访问控制 授权 rbac nosql
2021-08-22 14:34:15

在我们的系统中,每个资源都有一个访问控制列表 (ACL),其中列出了对该资源具有特定类型访问权限的条目 (ACE)。ACE 可以用于终端实体(例如:像“Mr Q”这样的用户)或组实体(例如:“北大西洋”);包含组实体使其成为混合 ACL/RBAC 系统。

ACL 数据

Resource #1 => ACL
ACL => ACE#1 Entity(Type:User, ID:006), Rights(~Read, ~Write)) /* Deny */
       ACE#2 Entity(Type:User, ID:007), Rights(Read, Write))
       ACE#3 Entity(Type:User, ID:101), Rights(Write))
       ACE#4 Entity(Type:Group, ID:A01), Rights(Read, Write))
       ACE#5 Entity(Type:Group, ID:B04), Rights(Read, Write))

任何未出现在 ACL 上的内容都将被拒绝,并且 DENY 会否决其他任何内容。

系统信息

有一个中央在线服务器调解对所述资源的访问。对 ACL 的写入很少见,主要是读取(可能以 1:50 或更高的比率)。

问题

存储上述 ACL 的合适数据结构是什么?将整个 ACL 作为单个 JSON 字符串存储在 NoSQL 存储中似乎很简单,但我们也可以规范化 ACL 数据并将其存储在 SQL 表中。如果有人对这两种方法的优缺点有操作经验,想听听他们的意见。我们还想知道是否值得探索将其存储在 LDAP 中,但希望远离 X.500/DER 和其他电信来源技术……也许有现代 LDAP 选项(植根于 CS 世界)可以探索 NoSQL/SQL 之外?

1个回答

构建 ACL 的最佳方式是使用位掩码,这样可以轻松快速地确定资源的复杂访问权限。

存储它的最佳方式可能是键值存储,例如 Redis 或任何与您的环境完美集成的对象缓存技术。使用 NoSQL 还是使用 SQL 的决定更多的是业务或 IT 决策,而不是技术决策,因为无论哪种方式,简单的查找都可能同样快。

当然,LDAP 也是一个很好的方法,但除非您将权限与其他系统集成,否则它没有多大意义。