我在系统中遇到了许多不同的访问控制模型。在任何系统中实现访问控制模型时,我们通常通过为访问控制创建单独的表来对数据库中的规则/权限进行硬编码(考虑RDBMS)。此外,这些规则/权限可以存储在XML数据库中。 我想知道在RDBMS和XML数据库上存储规则之间有什么区别?此外,我们何时应该使用XACML在系统中实现访问控制模型?我的意思是,如何决定是否应该对数据库中的规则/权利进行硬编码,还是应该使用XACML策略语言?
感谢。
答案 0 :(得分:6)
免责声明:我为Axiomatics工作,这是XACML的供应商实现
如果按照自己的方式存储授权逻辑,可以在RDBMS或XML数据库中完成。没关系。我怀疑XML为您带来了任何附加功能。
现在,如果您想要一个可以满足RDBMS系统和其他类型应用程序(CRM,.NET,Java ......)的授权系统,那么您希望使用不可知的解决方案它保护的应用程序类型。这就是可扩展访问控制标记语言XACML的目标。
XACML提供基于属性的,基于策略的访问控制(ABAC和PBAC)。这使您能够编写极具表现力的授权策略,并在单个存储库中集中管理它们。然后,中央授权引擎(称为策略决策点或PDP)将为您的不同应用程序提供决策。
正如Bell所指出的,您需要的最小属性集通常是关于用户(主题),资源和操作的属性。 XACML还允许您添加环境属性。这意味着您可以编写以下类型的策略:
医生可以查看他们被分配到的患者的医疗记录。
XACML的好处包括: - 贝尔提到的授权逻辑外部化的能力 - 无需经历开发/部署生命周期即可更新授权逻辑的能力 - 对许多不同的应用程序以相同的方式实现细粒度授权的能力 - 能够对授权逻辑进行可见性和审计
HTH
答案 1 :(得分:1)
这两者并不相互排斥。
XACML策略描述了如何将有关尝试操作的一组属性转换为允许/拒绝的决策。至少属性将是用户是谁(主题),他们正在尝试做什么(Action)以及他们尝试做什么(对象)。可以添加诸如时间,请求来源和许多其他信息之类的信息。
用户和对象的属性仍然必须存储在数据库中。如果要对用户或对象进行分组以简化管理或简化定义访问控制规则,那么您将必须管理数据库中的所有内容。然后,需要将所有数据传递到XACML策略决策点以返回允许/拒绝决策。
使用XACML定义这些规则的优势在于,可以将规则的评估传递给外部应用程序,而不是为数据库中定义的规则编写自己的决策逻辑。使用成熟的,经过测试的XACML实现(有开源选项)可以避免在将检查构建到自己的代码中时出错。
答案 2 :(得分:1)
我认为对代码中的策略进行硬编码是一种非常糟糕的做法。在这种情况下,您将资源的业务逻辑与访问控制系统的权限检查混合在一起。 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,因为如果你幸运,其他人已经做过了......