我在一个系统中遇到了许多不同的访问控制模型。在任何系统中实现访问控制模型时,我们通常通过为访问控制创建单独的表来硬编码数据库中的规则/权限(考虑到 RDBMS)。此外,这些规则/权限可以存储在 XML 数据库中。我想知道在 RDBMS 和 XML 数据库上存储规则有什么区别?另外,我们什么时候应该使用 XACML 在系统中实现访问控制模型?我的意思是,如何决定是应该硬编码数据库中的规则/权限还是应该使用 XACML 策略语言?
谢谢。
我在一个系统中遇到了许多不同的访问控制模型。在任何系统中实现访问控制模型时,我们通常通过为访问控制创建单独的表来硬编码数据库中的规则/权限(考虑到 RDBMS)。此外,这些规则/权限可以存储在 XML 数据库中。我想知道在 RDBMS 和 XML 数据库上存储规则有什么区别?另外,我们什么时候应该使用 XACML 在系统中实现访问控制模型?我的意思是,如何决定是应该硬编码数据库中的规则/权限还是应该使用 XACML 策略语言?
谢谢。
免责声明:我为 XACML 的供应商实现 Axiomatics 工作
如果您按照自己的方式存储授权逻辑,可以在 RDBMS 或 XML 数据库中完成。没关系。我怀疑 XML 是否会为您带来任何附加功能。
现在,如果您想要一个能够同时满足 RDBMS 系统和其他类型的应用程序(CRM、.NET、Java...)的授权系统,那么您想要使用一个与它所保护的应用程序类型无关的解决方案。这就是可扩展访问控制标记语言 XACML 的目标。
XACML 提供基于属性、基于策略的访问控制(ABAC 和 PBAC)。这使您能够编写极具表现力的授权策略并在单个存储库中集中管理它们。然后,中央授权引擎(称为策略决策点或 PDP)将为您的不同应用程序提供决策。
正如贝尔指出的那样,您需要的最小属性集通常是关于用户(主题)、资源和操作的属性。XACML 还允许您添加环境属性。这意味着您可以编写以下类型的策略:
医生可以查看分配给他们的患者的医疗记录。
XACML 的好处包括: - 将授权逻辑外部化的能力,正如 Bell 所提到的 - 无需经过开发/部署生命周期即可更新授权逻辑的能力 - 能够以相同的方式为许多不同的应用程序实现细粒度授权 -能够对授权逻辑进行可见性和审计
高温高压
两者并不相互排斥。
XACML 策略描述了如何将有关尝试的操作的一组属性转换为允许/拒绝的决定。属性至少是用户是谁(主题),他们想要做什么(动作)以及他们想要做什么(对象)。可以添加时间、请求来源和许多其他信息。
用户和对象的属性仍然必须存储在数据库中。如果您将用户或对象分组以简化管理或简化访问控制规则的定义,那么您将不得不管理数据库中的所有内容。然后需要将所有这些数据传递到 XACML 策略决策点以返回允许/拒绝决策。
使用 XACML 定义这些规则,而不是为数据库中定义的规则编写自己的决策逻辑的优点是可以将规则的评估交给外部应用程序。使用成熟的、经过测试的 XACML 实现(有开源选项)将避免您在将检查构建到自己的代码中时犯任何错误。
我认为在代码中硬编码策略是一种非常糟糕的做法。在这种情况下,您将资源的业务逻辑和访问控制系统的权限检查混合在一起。XACML 是朝着正确方向迈出的一大步,因为如果您将规则存储在一个单独的位置(未在业务逻辑中硬编码),您可以创建一个全自动访问控制系统。
顺便说一句,您也可以将该规则存储在数据库中。例如(虚构的编程语言):
硬编码 RBAC:
@xml
role 1 editor
@/articles
ArticleController
@GET /
readAll () {
if (session.notLoggedIn())
throw 403;
if (session.hasRole("editor"))
return articleModel.readAll();
else
return articleModel.readAllByUserId(session.getUserId());
}
未硬编码 ABAC:
@db
role 1 editor
policy 1 read every article
constraints
endpoint GET /articles
permissions
resource
projections full, owner
role 2 regular user
policy 2 read own articles
constraints
endpoint GET /articles
logged in
permissions
resource
projections owner
@/articles
ArticleController
@GET /
readAll () {
if (session.hasProjection(full))
return articleModel.readAll();
else if (session.hasProjection(owner))
return articleModel.readAllByUserId(session.getUserId());
}
如您所见,由于代码分离,非硬编码代码比硬编码代码更清晰。
XACML 是一个标准(比上面的例子多 10 倍),因此您不必每个项目都学习新的访问控制系统,也不必在每种语言中实现 XACML,因为其他人已经如果你幸运的话,做到了……