使用 LDAP 部署 DevStack¶
OpenStack Identity 服务具有与 LDAP 集成的能力。本指南的目标是引导您设置一个基于 LDAP 的 OpenStack 开发环境。
介绍¶
keystone 中的 LDAP 支持是只读的。您可以使用它将整个 OpenStack 部署备份到单个 LDAP 服务器,或者可以使用它将单独的 LDAP 服务器备份到特定的 keystone 域。这些域内的用户可以对 keystone 进行身份验证,承担角色分配,并与其他的 OpenStack 服务进行交互。
配置¶
要部署 OpenLDAP 服务器,请确保将 ldap 添加到 local.conf 文件中的 ENABLED_SERVICES 列表
enable_service ldap
Devstack 需要一个密码来设置 LDAP 管理员。该管理用户也是 keystone 配置文件中指定的 bind 用户,类似于 MySQL 数据库的 keystone 用户。
如果未设置 LDAP_PASSWORD,Devstack 会在运行 stack.sh 时提示您输入密码。您可以将以下内容添加到您的 local.conf 中
LDAP_PASSWORD=super_secret_password
此时,devstack 应该拥有部署 OpenLDAP、使用最少数量的用户进行引导,并将其配置为备份到 keystone 中的一个域所需的一切。您可以通过运行 stack.sh 脚本来执行此操作
$ ./stack.sh
一旦 stack.sh 完成,您应该拥有一个正在运行的 keystone 部署,其中包含一组基本的用户。重要的是要注意,并非所有用户都将存在于 LDAP 中。相反,keystone 将不同的域备份到不同的身份源。例如,default 域将由 MySQL 备份。通常,您会在其中找到您的管理和用户服务。如果您查询 keystone 以获取域列表,您应该会看到一个名为 Users 的域。该域由 devstack 设置,并指向 OpenLDAP。
用户管理¶
最初,LDAP 服务器中只有两个用户。 Manager 用户由 keystone 用于与 OpenLDAP 通信。 demo 用户是一个通用用户,如果您查询 keystone 以获取 Users 域中的用户,您应该能够看到它。这两个用户都使用 devstack 安装的基本 LDAP 实用程序(例如 ldap-utils)和 LDIF 添加到 LDAP。用于创建这些用户的 LDIF 可以在 devstack/files/ldap/ 中找到。
列出用户¶
要直接列出 LDAP 中的所有用户,您可以使用由 devstack 引导的 LDAP 用户使用 ldapsearch
$ ldapsearch -x -w LDAP_PASSWORD -D cn=Manager,dc=openstack,dc=org \
-H ldap:// -b dc=openstack,dc=org
如您所见,devstack 创建了一个名为 openstack.org 的 OpenStack 域,作为 Manager 和 demo 用户的容器。
创建用户¶
由于 keystone 的 LDAP 集成是只读的,因此必须直接将用户添加到 LDAP。直接添加到 OpenLDAP 的用户将自动放置到 Users 域。
可以使用 LDIF 通过命令行添加用户。以下是一个可用于创建新 LDAP 用户的示例 LDIF,我们称之为 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
现在,我们使用 Manager 用户在 LDAP 中为 Peter 创建一个用户
$ ldapadd -x -w LDAP_PASSWORD -D cn=Manager,dc=openstack,dc=org \
-H ldap:// -c -f peter.ldif.in
我们应该能够将 Peter 的角色分配到项目。在 Peter 获得一定程度的授权后,他应该能够通过指定 Users 域并使用他的 peter 用户名和密码登录到 Horizon。
$ 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
删除用户¶
我们可以使用相同的基本步骤从 LDAP 中删除用户,但不是使用 LDIF,我们可以只传递我们想要删除的用户的 dn
$ ldapdelete -x -w LDAP_PASSWORD -D cn=Manager,dc=openstack,dc=org \
-H ldap:// cn=peter,ou=Users,dc=openstack,dc=org
组管理¶
与用户一样,组被认为是特定的身份。这意味着组也受到与用户相同的只读约束,并且可以使用 LDIF 以相同的方式直接使用 LDAP 进行管理。
添加组¶
让我们定义一个具有以下 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
我们可以使用与我们使用用户时相同的 ldapadd 命令来创建该组
$ ldapadd -x -w LDAP_PASSWORD -D cn=Manager,dc=openstack,dc=org \
-H ldap:// -c -f guardian-group.ldif.in
如果我们在 Horizon 中检查组 membership,我们会看到只有 Peter 是 guardians 组的成员,尽管 LDIF 中指定了整个 crew。一旦这些帐户在 LDAP 中创建,它们将自动添加到 guardians 组。他们还将承担分配给 guardians 组的任何角色分配。
删除组¶
与用户一样,可以使用 dn 删除组
$ ldapdelete -x -w LDAP_PASSWORD -D cn=Manager,dc=openstack,dc=org \
-H ldap:// cn=guardians,ou=UserGroups,dc=openstack,dc=org
请注意,此操作不会删除该组中的用户。它只会删除该组本身以及任何用户与该组的 membership。