<br><div class="gmail_extra"><div class="gmail_quote">On Fri, Nov 30, 2012 at 8:53 AM, Adam Young <span dir="ltr"><<a href="mailto:ayoung@redhat.com" target="_blank">ayoung@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On 11/28/2012 11:05 AM, David Chadwick wrote:<br>
</div><div class="im"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Adam<br>
<br>
I have seen your spec and commented on it. This is yet another case of delegation is it not?<br>
</blockquote></div>
OK, we've had a long discussion on this, and I think I can clarify.<br>
<br>
1. We've used "delegation" to mean many things. I was using it to mean delegation from one Keystone server to another, in a(n) hierarchy. Maybe I am showing the effects of my time in the Army, but to me delegation is something that goes down from superiod to subordinate.<br>
</blockquote><div><br></div><div>Federation?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
2. There are two related Legal terms I considered: Proxy and Trusts. I ruled out the term "Proxy" due to its compete overuse.<br>
<br>
3. Regardless of whether we call it delegation or trust, we are discussing the same thing.<br></blockquote><div><br></div><div>The concept is "delegating authorization to trusted entities," no? Modeling it in the API as a "trust" between "users" sounds fine to me.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
>From David Chadwich"<br>
<br>
"Keystone is the Delegation Service that handles all the delegations for users. It is trusted to ensure that<br>
<br>
i) a delegator cannot delegate an attribute he has not already been assigned<br>
ii) a delegator cannot delegate once the delegation depth has been consumed<br>
iv) a delegator cannot delegate outside the validity period of his own delegation.<br>
<br>
In other words, a delegator can only delegate less than (or equal to) what he already has, and not more than it. "<br>
<br>
I think that is a great prelude to the design discussion.<br>
<br>
Right now, a user delegates in a short term fashion using tokens. Once a token has been granted to a user, he hands that off to another (service) user in order to prove his identity and authorization to perform some set of actions. In addition, since tokens are not scoped to a specific endpoint, they are currently passed on from one endpoint to another. This is not a secure approach. If any endpoint along the way is compromised, all the tokens in that endpoint are usable against any other service that accepts tokens.<br>
<br>
So we limit the scope of tokens to only that single endpoint, and we remove the attack. As a result, we also remove the ability of the remote service user to request additional operations from additional remote services on behalf of the original user. This is a problem that the trusts are designed to serve.<br>
<br>
A trust is a promise to allow delegation at some point in the future. The actual delegation is performed in the token. The trust is used to get the token.<br>
<br>
Now, as far as implementation goes, I would like to propose two phases.<br>
<br>
1. Trusts get implemented today "hard wired" with the attributes that are currently exposed in a token: (trustor) user, tenant, roles, endpoints.<br>
2. Tokens that get generated from the trusts will look just like normal tokens. They will have an additional field "trustee". This will allow the current consumers of tokens to continue to use a trust token just like they do now.<br>
<br>
Phase 2.<br>
1. Modify the token architecture to allow arbitrary sets of attributes.<br>
2. Modify the trust architecture to specify arbitrary sets of attributes to be used in a token.<br>
<br>
<br>
<br>
Regarding my original question, I am going to move the trust driver into the token back end. It has become apparent that this is where it belongs, as it has the exact same dependencies and usage patterns as the tokens, and it is the Keystone "application specific" data.<div class="HOEnZb">
<div class="h5"><br>
<br>
<br>
<br>
<br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
regards<br>
<br>
David<br>
<br>
On 28/11/2012 15:45, Adam Young wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I have a very rudimentary Trust (what I used to call Preauth<br>
<a href="https://blueprints.launchpad.net/keystone/+spec/trusts" target="_blank">https://blueprints.launchpad.<u></u>net/keystone/+spec/trusts</a>) implementation<br>
working with the SQL backend for Identity.<br>
<br>
With LDAP, I am not sure where I would store the trust information. The<br>
data for the trust itself is simply the uuid user_ids for the trustor<br>
and trustee and tenant Id. There is also a table for the roles, and a<br>
second table for the endpoints associated with the trust.While we could<br>
shoehorn this into the user object, I am not sure that there is an<br>
intuitive way to implement it in LDAP.<br>
<br>
I see three choices.<br>
<br>
1. Leave the Trusts in the identity schema. This has the nice effect<br>
of keeping the user-ids as foreign keys. It has the drawback of forcing<br>
an LDAP backend solution.<br>
2. Move the Trusts into the Token backend. This will get avoid the<br>
issue of LDAP support. It does mean that tokens, which is a schema that<br>
is high volume, read intensive, and populated by short lifespan<br>
entities, gets mixed with trusts, which is low volume, and long lived.<br>
3. Move it into its own backend. This seems a little heavy weight.<br>
<br>
<br>
Thoughts?<br>
<br>
______________________________<u></u>_________________<br>
OpenStack-dev mailing list<br>
<a href="mailto:OpenStack-dev@lists.openstack.org" target="_blank">OpenStack-dev@lists.openstack.<u></u>org</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/<u></u>cgi-bin/mailman/listinfo/<u></u>openstack-dev</a><br>
</blockquote></blockquote>
<br>
<br>
______________________________<u></u>_________________<br>
OpenStack-dev mailing list<br>
<a href="mailto:OpenStack-dev@lists.openstack.org" target="_blank">OpenStack-dev@lists.openstack.<u></u>org</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/<u></u>cgi-bin/mailman/listinfo/<u></u>openstack-dev</a><br>
</div></div></blockquote></div><br></div>