使用XACML的复杂授权

Sha*_*awn 3 authorization access-control xacml alfa abac

我的公司正在寻求实现集中式安全服务,并且XACML似乎是一种流行的标准。我有一个复杂的授权方案,但一直很难弄清楚如何使用XACML策略的属性来定义它。

我正在使用的系统具有与该身份验证方案相关的几个部分:

  • 用户创建项目来组织他们的工作。每个项目都有一个团队成员和查看者(可以查看但不能修改项目的用户或组)列表。
  • 在这些项目中,用户创建配方来描述应如何制造产品。
  • 用户要求这些配方由另一组制造。

如果用户要查看特定项目的食谱,则必须满足以下任一条件:

  • 用户必须是食谱的所有者(写食谱的人)。
  • 用户必须是创建配方的项目中的团队成员。(直接或通过组成员身份)
  • 用户必须是制造配方组的成员。(他们需要查看制造食谱。)
  • 用户必须是过去两周内制作配方的小组的成员。(即,在完成制造配方的请求之后,他们可以继续查看配方两周以纠正任何问题。)
  • 用户必须是管理员。

使用这些规则,似乎确定用户是否可以查看食谱所需的属性包括:

  • 用户
  • 用户的组成员身份(用于项目访问,制造组或管理员访问)
  • 项目团队成员和观众
  • 配方的制造要求

问题:

  • PIP将如何收集此信息?直接从数据库?通过服务调用到存储此信息的系统?
  • 一般而言,如何用XACML表示此信息?我见过的大多数示例都使用简单的模型,这些模型不使用数据集合(例如制造请求列表)。直接将属性直接赋予正在访问的对象。数据会以某种方式展平吗,例如“ isBeingManufacturedByUserGroup”?(如果是这样,将如何确定该属性的值?)
  • 这些政策将如何构成以评估这些规则?
  • 除了XACML之外,还有其他替代方法来处理这种授权吗?OAuth 2.0能够更轻松地处理此类问题吗?

Dav*_*ard 5

(免责声明-我为AXIomatics工作,XACML和ABAC的主要实现)

好问题。实际上,我已经整理了一个授权策略生命周期,该生命周期将引导用户完成收集需求,识别属性和实施策略的过程。

授权策略生命周期

就您而言,让我们逐步了解您的要求

需求收集

您的原始要求

以下任何一项必须为真:

  • 用户必须是食谱的所有者(写食谱的人)。
  • 用户必须是创建配方的项目中的团队成员。(直接或通过组成员身份)
  • 用户必须是制造配方组的成员。(他们需要查看制造食谱。)
  • 用户必须是过去两周内制作配方的小组的成员。(即,在完成制造配方的请求之后,他们可以继续查看配方两周以纠正任何问题。)
  • 用户必须是管理员。

重组需求

我喜欢将需求重做为主语-动词-宾语,例如,用户可以查看菜谱...基于此模型,您的原始需求可以改写为以下内容:

  1. 用户可以查看他/她拥有的食谱。
  2. 用户可以查看在用户所属项目内部创建的配方
  3. 用户可以在制造阶段查看属于用户所属(制造)组的配方。
  4. 用户可以在制造阶段中查看属于该用户所属(制造)组的配方,并且制造日期是否在今天的日期的2周内。
  5. 管理员可以查看配方。

识别属性

您可以将属性分为不同的类别(或语法功能)。XACML本身使用类别,因此这是实现使用XACML(或ALFA)的自然步骤。

主题属性

  • userId:此类别中的键属性。它将用于标识用户,但也检索所有其他派生属性。
  • 项目:用户所属的项目列表
  • 组:用户所属的组列表
  • 角色:用户的角色,例如

资源属性

  • objectType:这是一个属性,用于区分要控制对配方,文档或交易的访问的不同类型的项目
  • recipeId:食谱的关键属性。它将用于标识您要访问的特定配方,还将用作查找其他属性的键,例如,配方所在的状态,所属的组和项目。
  • 组:配方所属的组
  • 项目:配方所属的项目

