[Openstack] [Keystone] Splitting the Identity Backend

David Chadwick d.w.chadwick at kent.ac.uk
Tue May 21 10:18:21 UTC 2013


Hi Adam

I would propose splitting the backend into two conceptually distinct 
types of attributes, and then each of these high level types can be 
arbitrary split into different databases depending upon their sources of 
authority and who administers them. Your proposal would be just one 
specialisation of this more general model.

The high level distinction I would make is between (read only) identity 
attributes and (writable) authorisation attributes. The latter are the 
ones used by the OpenStack services for making access control decisions, 
whilst the former are never used or seen by the OpenStack services, but 
are used by organisations to identify and group users into different 
sets. So HR databases and LDAP servers typically store these identity 
attributes.

An attribute mapping function is needed to map between the former and 
the latter.

We can then organise the user login function as follows:

1. A user logs in and is identified and authenticated, and a set of 
identity attributes are assigned to him by the authentication function. 
This could be from a read only LDAP service, or by a federated IDP. It 
should be pluggable and installation dependent. It could even  be done 
by the user presenting an X.509 certificate and the information 
extracted from it. This part of Keystone should be highly flexible and 
adaptable to suit different deployment models.

2. The attribute mapping function maps from his identity attributes to 
his authz attributes. This can be a null mapping function if needed e.g. 
if the read only backend LDAP happens to store the users OpenStack 
projects and roles. But in most cases it will not be null. The mappings 
are set up by the Keystone administrator.

3. The users authz attributes are stored in his Keystone entry, which 
must be a writeable database owned by Keystone. Each time the user 
logins, his authz attributes will be updated to match his current 
identity attributes. So if an organisation promotes an employee, and 
changes his LDAP attributes, this could have the effect of automatically 
escalating his rights in Openstack. Conversely, if an employee is 
demoted, his rights in OpenStack could be automatically downgraded. It 
would all depend upon what the mapping rules were ie. whether they were 
fixed to a user's login ID (in which case his authz attributes would not 
change) or whether they depended upon his roles in his organisation (in 
which case they would automatically change).

4. The token is created based on his authz attributes as now, and 
everything continues as now.

So taking the current mix of identity attributes that you identify 
below, they would be split as follows

Domains, Roles, and Projects would be stored in Keystone's writeable 
database (as they are authz attributes)
Groups and User Names (and Passwords) would be stored in the read only 
identity databases.
Role assignments would be done by the attribute mapping function.

If you want to split Domains into their own separate Keystone database, 
this fine, it does not effect the overall model. So, your proposal fits 
into this high level model, but this high level model provides much more 
flexibility to implementers and will allow for future expansion

regards

David

On 20/05/2013 17:46, Adam Young wrote:
> Currently, the Identity backend  has Domains, Users , Groups, Roles,
> Role Assignments and Projects.  I've proposed splitting it into 3
> distinct pieces.  Domain, Identity, and Projects.
>
> Here is the rationale:
>
> Somewhere between a third and a half of the OpenStack deployments are
> using LDAP.  However, the mapping from LDAP to Identity does not work.
> LDAP is almost always a read only  datasource.   While Keystone *can*
> manage these, it should also be possible to treat the users and groups
> piece as externally managed.
>
> In addition, several organizations have multiple LDAP servers. Not a
> huge number of servers,  but more than one is a very common scenario due
> to a merger.  Each of these should map to a domain. Thus, domain
> management has to be extracted out of the LDAP backend.
>
> Identity would contain users and groups.  Projects would contain
> Projects, Roles, and Role Assignments.  Domains would contain only domains.
>
> For people happily deploying SQL, nothing should change.  A single
> Database instance can still serve all three backends.  It should only
> mean removing some foreign key constraints.
>
> For people that are deploying the current LDAP code and are happy with
> the layout, we will continue to support the LDAP Project backend.
>
>
> Say an organization has two LDAP servers, and also maintains a public
> facing cloud backed by SQL.  Each of the two LDAP servers would have
> configurations that correspond to the current layout, although limited
> only to the user and group subtrees.  The domain registry  would live in
> the SQL backend.  It would have two entries for the LDAP servers, and
> these would be immutable.  Dynamic domain allocation and deletion would
> work only for the domains backed by SQL.
>
>
>
> The main blueprint for this is:
> https://blueprints.launchpad.net/keystone/+spec/split-identity
> with supporting blueprints for pieces that can be completed
> interdependently.
>
> Comments welcome.
>
> _______________________________________________
> Mailing list: https://launchpad.net/~openstack
> Post to     : openstack at lists.launchpad.net
> Unsubscribe : https://launchpad.net/~openstack
> More help   : https://help.launchpad.net/ListHelp




More information about the Openstack mailing list