On Nov 13, 2012, at 11:35 AM, heckj wrote: > So maintaining a token scoped to just the user, and a mechanism to scope it > to a tenant sound like all goodness. We can absolutely keep the API such that > it can provide either. > > Right now, our auth_token middleware implicitly requires a tenant in that > scoping to work. If someone wanted to support a token scoped to just a user > for the services, they'd need a different middleware there. Keystone as a > service *doesn't* use the auth_token middleware, so with the V3 API we can > make it provide services appropriately based on a token scoped only to the > user. > > All that in place, allow a token to be indeterminate scoped to multiple > tenants is fraught with security flaws, and if we continue to provide > unscoped tokens, that should obviate the need for token scoped to multiple > tenants.
I'm not sure I'm following you there. I don't see how unscoped tokens obviate the need to scope to multiple tenants, these may be driven by different concerns. Again, I think we need to have some flexibility in how we scope tokens. The API should be flexible enough to support different models -- I think that scoping a token to multiple tenants is useful in cases such as delegation -- where a single identity may be issued revokable access to a set of resources in multiple projects. > > - joe > > > On Nov 13, 2012, at 9:17 AM, David Chadwick <[email protected]> wrote: >> Hi Guang >> >> On 13/11/2012 16:14, Yee, Guang wrote: >>> An unscoped token is basically implicitly scoped to Keystone service right? >>> One should be able to use an unscoped token to reset his password, and ask >>> Keystone for information pertaining to himself, such as what are his roles, >>> what services/endpoints are available to him, and what are his tenants, etc. >>> This is helpful for administration UIs such as MC. >> >> agreed >> >>> There's a blueprint to address the need to scope the token down to the >>> service or endpoint level. Basically, service and endpoint isolation. >> >> I have read your blueprint and I have some comments/questions on it. How do >> you want these to be addressed? By email, or by edits to you blueprint? >> >> regards >> >> David >> >>> >>> https://blueprints.launchpad.net/keystone/+spec/service-isolation-and-roles- >>> delegation >>> http://wiki.openstack.org/Keystone/Service-Isolation-And-Roles-Delegation >>> >>> It also addresses the intricacies of role delegation, which should be very >>> beneficial for cloud services. >>> >>> >>> >>> Guang >>> >>> >>> >>> -----Original Message----- >>> From: [email protected] >>> [mailto:[email protected]] On Behalf Of >>> David Chadwick >>> Sent: Tuesday, November 13, 2012 7:32 AM >>> To: Adam Young >>> Cc: OpenStack Development Mailing List; [email protected] >>> Subject: Re: [Openstack] [openstack-dev] Fwd: [keystone] Tokens representing >>> authorization to projects/tenants in the Keystone V3 API >>> >>> Hi Adam >>> >>> you have pointed out an important difference between an unscoped token >>> and a scoped one. The former can only be used with keystone, the latter >>> with a cloud service. This also implies that a scoped token can only >>> have the scope of a single service, and not multiple services. The user >>> must swap the unscoped token for a set of scoped tokens if he wishes to >>> access a set of cloud services. >>> >>> This model is clean and consistent. >>> >>> Concerning your attack scenario, then the best point of attack is either >>> the client (steal his token(s)) or Keystone (get access to any service) >>> >>> regards >>> >>> David >>> >>> On 13/11/2012 14:38, Adam Young wrote: >>>> On 11/10/2012 10:58 AM, David Chadwick wrote: >>>>> I agree with the vast majority of what Jorge says below. The idea I >>>>> would like to bounce around is that of the unscoped token. >>>>> >>>>> What does it mean conceptually? What is its purpose? Why do we need >>>>> it? Why should a user be given an unscoped token to exchange at a >>>>> later time for a scoped token? >>>>> >>>>> My view is as follows: >>>>> i) a user is authenticated and identified, and from this, keystone can >>>>> see that the user has access to a number of different tenants and >>>>> services. Keystone creates an unscoped token to encapsulate this. Note >>>>> that the unscoped token is scoped to the services/tenants available to >>>>> this user, and consequently it is different for each identified user. >>>>> Thus it does have some scope i.e. it cannot be swapped for access to >>>>> any service by any tenant. >>>>> ii) the user must choose which service/tenant he wishes to activate. >>>>> This is in line with the principle of least privileges. >>>>> iii) the user informs keystone which service(s) and tenant(s) he >>>>> wishes to access and Keystone swaps the unscoped token for one that is >>>>> scoped to the choice of the user. >>>>> >>>>> The issue then becomes, what is the allowable scope of a scoped token? >>>>> Jorge below believes it should cover multiple >>>>> services/endpoints/tenants. So one must then ask, what is the >>>>> difference between the most widely scoped scoped-token and the >>>>> unscoped token? Surely they will have the same scope won't they? In >>>>> which case there is no need for both concepts. >>>> >>>> let's compare with Kerberos: In my view an unscoped token is >>>> comparaable with a ticket granting ticket: it cannot be used with any >>>> service other than the KDC, and it can only be used to get service >>>> tickets. A service ticket can only be used with a specific service. If >>>> that service gets compromised, any tickets it has are useless for access >>>> to other resources. >>>> >>>> >>>> If an unscoped token can be used against a wide array of services, we >>>> have just provided a path for an elevation of privileges attack. If I >>>> know that a service consumes tokens which can be used on a wide number >>>> of other services, I can target my attacks against that service in order >>>> to get access everywhere. >>>> >>>> If we are going to provide this functionality, it should be turned off >>>> by default. >>>> >>>>> >>>>> Comments please >>>>> >>>>> regards >>>>> >>>>> David >>>>> >>>>> On 23/10/2012 06:25, Jorge Williams wrote: >>>>>> Here's my view: >>>>>> >>>>>> On making the default token a configuration option: Like the idea. >>>>>> Disabling the option by default. That's fine too. >>>>>> >>>>>> On scoping a token to a specific endpoint: That's fine, though I >>>>>> believe that that's in the API today. Currently, the way that we scope >>>>>> tokens to endpoints is by validating against the service catalog. I'm >>>>>> not sure if the default middleware checks for this yet, but the Repose >>>>>> middleware does. If you try to use a token in an endpoint that's not in >>>>>> the service catalog the request fails -- well, if the check is turned >>>>>> on. >>>>>> >>>>>> Obviously, I'd like the idea of scoping a single token to multiple >>>>>> tenants / endpoints. >>>>>> >>>>>> I don't like the idea of calling tokens "sloppy tokens" -- it's >>>>>> confusing. All you have to say is that a token has a scope -- and the >>>>>> scope of the token is the set of resources that the token can provide >>>>>> access to. You can limit the scope of a token to a tenant, to a >>>>>> endpoint, to a set of endpoints or tenants etc -- what limits you place >>>>>> on the scope of an individual token should be up to the operator. >>>>>> >>>>>> Keep in mind that as we start digging into delegation and fine grained >>>>>> authorization (after Grizzly, I'm sure), we'll end up with tokens that >>>>>> have a scope of a subset of resources in a single or multiple tenants. >>>>>> So calling them sloppy now is just confusing. Simply stating that a >>>>>> token has a scope (as I've defined above) should suffice. This is part >>>>>> of the reason why I've never liked the term "unscoped" token, because an >>>>>> unscoped token does have a scope. It just so happens that the scope of >>>>>> that token is the resource that provides a list of available tenants. >>>>>> >>>>>> -jOrGe W. >>>>>> >>>>>> On Oct 22, 2012, at 9:57 PM, Adam Young wrote: >>>>>> >>>>>>> Are you guys +1 ing the original Idea, my suggestion to make it >>>>>>> optional, the fact that I think we should call these sloppy tokens? >>>>>>> >>>>>>> On 10/22/2012 03:40 PM, Jorge Williams wrote: >>>>>>>> +1 here too. >>>>>>>> >>>>>>>> At the end of the day, we'd like the identity API to be flexible >>>>>>>> enough to allow the token to be scoped in a manner that the deployer >>>>>>>> sees fit. What the keystone implementation does by default is a >>>>>>>> different matter -- and disabling multiple tenant scope by default >>>>>>>> would be fine by me. >>>>>>>> >>>>>>>> -jOrGe W. >>>>>>>> >>>>>>>> >>>>>>>> On Oct 21, 2012, at 11:10 AM, Joe Savak wrote: >>>>>>>> >>>>>>>>> +1. ;) >>>>>>>>> >>>>>>>>> So the issue is that the v2 API contract allows a token to be scoped >>>>>>>>> to multiple tenants. For v3, I'd like to have the same flexibility. >>>>>>>>> I don't see security issues, as if a token were to be sniffed you >>>>>>>>> can change the password of the account using it and use those creds >>>>>>>>> to scope tokens to any tenant you wish. >>>>>>> Scope should always be kept as limited as possible. Personally, I >>>>>>> don't feel like limiting the tenant list makes much difference. THe >>>>>>> more I think about it, the real benefit comes from limiting the >>>>>>> endpoints. >>>>>>> >>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Oct 20, 2012, at 21:07, "Adam Young" <[email protected] >>>>>>>>> <mailto:[email protected]>> wrote: >>>>>>>>> >>>>>>>>>> On 10/20/2012 01:50 PM, heckj wrote: >>>>>>>>>>> I sent this to the openstack-dev list, and thought I'd double post >>>>>>>>>>> this onto the openstack list at Launchpad for additional feedback. >>>>>>>>>>> >>>>>>>>>>> -joe >>>>>>>>>>> >>>>>>>>>>> Begin forwarded message: >>>>>>>>>>>> *From: *heckj <[email protected] <mailto:[email protected]>> >>>>>>>>>>>> *Subject: **[openstack-dev] [keystone] Tokens representing >>>>>>>>>>>> authorization to projects/tenants in the Keystone V3 API* >>>>>>>>>>>> *Date: *October 19, 2012 1:51:16 PM PDT >>>>>>>>>>>> *To: *OpenStack Development Mailing List >>>>>>>>>>>> <[email protected] >>>>>>>>>>>> <mailto:[email protected]>> >>>>>>>>>>>> *Reply-To: *OpenStack Development Mailing List >>>>>>>>>>>> <[email protected] >>>>>>>>>>>> <mailto:[email protected]>> >>>>>>>>>>>> >>>>>>>>>>>> The topic of what a token can or can't represent for the upcoming >>>>>>>>>>>> V3 Keystone API came up - and I wanted to share the conversation >>>>>>>>>>>> a bit more broadly to get feedback. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> A bit of history: >>>>>>>>>>>> >>>>>>>>>>>> In the V2 API, when you authenticated with just a username and >>>>>>>>>>>> password, the token that was provided wasn't entirely clearly >>>>>>>>>>>> defined. The reference implementation that Keystone used was to >>>>>>>>>>>> create what's been called an 'unscoped' token - which was >>>>>>>>>>>> generally limited to only being able to get a list of possible >>>>>>>>>>>> tenants/projects and the capability of getting a token specific >>>>>>>>>>>> to a user & tenant/project (what's been called a "scoped" token) >>>>>>>>>>>> >>>>>>>>>>>> Likewise, the reference implementation of the rest of the >>>>>>>>>>>> OpenStack projects all require a tenant information to be >>>>>>>>>>>> included within the token as that token was the identity refernce >>>>>>>>>>>> inforoamtion - and most OpenStack services were wanting to know >>>>>>>>>>>> the tenant associated with the token for authorization/ownership >>>>>>>>>>>> purposes. >>>>>>>>>>>> >>>>>>>>>>>> Apparently Rackspace's internal implementation provided a token >>>>>>>>>>>> that was immediately valid for all possible tenants to which the >>>>>>>>>>>> user was associated, and presumably their internal >>>>>>>>>>>> implementations of openstack do whatever work is appropriate to >>>>>>>>>>>> discern and provide that information to the various openstack >>>>>>>>>>>> services. >>>>>>>>>>>> >>>>>>>>>>>> The quandary: >>>>>>>>>>>> >>>>>>>>>>>> In the V3 API, we started off with, and currently define the >>>>>>>>>>>> token as being specifically mandated to a single tenant, with a >>>>>>>>>>>> new requirement that if you authorize with just a username and >>>>>>>>>>>> password, a "default tenant" is used. If for some reason you have >>>>>>>>>>>> no tenant associated with the userid, the authorization is to be >>>>>>>>>>>> refused. If the user is associated with more than one >>>>>>>>>>>> tenant/project, it's possible to use the token to get a list of >>>>>>>>>>>> other tenants/projects and request a new token specific to one of >>>>>>>>>>>> those other tenant/projects, but the implementation is expected >>>>>>>>>>>> to respect and provide a default. >>>>>>>>>> >>>>>>>>>> I would like to make "default tenant" a configuration option, and >>>>>>>>>> have it disabled by default. Unscoped tokens are a very useful >>>>>>>>>> construct. In the case where the user has many roles across a >>>>>>>>>> multitude of projects, it is possible to create huge tokens. I >>>>>>>>>> would prefer unscoped tokens to remain, and to be associated with >>>>>>>>>> no tenant. The only operation Keystone should provide with them is >>>>>>>>>> the ability to enumerate tenants, so something like Horizon can >>>>>>>>>> then request an appropriately scoped token. >>>>>>>>>> >>>>>>>>>> I am also in favor of limiting the scope of a token to an >>>>>>>>>> endpoint. Even more-so than tenants, scoping a token to an end >>>>>>>>>> point increases security. Once a token has been scoped to an >>>>>>>>>> endpoint, it can only be used on that endpoint. If an endpoint >>>>>>>>>> gets compromised, the damage is limited to resources that endpoint >>>>>>>>>> already has access to. This, in conjunction with pre-auths, could >>>>>>>>>> allow a user to perform an action with a minimum of risk in a >>>>>>>>>> public cloud environment. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> A few folks from Rackspace touched on this at the very tail end >>>>>>>>>>>> of the V3 API review session on Thursday, bringing up that they >>>>>>>>>>>> had an issue with the token being scoped to a single tenant. >>>>>>>>>>>> Since this has significant implications to both security and a >>>>>>>>>>>> potential user experience flow, I wanted to bring the issue up >>>>>>>>>>>> across the broader community for discussion. >>>>>>>>>>>> >>>>>>>>>>>> The request outstanding: >>>>>>>>>>>> >>>>>>>>>>>> Rackspace folks are requesting that the token not be limited to a >>>>>>>>>>>> single tenant/project, but instead provides a list of potential >>>>>>>>>>>> tenants against which the token should be considered valid. >>>>>>>>>> I would like the world to know that we are affectionately calling >>>>>>>>>> such tokens "sloppy tokens" and Joe Savak has adopted the nickname >>>>>>>>>> of "Sloppy Joe" for championing them. Allowing it as an option is >>>>>>>>>> fine, but I would not recommend that this become the norm, or that >>>>>>>>>> we enable this feature by default. >>>>>>>>>>>> >>>>>>>>>>>> Brief (maybe shoddy) analysis: >>>>>>>>>>>> >>>>>>>>>>>> This would potentially imply changes to what gets passed as a >>>>>>>>>>>> part of the authentication reference in the context passed using >>>>>>>>>>>> auth_token middleware - multiple tenants possible instead of the >>>>>>>>>>>> currently expected single value - so using that as information >>>>>>>>>>>> for create() style mechanisms would need to provide some >>>>>>>>>>>> alternative means of clearly defining what tenant/project should >>>>>>>>>>>> be owner. It would provide anyone compromising that particular >>>>>>>>>>>> token with a broader spectrum of impact on a replay style attack. >>>>>>>>>>>> Likewise, the impact of tenant enable/disable or role changes >>>>>>>>>>>> would necessarily mean a broader invalidation of all tokens >>>>>>>>>>>> associated with the user. >>>>>>>>>>>> >>>>>>>>>>>> On the flip side, it has the potential to remove the >>>>>>>>>>>> token-reissuance that currently exists when switching contexts >>>>>>>>>>>> from one project to another (primarily through horizon or other >>>>>>>>>>>> client/UI/dashboard mechanisms that cache the token). >>>>>>>>>>>> >>>>>>>>>>>> Feedback and Input desired! >>>>>>>>>>>> >>>>>>>>>>>> -joe >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>> OpenStack-dev mailing list >>>>>>>>>>>> [email protected] >>>>>>>>>>>> <mailto:[email protected]> >>>>>>>>>>>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> _______________________________________________ >>>>>>>>>>> Mailing list:https://launchpad.net/~openstack >>>>>>>>>>> Post to :[email protected] >>>>>>>>>>> Unsubscribe :https://launchpad.net/~openstack >>>>>>>>>>> More help :https://help.launchpad.net/ListHelp >>>>>>>>>> >>>>>>>>>> _______________________________________________ >>>>>>>>>> Mailing list: https://launchpad.net/~openstack >>>>>>>>>> <https://launchpad.net/%7Eopenstack> >>>>>>>>>> Post to : [email protected] >>>>>>>>>> <mailto:[email protected]> >>>>>>>>>> Unsubscribe : https://launchpad.net/~openstack >>>>>>>>>> <https://launchpad.net/%7Eopenstack> >>>>>>>>>> More help : https://help.launchpad.net/ListHelp >>>>>>>>> _______________________________________________ >>>>>>>>> Mailing list: https://launchpad.net/~openstack >>>>>>>>> <https://launchpad.net/%7Eopenstack> >>>>>>>>> Post to : [email protected] >>>>>>>>> <mailto:[email protected]> >>>>>>>>> Unsubscribe : https://launchpad.net/~openstack >>>>>>>>> <https://launchpad.net/%7Eopenstack> >>>>>>>>> More help : https://help.launchpad.net/ListHelp >>>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> OpenStack-dev mailing list >>>>>> [email protected] >>>>>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >>>>>> >>>> >>> >>> _______________________________________________ >>> Mailing list: https://launchpad.net/~openstack >>> Post to : [email protected] >>> Unsubscribe : https://launchpad.net/~openstack >>> More help : https://help.launchpad.net/ListHelp >>> >> >> _______________________________________________ >> Mailing list: https://launchpad.net/~openstack >> Post to : [email protected] >> Unsubscribe : https://launchpad.net/~openstack >> More help : https://help.launchpad.net/ListHelp > > > _______________________________________________ > OpenStack-dev mailing list > [email protected] > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev _______________________________________________ Mailing list: https://launchpad.net/~openstack Post to : [email protected] Unsubscribe : https://launchpad.net/~openstack More help : https://help.launchpad.net/ListHelp