动作属性

在此类别中,从外观上看,您只有:

  • 可能值为{view,edit,delete ...}的actionId。

使用属性重写需求

  1. 如果配方。所有者==用户ID,则任何人都可以对objectType ==“配方”执行操作==“查看”
  2. 如果配方.project == user.project,则任何人都可以对objectType ==“ recipe”执行操作==“查看”
  3. 如果配方.stage ==“制造”和配方.group == user.group,则任何人都可以对objectType ==“ recipe”执行操作==“查看”
  4. 如果配方.stage ==“制造”和配方.group == user.group和currentDate <=配方。制造日期+“ 2周”,则任何人都可以对objectType ==“配方”执行操作==“查看”。
  5. 具有角色==“ administrator”的任何人都可以对objectType ==“ recipe”执行操作==“ view”。

使用ALFA或XACML实施策略

下一步是实施您的策略。您可以使用ALFA(授权的缩写语言)。Axiomatics有一个Eclipse插件,可将ALFA转换为XACML 3.0。

让我们创建一个处理配方的策略集。该策略集将包含处理操作视图的策略。该策略将包含满足每个要求的规则。

policyset recipe{
    target clause objectType == "recipe"
    apply firstApplicable
    /**
     * View recipes
     */
    policy viewRecipe{
        target clause actionId == "view"
        apply firstApplicable
        /**
         * Administrators can view all recipes
         */
        rule administrator{
            target clause user.role == "administrator"
            permit
        }
        /**
         * Recipe owners can view their own recipes
         */
        rule owner{
            permit
            condition user.userId == recipe.owner
        }
        /**
         * Users can view recipes in their project
         */
         rule sameProject{
             permit
             condition user.assignedProject == recipe.assignedProject
         }
        /**
         * Users can view recipes in their project
         */
         rule sameGroup{
             target clause recipe.stage == "manufacturing"
             permit
             condition user.assignedGroup == recipe.assignedGroup
         }
        /**
         * Users can view recipes in their project
         */
         rule sameGroupManufactured{
             target clause recipe.stage == "manufacturing"
             permit
             condition user.assignedGroup == recipe.assignedGroup && currentDate<=dateTimeAddDayTimeDuration(dateTimeOneAndOnly(recipe.manufacturedDate),"P14D":dayTimeDuration)
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用策略信息点

PIP将如何收集此信息?直接从数据库?通过服务调用到存储此信息的系统?

PIP只是外部属性源的抽象概念。可以是任何东西。不同的实现将具有不同的PIP连接器。例如,Axiomatics Policy Server提供了SQL,LDAP和REST服务的连接器。这涵盖了客户的大部分需求。

XACML和OAuth 2.0

您将两种技术进行了比较,但是它们有所不同。OAuth 2.0首先将重点放在身份验证上。它打败了密码反模式。然后,需要定义权限或在OAuth中称为权限的范围。但是,这些作用域仅是准时权限。您仍然依靠目标应用程序来发布一组有效的作用域,并且仍然无法执行细粒度的访问控制。我的同事针对该主题撰写了一个分为三部分的博客,您可以在此处阅读第一部分。

我希望这有帮助。随时提出后续问题或发给我。

XACML输出(奖金)

<?xml version="1.0" encoding="UTF-8"?>
 <!--This file was generated by the ALFA Plugin for Eclipse from Axiomatics AB (http://www.axiomatics.com). 
 Any modification to this file will be lost upon recompilation of the source ALFA file-->
<xacml3:PolicySet xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"
    PolicySetId="http://axiomatics.com/alfa/identifier/so.recipe"
    PolicyCombiningAlgId="urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:first-applicable"
    Version="1.0">
    <xacml3:Description>Control access to recipes</xacml3:Description>
    <xacml3:PolicySetDefaults>
        <xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116</xacml3:XPathVersion>
    </xacml3:PolicySetDefaults>
    <xacml3:Target>
        <xacml3:AnyOf>
            <xacml3:AllOf>
                <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                    <xacml3:AttributeValue
                        DataType="http://www.w3.org/2001/XMLSchema#string">recipe</xacml3:AttributeValue>
                    <xacml3:AttributeDesignator 
                        AttributeId="so.objectType"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
                        MustBePresent="false"
                    />
                </xacml3:Match>
            </xacml3:AllOf>
        </xacml3:AnyOf>
    </xacml3:Target>
    <xacml3:Policy xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"
        PolicyId="http://axiomatics.com/alfa/identifier/so.recipe.viewRecipe"
        RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable"
        Version="1.0">
        <xacml3:Description>View recipes</xacml3:Description>
        <xacml3:PolicyDefaults>
            <xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116</xacml3:XPathVersion>
        </xacml3:PolicyDefaults>
        <xacml3:Target>
            <xacml3:AnyOf>
                <xacml3:AllOf>
                    <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                        <xacml3:AttributeValue
                            DataType="http://www.w3.org/2001/XMLSchema#string">view</xacml3:AttributeValue>
                        <xacml3:AttributeDesignator 
                            AttributeId="so.actionId"
                            DataType="http://www.w3.org/2001/XMLSchema#string"
                            Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"
                            MustBePresent="false"
                        />
                    </xacml3:Match>
                </xacml3:AllOf>
            </xacml3:AnyOf>
        </xacml3:Target>
        <xacml3:Rule 
                Effect="Permit"
                RuleId="http://axiomatics.com/alfa/identifier/so.recipe.viewRecipe.administrator">
            <xacml3:Description>Administrators can view all recipes</xacml3:Description>
            <xacml3:Target>
                <xacml3:AnyOf>
                    <xacml3:AllOf>
                        <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                            <xacml3:AttributeValue
                                DataType="http://www.w3.org/2001/XMLSchema#string">administrator</xacml3:AttributeValue>
                            <xacml3:AttributeDesignator 
                                AttributeId="so.user.role"
                                DataType="http://www.w3.org/2001/XMLSchema#string"
                                Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                                MustBePresent="false"
                            />
                        </xacml3:Match>
                    </xacml3:AllOf>
                </xacml3:AnyOf>
            </xacml3:Target>
        </xacml3:Rule>
        <xacml3:Rule 
                Effect="Permit"
                RuleId="http://axiomatics.com/alfa/identifier/so.recipe.viewRecipe.owner">
            <xacml3:Description>Recipe owners can view their own recipes</xacml3:Description>
            <xacml3:Target />
            <xacml3:Condition>
                <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of-any">
                    <xacml3:Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"/>
                    <xacml3:AttributeDesignator 
                        AttributeId="so.user.userId"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                        MustBePresent="false"
                    />
                    <xacml3:AttributeDesignator 
                        AttributeId="so.recipe.owner"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
                        MustBePresent="false"
                    />
                </xacml3:Apply>
            </xacml3:Condition>
        </xacml3:Rule>
        <xacml3:Rule 
                Effect="Permit"
                RuleId="http://axiomatics.com/alfa/identifier/so.recipe.viewRecipe.sameProject">
            <xacml3:Description>Users can view recipes in their project</xacml3:Description>
            <xacml3:Target />
            <xacml3:Condition>
                <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of-any">
                    <xacml3:Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"/>
                    <xacml3:AttributeDesignator 
                        AttributeId="so.user.assignedProject"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                        MustBePresent="false"
                    />
                    <xacml3:AttributeDesignator 
                        AttributeId="so.recipe.assignedProject"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
                        MustBePresent="false"
                    />
                </xacml3:Apply>
            </xacml3:Condition>
        </xacml3:Rule>
        <xacml3:Rule 
                Effect="Permit"
                RuleId="http://axiomatics.com/alfa/identifier/so.recipe.viewRecipe.sameGroup">
            <xacml3:Description>Users can view recipes in their project</xacml3:Description>
            <xacml3:Target>
                <xacml3:AnyOf>
                    <xacml3:AllOf>
                        <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                            <xacml3:AttributeValue
                                DataType="http://www.w3.org/2001/XMLSchema#string">manufacturing</xacml3:AttributeValue>
                            <xacml3:AttributeDesignator 
                                AttributeId="so.recipe.stage"
                                DataType="http://www.w3.org/2001/XMLSchema#string"
                                Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
                                MustBePresent="false"
                            />
                        </xacml3:Match>
                    </xacml3:AllOf>
                </xacml3:AnyOf>
            </xacml3:Target>
            <xacml3:Condition>
                <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of-any">
                    <xacml3:Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"/>
                    <xacml3:AttributeDesignator 
                        AttributeId="so.user.assignedGroup"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                        MustBePresent="false"
                    />
                    <xacml3:AttributeDesignator 
                        AttributeId="so.recipe.assignedGroup"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
                        MustBePresent="false"
                    />
                </xacml3:Apply>
            </xacml3:Condition>
        </xacml3:Rule>
        <xacml3:Rule 
                Effect="Permit"
                RuleId="http://axiomatics.com/alfa/identifier/so.recipe.viewRecipe.sameGroupManufactured">
            <xacml3:Description>Users can view recipes in their project</xacml3:Description>
            <xacml3:Target>
                <xacml3:AnyOf>
                    <xacml3:AllOf>
                        <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                            <xacml3:AttributeValue
                                DataType="http://www.w3.org/2001/XMLSchema#string">manufacturing</xacml3:AttributeValue>
                            <xacml3:AttributeDesignator 
                                AttributeId="so.recipe.stage"
                                DataType="http://www.w3.org/2001/XMLSchema#string"
                                Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
                                MustBePresent="false"
                            />
                        </xacml3:Match>
                    </xacml3:AllOf>
                </xacml3:AnyOf>
            </xacml3:Target>
            <xacml3:Condition>
                <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:and">
                    <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of-any">
                        <xacml3:Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"/>
                        <xacml3:AttributeDesignator 
                            AttributeId="so.user.assignedGroup"
                            DataType="http://www.w3.org/2001/XMLSchema#string"
                            Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                            MustBePresent="false"
                        />
                        <xacml3:AttributeDesignator 
                            AttributeId="so.recipe.assignedGroup"
                            DataType="http://www.w3.org/2001/XMLSchema#string"
                            Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
                            MustBePresent="false"
                        />
                    </xacml3:Apply>
                    <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of">
                        <xacml3:Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:dateTime-greater-than-or-equal"/>
                        <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:3.0:function:dateTime-add-dayTimeDuration" >
                            <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:dateTime-one-and-only" >
                                <xacml3:AttributeDesignator 
                                    AttributeId="so.recipe.manufacturedDate"
                                    DataType="http://www.w3.org/2001/XMLSchema#dateTime"
                                    Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
                                    MustBePresent="false"
                                />
                            </xacml3:Apply>
                            <xacml3:AttributeValue
                                DataType="http://www.w3.org/2001/XMLSchema#dayTimeDuration">P14D</xacml3:AttributeValue>
                        </xacml3:Apply>
                        <xacml3:AttributeDesignator 
                            AttributeId="currentDate"
                            DataType="http://www.w3.org/2001/XMLSchema#dateTime"
                            Category="urn:oasis:names:tc:xacml:3.0:attribute-category:environment"
                            MustBePresent="false"
                        />
                    </xacml3:Apply>
                </xacml3:Apply>
            </xacml3:Condition>
        </xacml3:Rule>
    </xacml3:Policy>
</xacml3:PolicySet>
Run Code Online (Sandbox Code Playgroud)