[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: Re: [xacml] Issues with the Specification of Role Enablement
Hi Erik, On 23/04/2014 6:00 PM, Erik Rissanen wrote:
Hi Steve, Thanks for spotting the issue with collision with access policies. It's true that one cannot test for a category, so that text should be removed. I think the implied assumption regarding collision with access policies is that access policies should check whatever attributes they depend on and not make decisions unless the attributes of the request clearly mark the request to be an access policy about a situation which the policies are intended to handle. So I would propose that we change the text to this: "This separation may be managed in various ways, such as by using different PDPs with different policy stores or ensuring that any other policies present on the PDP do not make decisions on role assignment requests."
That pushes implementors towards using the presence/absence of the enableRole value to achieve the separation, which is more of a burden on policy writers than using separate policy stores, as I've already argued.
I think it is good to have the role attribute in the resource category, since conceptually the resource being requested access to is to enable the role.
On the other hand, the effect of a successful role enablement check is to populate the subject:role attribute in the access-subject category, so referring to it by a different category in role assignment policies isn't exactly intuitive.
The attributes of the subject should describe the attributes of the subject. If the role attribute is present on the subject category, the meaning of this should be that the subject has the indicated role, not that the subject is requesting access to the role.
If the access-subject already has a value of the subject:role attribute does that mean a role enablement check should not be performed for that role value ? If a check is performed and the result is not Permit, does that mean the value should be removed from the access-subject ? What effect does that have on preceding role enablement checks that might have depended on the role values in the access-subject ? The profile doesn't provide any guidance on such questions. These questions don't arise if the role to be enabled is in the subject:role attribute of the access subject. A side benefit of leaving the subject:role where it is is that role assignment policies can unambiguously refer to role values to be enabled in the subject:role attribute of other subject categories, such as recipient-subject and intermediary-subject. I see no reason to disallow role enablement for other kinds of subject, but if they all map the role to be enabled into subject:role in the resource category, then the role assignment policies can't tell them apart. There would need to be a separate policy store for each category of subject.
To implement dynamic role enablement, like you suggest, I think the more conceptually correct way to do it would be to define another category for it since such a request conceptually has these categories: - The current attributes of the subject - The requested role (this is the conceptual resource) - The context in which the role is intended to be used (the resource of the forthcoming access request)
You missed two: the conceptual action and the action context in which the role is intended to be used. That is a viable solution, although it doesn't answer the questions above. Of course, the RBAC profile doesn't provide any category definitions to make this possible. You have two resource categories there. Which one gets to be "urn:oasis:names:tc:xacml:3.0:attribute-category:resource" ? I faced a similar consideration with the Obligation and Advice Authority. There I decided it would be clearer for policy writers to reference the resource and action attributes of the access request by their usual categories and let the extra resource (i.e., the decision) be in a new category. Separate policy stores meant I didn't need an extra action category. If the role to be enabled and the enableRole action are expected to be in new categories for dynamic role enablement, then it would make most sense for static role enablement requests to also use these same new categories.
However, I think the end use case for something like this can be achieved more simply by considering the role to be statically assigned, and then checking any dynamic conditions as part of the normal access policies. Compare these two ways to implement the use case "The one who created a purchase order cannot approve it": - With dynamic roles: a) Check whether the subject as the approval role on the given purchase order. Deny this if the subject has created this purchase order. b) Do an access check to see if the subject as the approval role on the given purchase order. - With a separation of duties rule and static roles: a) Do an access check to see if the subject has the static approval role, and but deny if the subject had created the purchase order in question. The latter is in my opinion simpler since there is only a single request and single set of policies, which is easier to implement and understand since there is not this state to manage.
I agree that using dynamic role enablement for separation of duties is more complex. It is also not a complete solution for XACML because it is based on the premise that users gain permissions through the roles they are assigned. In a general XACML system a user can gain permissions through policies that aren't related to roles in any way. For that reason I long ago discounted role enablement as a solution for enforcing separation of duties constraints. The profile would do better to not suggest a link between dynamic role enablement and separation of duties constraints as it does currently. Where I see role enablement being useful is in avoiding a role explosion. In a pure role-based access control system (where users only gain permissions through the roles they are assigned) the only way to deal with the inevitable exceptions and variations is to create ever more roles. Role enablement provides an alternative to that. For example, one can define a generic role for administering a particular kind of resource (Web portals, say) and then use dynamic role enablement to associate particular users with particular instances of the resource kind. The alternative is to define a separate role for each resource instance. Another example would be defining a generic role for a project leader and then using dynamic role enablement to only assign that role to project leader users when they are accessing the resources belonging to their project. Shift workers can be given a role appropriate to their duties that is only enabled during the hours of their shift. All these examples depend on dynamic role enablement. Static role enablement isn't worth worrying about, IMO, because it is too limited in what attributes it can safely use (the profile warrants a security considerations section pointing out the dangers of making static role enablement checks using attributes that are liable to change by the time of an access request).
As such, I have doubts of the value of standardizing dynamic role enablement in this profile.
Mostly I was arguing about the inadequacy of the specification of static role enablement. Segregation of the role assignment and access policies is the easier and simpler solution for static role enablement. That it can be defined to extend neatly and naturally to dynamic role enablement is a bonus. Regards, Steven
Best regards, Erik On 2014-04-14 06:54, Steven Legg wrote:All, The way role enablement is defined in the RBAC profile is either underspecified, unsafe, or needlessly complex, depending on how one looks at it. For reference, a role enablement request is implied to have "urn:oasis:names:tc:xacml:2.0:actions:enableRole" as the value of the action-id attribute in the action category, and the URI of the role to be enabled as the value of the "urn:oasis:names:tc:xacml:2.0:subject:role" attribute in the resource category. Role assignment policies would be referring to these attributes. The profile suggests two methods to ensure that role assignment policies are only used when evaluating role enablement requests. It doesn't say that access policies are not to be used when evaluating role enablement requests, but I take that as a reasonable working assumption. The first method is to use a different PDP and different policy store for role enablement, i.e., to segregate the role assignment policies and access policies. The second method is to include an <Attributes> element with a Category of “urn:oasis:names:tc:xacml:2.0:subject-category:role-enablement-authority” in role enablement requests. However, a policy can't test for the presence of a category, it can only test for the presence of an attribute in that category. The profile hasn't defined such an attribute, reducing the likelihood of implementations being interoperable. If such an attribute were defined, then the "enableRole" value for the action-id attribute would be redundant since the presence of the new attribute indicates that a request is a role enablement request. An implementor might instead think to use the presence of the "enableRole" value of the action-id attribute in the request context to keep role assignment policies from being applicable during the evaluation of an access request. After all, it is simple enough to have a target like (action-id=="enableRole") for the role assignment policies. But the form of a role enablement request is not enough to prevent access policies from being applicable during the evaluation of a role enablement request. Consider an access policy that denied access to user "Bob". That policy would be applicable to every role enablement request for user "Bob", even though it's an access policy. In this case, the final outcome of any access request by "Bob" is probably as expected, but for the wrong reasons. If the same form of request were to be used for dynamic role enablement by populating the resource and action categories in the role enablement request with values from an access request, then many more access policies would be applicable during the evaluation of a role enablement request with much more unexpected results. To prevent access policies from being applicable during the evaluation of a role enablement request, a policy writer needs to express the negation of (action-id=="enableRole"), which isn't possible in a target. The policy writer would have to put the negated expression in the condition of every access rule, or use the on-permit-apply-second combining algorithm. Neither strategy is convenient, and even if the negation could be expressed in a target, it is still an imposition on the writers of access policies. Note that testing for an attribute in the "role-enablement-authority" category would have the same issues. Segregating the role assignment and access policies (the first method) is clearly a much simpler solution to support. In this case, the "enableRole" action-id value is unnecessary in a role enablement request or role assignment policy because any request directed at the PDP using the role assignment policies is implicitly a role enablement request. Likewise, any request directed at the PDP using the access policies is implicitly an access request. No additional assertions in the policy targets are required to keep the evaluation of access policies and role enablement policies separate. Putting the URI of the role to be enabled in the "subject:role" attribute in the resource category is also unnecessary. Putting it there opens the possibility that role assignment policies can test for the value of the "subject:role" attribute in the access-subject category (i.e., role enablement checks that are dependent on the outcome of other role enablement checks), which raises ordering dependencies on the role enablement checks. I don't think we need to go there. If instead the URI of the role to be enabled appears as the only value of the "subject:role" attribute in the access-subject category, then role enablement checks can't be dependent on the outcome of other role enablement checks and role assignment policies can then more naturally refer to the "subject:role" attribute in the access-subject category, which is the category and attribute the enabled role will appear in as far as the access policies are concerned. With the "enableRole" value gone and the "subject:role" attribute back in the access-subject category there is a clear and simple path for extending the profile into dynamic role enablement. The dynamic role enablement requests are just the access request with the "subject:role" attribute in the access-subject category taking each of the possible role values in turn (as it would for static role enablement requests). The action and resource attributes of the dynamic role enablement request are identical to the action and resource attributes of the access request. I think the RBAC profile should be recommending segregation for role assignment policies and dispensing with "enableRole" and the "subject:role" attribute in the resource category. Segregation is a superior solution for role enablement, whether static or dynamic. Regards, Steven --------------------------------------------------------------------- To unsubscribe from this mail list, you must leave the OASIS TC that generates this mail. Follow this link to all your TCs in OASIS at: https://www.oasis-open.org/apps/org/workgroup/portal/my_workgroups.php--------------------------------------------------------------------- To unsubscribe from this mail list, you must leave the OASIS TC that generates this mail. Follow this link to all your TCs in OASIS at: https://www.oasis-open.org/apps/org/workgroup/portal/my_workgroups.php