|  | ============================ | 
|  | Deploying DevStack with LDAP | 
|  | ============================ | 
|  |  | 
|  | The OpenStack Identity service has the ability to integrate with LDAP. The goal | 
|  | of this guide is to walk you through setting up an LDAP-backed OpenStack | 
|  | development environment. | 
|  |  | 
|  | Introduction | 
|  | ============ | 
|  |  | 
|  | LDAP support in keystone is read-only. You can use it to back an entire | 
|  | OpenStack deployment to a single LDAP server, or you can use it to back | 
|  | separate LDAP servers to specific keystone domains. Users within those domains | 
|  | can authenticate against keystone, assume role assignments, and interact with | 
|  | other OpenStack services. | 
|  |  | 
|  | Configuration | 
|  | ============= | 
|  |  | 
|  | To deploy an OpenLDAP server, make sure ``ldap`` is added to the list of | 
|  | ``ENABLED_SERVICES`` in the ``local.conf`` file:: | 
|  |  | 
|  | enable_service ldap | 
|  |  | 
|  | Devstack will require a password to set up an LDAP administrator. This | 
|  | administrative user is also the bind user specified in keystone's configuration | 
|  | files, similar to a ``keystone`` user for MySQL databases. | 
|  |  | 
|  | Devstack will prompt you for a password when running ``stack.sh`` if | 
|  | ``LDAP_PASSWORD`` is not set. You can add the following to your | 
|  | ``local.conf``:: | 
|  |  | 
|  | LDAP_PASSWORD=super_secret_password | 
|  |  | 
|  | At this point, devstack should have everything it needs to deploy OpenLDAP, | 
|  | bootstrap it with a minimal set of users, and configure it to back to a domain | 
|  | in keystone. You can do this by running the ``stack.sh`` script:: | 
|  |  | 
|  | $ ./stack.sh | 
|  |  | 
|  | Once ``stack.sh`` completes, you should have a running keystone deployment with | 
|  | a basic set of users. It is important to note that not all users will live | 
|  | within LDAP. Instead, keystone will back different domains to different | 
|  | identity sources. For example, the ``default`` domain will be backed by MySQL. | 
|  | This is usually where you'll find your administrative and services users. If | 
|  | you query keystone for a list of domains, you should see a domain called | 
|  | ``Users``. This domain is set up by devstack and points to OpenLDAP. | 
|  |  | 
|  | User Management | 
|  | =============== | 
|  |  | 
|  | Initially, there will only be two users in the LDAP server. The ``Manager`` | 
|  | user is used by keystone to talk to OpenLDAP. The ``demo`` user is a generic | 
|  | user that you should be able to see if you query keystone for users within the | 
|  | ``Users`` domain. Both of these users were added to LDAP using basic LDAP | 
|  | utilities installed by devstack (e.g. ``ldap-utils``) and LDIFs. The LDIFs used | 
|  | to create these users can be found in ``devstack/files/ldap/``. | 
|  |  | 
|  | Listing Users | 
|  | ------------- | 
|  |  | 
|  | To list all users in LDAP directly, you can use ``ldapsearch`` with the LDAP | 
|  | user bootstrapped by devstack:: | 
|  |  | 
|  | $ ldapsearch -x -w LDAP_PASSWORD -D cn=Manager,dc=openstack,dc=org \ | 
|  | -H ldap://localhost -b dc=openstack,dc=org | 
|  |  | 
|  | As you can see, devstack creates an OpenStack domain called ``openstack.org`` | 
|  | as a container for the ``Manager`` and ``demo`` users. | 
|  |  | 
|  | Creating Users | 
|  | -------------- | 
|  |  | 
|  | Since keystone's LDAP integration is read-only, users must be added directly to | 
|  | LDAP. Users added directly to OpenLDAP will automatically be placed into the | 
|  | ``Users`` domain. | 
|  |  | 
|  | LDIFs can be used to add users via the command line. The following is an | 
|  | example LDIF that can be used to create a new LDAP user, let's call it | 
|  | ``peter.ldif.in``:: | 
|  |  | 
|  | dn: cn=peter,ou=Users,dc=openstack,dc=org | 
|  | cn: peter | 
|  | displayName: Peter Quill | 
|  | givenName: Peter Quill | 
|  | mail: starlord@openstack.org | 
|  | objectClass: inetOrgPerson | 
|  | objectClass: top | 
|  | sn: peter | 
|  | uid: peter | 
|  | userPassword: im-a-better-pilot-than-rocket | 
|  |  | 
|  | Now, we use the ``Manager`` user to create a user for Peter in LDAP:: | 
|  |  | 
|  | $ ldapadd -x -w LDAP_PASSWORD -D cn=Manager,dc=openstack,dc=org \ | 
|  | -H ldap://localhost -c -f peter.ldif.in | 
|  |  | 
|  | We should be able to assign Peter roles on projects. After Peter has some level | 
|  | of authorization, he should be able to login to Horizon by specifying the | 
|  | ``Users`` domain and using his ``peter`` username and password. Authorization | 
|  | can be given to Peter by creating a project within the ``Users`` domain and | 
|  | giving him a role assignment on that project:: | 
|  |  | 
|  | $ openstack project create --domain Users awesome-mix-vol-1 | 
|  | +-------------+----------------------------------+ | 
|  | | Field       | Value                            | | 
|  | +-------------+----------------------------------+ | 
|  | | description |                                  | | 
|  | | domain_id   | 61a2de23107c46bea2d758167af707b9 | | 
|  | | enabled     | True                             | | 
|  | | id          | 7d422396d54945cdac8fe1e8e32baec4 | | 
|  | | is_domain   | False                            | | 
|  | | name        | awesome-mix-vol-1                | | 
|  | | parent_id   | 61a2de23107c46bea2d758167af707b9 | | 
|  | | tags        | []                               | | 
|  | +-------------+----------------------------------+ | 
|  | $ openstack role add --user peter --user-domain Users \ | 
|  | --project awesome-mix-vol-1 --project-domain Users admin | 
|  |  | 
|  |  | 
|  | Deleting Users | 
|  | -------------- | 
|  |  | 
|  | We can use the same basic steps to remove users from LDAP, but instead of using | 
|  | LDIFs, we can just pass the ``dn`` of the user we want to delete:: | 
|  |  | 
|  | $ ldapdelete -x -w LDAP_PASSWORD -D cn=Manager,dc=openstack,dc=org \ | 
|  | -H ldap://localhost cn=peter,ou=Users,dc=openstack,dc=org | 
|  |  | 
|  | Group Management | 
|  | ================ | 
|  |  | 
|  | Like users, groups are considered specific identities. This means that groups | 
|  | also fall under the same read-only constraints as users and they can be managed | 
|  | directly with LDAP in the same way users are with LDIFs. | 
|  |  | 
|  | Adding Groups | 
|  | ------------- | 
|  |  | 
|  | Let's define a specific group with the following LDIF:: | 
|  |  | 
|  | dn: cn=guardians,ou=UserGroups,dc=openstack,dc=org | 
|  | objectClass: groupOfNames | 
|  | cn: guardians | 
|  | description: Guardians of the Galaxy | 
|  | member: cn=peter,dc=openstack,dc=org | 
|  | member: cn=gamora,dc=openstack,dc=org | 
|  | member: cn=drax,dc=openstack,dc=org | 
|  | member: cn=rocket,dc=openstack,dc=org | 
|  | member: cn=groot,dc=openstack,dc=org | 
|  |  | 
|  | We can create the group using the same ``ldapadd`` command as we did with | 
|  | users:: | 
|  |  | 
|  | $ ldapadd -x -w LDAP_PASSWORD -D cn=Manager,dc=openstack,dc=org \ | 
|  | -H ldap://localhost -c -f guardian-group.ldif.in | 
|  |  | 
|  | If we check the group membership in Horizon, we'll see that only Peter is a | 
|  | member of the ``guardians`` group, despite the whole crew being specified in | 
|  | the LDIF. Once those accounts are created in LDAP, they will automatically be | 
|  | added to the ``guardians`` group. They will also assume any role assignments | 
|  | given to the ``guardians`` group. | 
|  |  | 
|  | Deleting Groups | 
|  | --------------- | 
|  |  | 
|  | Just like users, groups can be deleted using the ``dn``:: | 
|  |  | 
|  | $ ldapdelete -x -w LDAP_PASSWORD -D cn=Manager,dc=openstack,dc=org \ | 
|  | -H ldap://localhost cn=guardians,ou=UserGroups,dc=openstack,dc=org | 
|  |  | 
|  | Note that this operation will not remove users within that group. It will only | 
|  | remove the group itself and the memberships any users had with that group. |