在系统中实现访问控制

时间:2013-06-27 16:03:45

标签: access-control xacml

我在系统中遇到了许多不同的访问控制模型。在任何系统中实现访问控制模型时,我们通常通过为访问控制创建单独的表来对数据库中的规则/权限进行硬编码(考虑RDBMS)。此外,这些规则/权限可以存储在XML数据库中。 我想知道在RDBMS和XML数据库上存储规则之间有什么区别?此外,我们何时应该使用XACML在系统中实现访问控制模型?我的意思是,如何决定是否应该对数据库中的规则/权利进行硬编码,还是应该使用XACML策略语言?

感谢。

3 个答案:

答案 0 :(得分:6)

免责声明:我为Axiomatics工作,这是XACML的供应商实现

如果按照自己的方式存储授权逻辑,可以在RDBMS或XML数据库中完成。没关系。我怀疑XML为您带来了任何附加功能。

现在,如果您想要一个可以满足RDBMS系统和其他类型应用程序(CRM,.NET,Java ......)的授权系统,那么您希望使用不可知的解决方案它保护的应用程序类型。这就是可扩展访问控制标记语言XACML的目标。

XACML提供基于属性的,基于策略的访问控制(ABAC和PBAC)。这使您能够编写极具表现力的授权策略,并在单个存储库中集中管理它们。然后,中央授权引擎(称为策略决策点或PDP)将为您的不同应用程序提供决策。

正如Bell所指出的,您需要的最小属性集通常是关于用户(主题),资源和操作的属性。 XACML还允许您添加环境属性。这意味着您可以编写以下类型的策略:

  

医生可以查看他们被分配到的患者的医疗记录。

  • 医生描述用户/主题
  • view 描述了操作
  • 医疗记录描述了目标资源
  • 患者也描述了目标资源。它是关于资源的元数据
  • 他们被分配到是一个有趣的案例。这是一个定义医生和患者之间关系的属性。在ABAC中,这实现为doctor.id == patient.assignedDoctorId。这是使用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,因为如果你幸运,其他人已经做过了......