开源OpenStack项目提供了一个基础架构即服务(IaaS)层,用于构建公共云和私有云。 公司,服务提供商,增值经销商,中小型企业,研究人员和全球数据中心都使用OpenStack来部署大型私有或公共云。
轻型目录访问协议(LDAP)是用于访问和管理目录信息的客户端/服务器协议。 许多企业应用程序使用LDAP作为用户身份验证的基础。 (LDAP的实现包括IBM®Tivoli®Directory Server,Microsoft®Active Directory和OpenLDAP。)本文显示了如何使集成OpenStack / LDAP环境示例快速启动并正确运行。 了解如何:
- 通过使用DevStack(用于构建OpenStack开发环境的工具)安装LDAP服务器。
- 通过Keystone的LDAP身份驱动程序将Keystone配置为使用已安装的LDAP服务器。
- 使用符合Keystone的树结构填充LDAP服务器。
- 使用Keystone的单元测试库来测试基于LDAP的Keystone服务。
另外,了解如何在不使用DevStack的情况下配置Keystone,以使用已经在生产环境中运行的LDAP服务器。
使用DevStack设置LDAP后端
从OpenStack的2013年4月Grizzly版本开始,您可以通过标准的OpenStack开发环境安装工具DevStack将LDAP设置为Keystone后端。 DevStack是一个维护良好并有文档证明的Shell脚本,用于构建完整的OpenStack开发环境。
下载DevStack并在devstack根目录中创建一个名为localrc的文件。 在localrc中为OpenStack配置用户自定义。 要使DevStack能够代表您安装LDAP服务器,请将ldap
添加到localrc中已启用服务的列表中。 例如:
ENABLED_SERVICES=key,n-api,n-crt,n-obj,n-cpu,n-net,n-cond,cinder,c-sch,
c-api,c-vol,n-sch,n-novnc,n-xvnc,n-cauth,horizon,mysql,rabbit,ldap
您还必须向localrc添加以下行,以通知DevStack您希望Keystone使用其LDAP后端身份驱动程序:
KEYSTONE_IDENTITY_BACKEND = ldap
如果您希望DevStack清除现有的Keystone LDAP树并重新开始,请将此行添加到localrc文件:
KEYSTONE_CLEAR_LDAP=yes
保存并关闭localrc。 现在从devstack根目录运行stack.sh脚本:
./stack.sh
脚本完成后,您可以看到:
- 已安装OpenLDAP。
- Keystone已配置为使用其LDAP后端身份驱动程序。
- 创建了一个初始的Keystone LDAP树,该树使用devstack \ files \ ldap \ openstack.ldif中的数据,如清单1所示:
清单1. openstack.ldif的内容
dn: dc=openstack,dc=org dc: openstack objectClass: dcObject objectClass: organizationalUnit ou: openstack dn: ou=Groups,dc=openstack,dc=org objectClass: organizationalUnit ou: Groups dn: ou=Users,dc=openstack,dc=org objectClass: organizationalUnit ou: Users dn: ou=Roles,dc=openstack,dc=org objectClass: organizationalUnit ou: Roles dn: ou=Projects,dc=openstack,dc=org objectClass: organizationalUnit ou: Projects dn: cn=9fe2ff9ee4384b1894a90878d3e92bab,ou=Roles,dc=openstack,dc=org objectClass: organizationalRole ou: _member_ cn: 9fe2ff9ee4384b1894a90878d3e92bab
LDAP树
Keystone LDAP后端身份驱动程序使用的示例架构假定如图1所示的树结构:
图1. Keystone LDAP后端身份驱动程序使用的示例架构
在图1的示例LDAP树中, Users
, UserGroups
, Projects
和Roles
都是使用标准LDAP ObjectClass
自己的子树。 在“ Users
子树中,例如, ObjectClass=inetOrgPerson
。
配置生产Keystone实例以使用现有的LDAP服务器
如果您的环境中已经安装了LDAP(并且您在不使用DevStack的情况下安装了Keystone实例),则可以直接将Keystone重新配置为使用其LDAP后端身份驱动程序,而不是默认SQL身份驱动程序。 为此,请修改keystone.conf文件中的值(默认情况下位于/ etc / keystone目录中):
- 在keystone.conf的
[identity]
部分中,将driver = keystone.identity.backends.sql.Identity
替换为driver = keystone.identity.backends.ldap.Identity
。 - 更新
[ldap]
部分以反映您的LDAP服务器配置。 清单2显示了一个示例:清单2. keystone.conf文件中的示例LDAP设置
[ldap] url = ldap://localhost user = dc=Manager,dc=openstack,dc=org password = yourpassword suffix = dc=openstack,dc=org user_tree_dn = ou=Users,dc=openstack,dc=org user_objectclass = inetOrgPerson user_id_attribute = cn user_mail_attribute = mail tenant_tree_dn = ou=Projects,dc=openstack,dc=org tenant_objectclass = groupOfNames tenant_id_attribute = cn tenant_desc_attribute = description use_dumb_member = True role_tree_dn = ou=Roles,dc=openstack, dc=org role_objectclass = organizationalRole role_id_attribute = cn role_member_attribute = roleOccupant
注意 :如果使用的是DevStack,则直接更新keystone.conf无效,因为每次运行stack.sh脚本时,DevStack都会自动生成一个新的keystone.conf文件。
单元测试LDAP代码
Keystone提供了几个文件,用于对基于LDAP的Keystone服务进行单元测试。 这些文件默认位于/ opt / stack / keystone / tests中,但run_tests.sh文件除外,该文件位于/ opt / stack / keystone /目录中。 这些文件是:
- tests_backend.py:包含适用于SQL和LDAP后端的测试。
- test_backend_ldap.py:包含特定于LDAP的测试。
- run_tests.sh:运行完整的回归测试。 在更新代码之前,请始终运行此文件。
- _ldap_livetest.py:进行特定于LDAP的代码更改的开发人员应通过运行此文件中的代码来使用实时LDAP测试更改。 此测试假定开发环境中已安装LDAP服务器(例如,OpenLDAP)。
- backend_liveldap.conf:提供运行实时LDAP测试所需的配置数据。 如果使用DevStack安装了LDAP,则可以通过设置正确的密码值按原样使用此文件。 如果您具有不同的LDAP配置,请确保此文件的配置数据反映您的LDAP配置。
- backend_ldap.conf:提供在没有LDAP服务器的情况下运行完整回归测试所需的配置数据。
接下来是一些测试示例。 在运行测试之前,请切换到Keystone安装目录(默认为/ opt / stack / keystone /)。
实时LDAP测试
要运行LDAP的实时测试:
./run_tests.sh _ldap_livetest.py
清单3显示了实时LDAP测试的示例输出:
清单3.实时LDAP测试的示例输出
LiveLDAPIdentity
test_add_duplicate_role_grant OK
test_add_role_grant_to_user_and_project_404 SKIP
test_add_role_to_user_and_project_404 OK
.................
.................
test_wrong_ldap_scope OK
Slowest 5 tests took 11.49 secs:
2.99 LiveLDAPIdentity.test_create_user_invalid_name_fails
2.83 LiveLDAPIdentity.test_create_user_invalid_enabled_type_string
2.10 LiveLDAPIdentity.test_delete_role_with_user_and_group_grants
2.07 LiveLDAPIdentity.test_delete_user_with_project_association
1.49 LiveLDAPIdentity.test_user_filter
----------------------------------------------------------------------
Ran 142 tests in 97.297s
OK (SKIP=29)
全面回归测试
要运行全套回归测试:
./run_tests.sh
清单4显示了回归测试的示例输出:
清单4.回归测试的示例输出
AuthBadRequests
test_authenticate_blank_auth OK
test_authenticate_blank_request_body OK
test_authenticate_invalid_auth_content OK
.................
.................
MiddlewareTest
test_mask_password OK
test_middleware_bad_request OK
test_middleware_exception_error OK
test_middleware_local_config OK
test_middleware_request OK
test_middleware_response OK
test_middleware_type_error OK
Slowest 5 tests took 21.66 secs:
5.57 TestAuthJSON.test_user_and_group_roles_scoped_token
5.35 Kc11TestCase.test_admin_requires_adminness
4.04 KcEssex3TestCase.test_admin_requires_adminness
3.81 KcMasterTestCase.test_admin_requires_adminness
2.88 IdentityTestCase.test_filtered_role_assignments
----------------------------------------------------------------------
Ran 1363 tests in 315.451s
OK (SKIP=82)
目前,针对LDAP的回归测试使用的是伪造的LDAP服务器,因此在为LDAP开发时,运行实时LDAP测试很重要。
结论
Keystone为所有OpenStack项目提供身份服务。 除默认SQL后端外,Keystone还支持LDAP和可插入身份验证模块。 本文介绍了如何通过安装新的LDAP服务器或将Keystone配置为使用现有的LDAP服务器来将LDAP用作Keystone后端。 Keystone中即将推出的功能将提供将身份验证与授权分开的功能,从而使与生产LDAP实例的集成更加容易。
翻译自: https://www.ibm.com/developerworks/cloud/library/cl-ldap-keystone/index.html