[openstack-dev] [keystone] Inherited domain roles

Henry Nash henryn at linux.vnet.ibm.com
Wed Jun 19 22:08:15 UTC 2013


...no that's not what I am suggesting...just that any project can inherit additional roles (to those that are directly assigned to it) from its parent domain....please see the email I sent a few moments ago that describes the problem. 
Henry
On 19 Jun 2013, at 22:38, David Chadwick wrote:
> Hi Adam
>>> On 19/06/2013 15:36, Adam Young wrote:
>> The more I think about it, the more I think that tying the inheritance
>> to the domain assignment is the wrong solution.
>> I tend to agree with you. Unless I have misunderstood Henry's API changes, it means that when a new project is created, existing users with existing inherited roles in existing projects, automatically get the same roles in the new project. I would have thought that usually different projects would have had different users working on them, and so you would not want this automatic role assignment to take place.
>> regards
>> David
>>>>> David/Kristy originally had the Mapping blueprint and patch. It
>> contained the ability to provide arbitrary rules for mapping from the
>> identity attributes to the roles. I think that it is time to implement
>> that.
>>>> It would be more correct to say that all users in a specific group
>> (fetched out of Identity/LDAP) would get a specific role in a project
>> than to say that a user with a domain role should therefore inherit a
>> role in all projects.
>>>> When creating a scoped token, we need to query a subset of the users
>> identity information. I think that the right direction for this query
>> to flow would be:
>>>> project->roles->role-mappings->groups
>>>> as opposed to what we do now, which is to do a global query: give me all
>> groups for this user and select which ones apply. For LDAP/SQL Identity
>> backends we want to trigger the miniaml query which is "let me know if
>> the user is in groups G1, G2, G3..." as those are the groups that
>> potentially apply to role assignments for this project.
>>>>>> So I'd like to redefine the problem definition here:
>>>> "Provide a mechanism by which role assignments can be specified for more
>> than one project." One such rule would obviously be "all projects in
>> domain D1"
>>>> But it should be based on groups, not on domain role assignments.
>>>>>>>>>> On 06/10/2013 11:41 AM, David Chadwick wrote:
>>>>>>>>> On 10/06/2013 16:02, Henry Nash wrote:
>>>> Hi David,
>>>>>>>> I wasn't suggesting that we encode "inhertitness" in the name, just
>>>> that if you want to have a role that is non-inherited and one that is
>>>> inherited that relate to the same type of permission, then since role
>>>> name must be globally unique, then the two roles must have different
>>>> names....hence potentially leading to the complication in the policy
>>>> file.
>>>>>> I dont see why different role names would lead to complications in the
>>> policy file, since policies are there to assign different permissions
>>> to different roles.
>>>>>> What can happen is that policy files can get very large and complex,
>>> but that can happen regardless of whether roles are inherited or not,
>>> and mistakes can be made by assigning the wrong roles to users or the
>>> wrong permissions to roles, but again this is independent of the role
>>> definition.
>>>>>> regards
>>>>>> David
>>>>>>>> Henry On 10 Jun 2013, at 15:57, David Chadwick wrote:
>>>>>>>>> Hi Henry
>>>>>>>>>> on the definition of inherited roles, I dont think this should be
>>>>> part of the role name, but rather, each role should have meta
>>>>> information attached to it, in its role table definition, that
>>>>> indicates the properties of the role definition. In this way, you
>>>>> can make the role definition extensible by adding new columns to
>>>>> the table as and when needed e.g. if in future you want to have
>>>>> global roles inherited by domains, you add a new column, say
>>>>> GlobalToDomain, which could be a boolean with a default value of
>>>>> false, and with a value true indicating that it is inherited from
>>>>> global to domain. All pre-existing roles would not be of this type,
>>>>> and therefore all pre-existing code would work without this new
>>>>> inheritance.
>>>>>>>>>> I would not alter the role-user assignment API as this should
>>>>> simply specify the role and user and project. The code may need
>>>>> enhancing in the future, if new types of inheritance are added, in
>>>>> order to cater for cases where the role is wrongly specified by the
>>>>> administrator i.e. it does not apply to the project in question
>>>>> through lack of inheritance.
>>>>>>>>>> regards
>>>>>>>>>> David
>>>>>>>>>> On 08/06/2013 11:38, Henry Nash wrote:
>>>>>> So on the idea of using the role def for inheritance definition,
>>>>>> there were a couple of things that concerned me about it:
>>>>>>>>>>>> 1) While it definitely can simply the api changes required for
>>>>>> the current requirements, I worry that we are passing the
>>>>>> complexity on to the creation of the policy file. Since the role
>>>>>> names of an inherited and non-inherited role will obviously have
>>>>>> to be different, is there a danger that policy files end up with
>>>>>> lots of rules that have "role: xxxx and role: xxxx_inherited"? I
>>>>>> guess we can make the argument that since (with today's
>>>>>> requirements at least) the only objects that will end of
>>>>>> inheriting an assignment will be projects, the likelihood is that
>>>>>> the api lines in the policy file that contains inherited and
>>>>>> non-inherited will be different, hence avoiding the problem.
>>>>>> However, if, in the future, we were to expand inheritance to
>>>>>> support all domains, or all projects in all domains, then this
>>>>>> problem would arise for domain-relevant apis lines in the policy
>>>>>> file.
>>>>>>>>>>>> 2) If, again, in the future we support inheritance across all
>>>>>> domains/projects - would we need to more fine grained control of
>>>>>> the inheritance? For instance, we want a role that was inherited
>>>>>> by all domains, but not the projects in each domain? Perhaps,
>>>>>> one could imagine expanding the role-def to somehow indicate this
>>>>>> (maybe rather than just having a simple "inherited" boolean, we
>>>>>> specify "project_inherited", to which we could, in the future,
>>>>>> add "domain_inherited"?). We also have the problem of how you
>>>>>> assign such a role? I guess you would still need some kind of
>>>>>> modification to the assignment APIs to indicate "all domains"
>>>>>> (perhaps the "domains/*" that was suggested)?
>>>>>>>>>>>> I'd be interested in views on the above - I'm Ok fi we decide
>>>>>> that role-def is the right way to go, but want to make sure we
>>>>>> clearly understand how we would expand this in the future.
>>>>>>>>>>>> Henry On 7 Jun 2013, at 18:12, Dolph Mathews wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>> On Thu, Jun 6, 2013 at 5:48 AM, David Chadwick
>>>>>>> <d.w.chadwick at kent.ac.uk <mailto:d.w.chadwick at kent.ac.uk>>
>>>>>>> wrote:
>>>>>>>>>>>>>> Hi Henry
>>>>>>>>>>>>>> My take on this is that whether a role is automatically
>>>>>>> inheritable or not should be an attribute of the role itself,
>>>>>>> and should be independent of who the role is assigned to.
>>>>>>> Therefore when the role is initially defined, it should be
>>>>>>> stated by the Keystone admin whether it is an inherited role or
>>>>>>> not.
>>>>>>>>>>>>>> Role assignment is a separate issue and should not be confused
>>>>>>> with the basic definition of the role. Role assignment should
>>>>>>> simply be a matter of naming the subject (domain, project or
>>>>>>> user) and the role. If you dont want the role to be inherited
>>>>>>> then use a non-inheritable role.
>>>>>>>>>>>>>> The problem with all the APIs below is that they conflate role
>>>>>>> definition and role assignment together in the same API call.
>>>>>>> There should be no need to have user_ids in the definition of
>>>>>>> a role. Similarly there should be no mention of inherited in
>>>>>>> the assignment of a role to a user.
>>>>>>>>>>>>>> regards
>>>>>>>>>>>>>> David
>>>>>>>>>>>>>> +1; I really like the simplicity of this approach, and it
>>>>>>> sounds like something we can migrate to easily (e.g. default
>>>>>>> inheritable=False for existing roles). Then global role
>>>>>>> assignments would follow an API like:
>>>>>>>>>>>>>> GET /users/{user_id}/roles # list global roles HEAD
>>>>>>> /users/{user_id}/roles/{inheritable_role_id} # check if a
>>>>>>> global role is assigned PUT
>>>>>>> /users/{user_id}/roles/{inheritable_role_id} # assign a global
>>>>>>> role DELETE /users/{user_id}/roles/{inheritable_role_id} #
>>>>>>> revoke a global role
>>>>>>>>>>>>>> where a non-inheritable role assigned a user without a domain
>>>>>>> or project for context wouldn't make any sense. In fact,
>>>>>>> assigning an inheritable role to a user on a project wouldn't
>>>>>>> be very useful (as it wouldn't inherit to anything in the core
>>>>>>> API), but I don't see a reason to deny it.
>>>>>>>>>>>>>>>>>>>>> On 05/06/2013 15:31, Henry Nash wrote:
>>>>>>>>>>>>>> Hi
>>>>>>>>>>>>>> As per the discussion during the keystone IRC meeting
>>>>>>> yesterday, I have been reviewing the proposals for this
>>>>>>> functionality. There have been two objections to the current
>>>>>>> proposal (which can be found here:
>>>>>>> https://review.openstack.org/#__/c/29781/10
>>>>>>> <https://review.openstack.org/#/c/29781/10>), which are:
>>>>>>>>>>>>>> 1) The api changes should allow for a logical, generic future
>>>>>>> extension for support of inherited roles across all domains
>>>>>>> etc., should we chose to go that route 2) The use of a single
>>>>>>> api to list the various grants, filtered by a query string if
>>>>>>> necessary.
>>>>>>>>>>>>>> My proposal for handling these two objections is as follows:
>>>>>>>>>>>>>> 1) API extensions.
>>>>>>>>>>>>>> There are several aspects of inherited roles that we are trying
>>>>>>> to cement, which are:
>>>>>>>>>>>>>> a) The are dynamic - i.e. this isn't a case of a short hand for
>>>>>>> saying add this role to all the current projects in the domain
>>>>>>> - rather it is a role assignment that is attached to the domain
>>>>>>> but is added to the effective roles of any project (now and in
>>>>>>> the future) that exists in this domain b) The are separate from
>>>>>>> a role that is on the domain itself - i.e. we need to ensure
>>>>>>> that we keep separate inherited and non-inherited roles. c)
>>>>>>> Maintain the philosophy that If you can create a role
>>>>>>> assignment with a given API, there should be an equivalent to
>>>>>>> read it back and delete it (i.e. you mustn't have the case
>>>>>>> where, for instance you can list a grant, but can't delete it
>>>>>>> at the conceptual level)
>>>>>>>>>>>>>> The current proposal had been to do this by adding an
>>>>>>> "inherited" component of the url for create, check and delete
>>>>>>> grants to a domain, e.g.
>>>>>>>>>>>>>> PUT /domains/{domain_id}/users/{__user_id}/roles/{role_id} PUT
>>>>>>> /domains/{domain_id}/users/{__user_id}/roles/{role_id}/__inherited
>>>>>>>>>>>>>>>>> GET /domains/{domain_id}/users/{__user_id}/roles/{role_id}
>>>>>>> GET
>>>>>>> /domains/{domain_id}/users/{__user_id}/roles/{role_id}/__inherited
>>>>>>>>>>>>>>>>> DELETE /domains/{domain_id}/users/{__user_id}/roles/{role_id}
>>>>>>> DELETE
>>>>>>> /domains/{domain_id}/users/{__user_id}/roles/{role_id}/__inherited
>>>>>>>>>>>>>>>>> etc.
>>>>>>>>>>>>>> A counter proposal has been made to expand this, along this
>>>>>>> lines of:
>>>>>>>>>>>>>> Role applicable to all projects within a domain PUT
>>>>>>> /domains/{domain_id}/users/{__user_id}/roles/{role_id}/__projects
>>>>>>>>>>>>>>>>>>>>>>>> Roles inherited by all projects in all domains
>>>>>>> PUT /usrs/{user_id}/roles/{role___id}/projects
>>>>>>>>>>>>>> Roles inherited by all domains, at the domain level PUT
>>>>>>> /usrs/{user_id}/roles/{role___id}/domains
>>>>>>>>>>>>>> While I understand the desire to have extensibility if we wish
>>>>>>> to provide more "global-ness" of roles, I think the above
>>>>>>> proposal is less clear about whether these assignments are
>>>>>>> dynamic (see item a) above). How about this as a counter
>>>>>>> proposal:
>>>>>>>>>>>>>> Role applicable inherited by all projects within a domain (this
>>>>>>> is the same as the current proposal) PUT
>>>>>>> /domains/{domain_id}/users/{__user_id}/roles/{role_id}/__inherited
>>>>>>>>>>>>>>>>>>>>>>>> Roles inherited by all projects in all domains - if we were to
>>>>>>> ever support this (not part of the current proposal) PUT
>>>>>>> /domains/users/{user_id}/__roles/{role_id}/inherited
>>>>>>>>>>>>>> Roles inherited by all domains, at the domain level - if we
>>>>>>> were to ever support this (not part of the current proposal)
>>>>>>> PUT /domains/users/{user_id}/__roles/{role_id}/inherited
>>>>>>>>>>>>>> To go along with the above, you would have the respective GET,
>>>>>>> CHECK & DELETE versions of those apis.
>>>>>>>>>>>>>> 2) Single vs multiple apis I think this comment is actually
>>>>>>> misplaced in the gerrit review, and is intended to directed at
>>>>>>> the api extensions I proposed to allow the list of a users
>>>>>>> "effective" roles on a project (i.e. directly assigned, those
>>>>>>> by virtue of group membership and inheritance from the parent
>>>>>>> domain). For this, I proposed adding an optional "effective"
>>>>>>> query parameter to each of:
>>>>>>>>>>>>>> List user's roles on project: `GET
>>>>>>> /projects/{project_id}/users/{__user_id}/roles List group's
>>>>>>> roles on project: `GET
>>>>>>> /projects/{project_id}/groups/__{group_id}/roles Check user's
>>>>>>> role on project: `GET
>>>>>>> /projects/{project_id}/users/{__user_id}/role/{role_id} Check
>>>>>>> group's roles on project: `GET
>>>>>>> /projects/{project_id}/groups/__{group_id}/role/{role_id}
>>>>>>>>>>>>>> e.g. GET
>>>>>>> /projects/{project_id}/users/{__user_id}/roles?effective
>>>>>>> ...would get you the effective roles the user has on that
>>>>>>> project, as opposed to only the directly assigned ones if you
>>>>>>> issue the call without the "effective" query parameter.
>>>>>>>>>>>>>> Dolph and I had already been discussing that the existing v3
>>>>>>> api of:
>>>>>>>>>>>>>> GET /users/{user_id}/roles
>>>>>>>>>>>>>> ...which is meant to return all the role assignments for a
>>>>>>> user, but is in fact broken in the current Grizzly code (it
>>>>>>> always returns an error). So I agree with the proposal that we
>>>>>>> should scrap the "effective" query parameter for the specific
>>>>>>> list/check calls for the project - and instead properly
>>>>>>> implement the "get all assignments for a user" call. I propose
>>>>>>> the amended spec for this call is:
>>>>>>>>>>>>>> #### List a user's effective role assignments: `GET
>>>>>>> /users/{user_id}/role-__assignments`
>>>>>>>>>>>>>> query_string: page (optional) query_string: per_page (optional,
>>>>>>> default 30) query_string: id, project_id, domain_id
>>>>>>>>>>>>>> Response:
>>>>>>>>>>>>>> Status: 200 OK
>>>>>>>>>>>>>> [ { "id": "--role-id--", "name": "--role-name--", "project_id":
>>>>>>> "--project-id--", "source": { "direct": true, (optional)
>>>>>>> "domain_inherited: "--domain-id--", (optional)
>>>>>>> "group_membership: "--group-id--" (optional) } }, {
>>>>>>> "domain_id": "--domain-id--", "id": "--role-id--", "name":
>>>>>>> "--role-name--", "source": { "direct": true, (optional)
>>>>>>> "group_membership: "--group-id--" (optional) } } ]
>>>>>>>>>>>>>> The "source" structure must have at least one of the values
>>>>>>> given above (and could have more than one, e.g. both
>>>>>>> domain_inherited and global_membership for a project where the
>>>>>>> role is due to a group role that is inherited from the domain).
>>>>>>> If were even to support global roles across all domains, then
>>>>>>> we would extend the "source structure" accordingly. I'm open
>>>>>>> to other options for the above format. however, so comments
>>>>>>> welcome.
>>>>>>>>>>>>>> Does this sounds like a reasonable plan overall?
>>>>>>>>>>>>>> Henry
>>>>>>>>>>>>>>>>>>>>>>>>>>>> _________________________________________________ OpenStack-dev
>>>>>>> mailing list OpenStack-dev at lists.openstack.__org
>>>>>>> <mailto:OpenStack-dev at lists.openstack.org>
>>>>>>> http://lists.openstack.org/__cgi-bin/mailman/listinfo/__openstack-dev
>>>>>>>>>>>>>>>>> <http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev>
>>>>>>>>>>>>>>>>>>>>> _________________________________________________ OpenStack-dev
>>>>>>> mailing list OpenStack-dev at lists.openstack.__org
>>>>>>> <mailto:OpenStack-dev at lists.openstack.org>
>>>>>>> http://lists.openstack.org/__cgi-bin/mailman/listinfo/__openstack-dev
>>>>>>>>>>>>>>>>> <http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev>
>>>>>>>>>>>>>>>>>>>>> _______________________________________________ OpenStack-dev
>>>>>>> mailing list OpenStack-dev at lists.openstack.org
>>>>>>> <mailto:OpenStack-dev at lists.openstack.org>
>>>>>>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> _______________________________________________
>>>>>> OpenStack-dev mailing list OpenStack-dev at lists.openstack.org
>>>>>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>>>>>>>>>>>>>>>>>>>>> _______________________________________________
>>> OpenStack-dev mailing list
>>> OpenStack-dev at lists.openstack.org
>>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>>>>>> _______________________________________________
>> OpenStack-dev mailing list
>> OpenStack-dev at lists.openstack.org
>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev at lists.openstack.org
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>


More information about the OpenStack-dev mailing list

AltStyle によって変換されたページ (->オリジナル) /