Openstack环境准备:
请参考 部署一个OpenStack环境,租户网络为Neutron-OVS-GRE。并确保keystone,nova,neutron,cinder,glance,horizon等各个服务都能正常使用。(注意:RDO生成的随机默认密码可能不满足windows密码复杂度要求,请酌情将各个组件的keystone[KS_PW]和database[DB_PW]密码更改成符合windows server 中Active Directory的密码复杂度要求[大写字符+小写字符+数字]>=8)
以下操作之前,请先备份/etc/keystone/keystone.conf等文件。
Microsoft Active Directory(AD)服务器一台[Windows Server2008]
Linux OpenLDAP服务器一台[CentOS6.4_X86_64]。特别地,假设OpenLDAP主机名hostname为ad,FQDN为ad.stackinsider.cn,那么需要在DNS服务器中配置,使得keystone所在的服务器可以ping通它。
# hostname
ad
# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=ad
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.1.101.155 ad.stackinsider.cn ad
认识LDAP协议:
OU的概念,CN的概念和DN的概念等。
目的:使openstack组件keystone与标准Lightweight Directory Access Protocol(以下简称LDAP协议)集成,能够让keystone从第三方的LDAP软件(工具)获取统一管理的用户,来完成对OpenStack的一些操作。集成后keystone依然能对tenant,user,role等概念兼容。
第一部分
keystone与OpenLDAP的集成
一 在Linux主机上安装OpenLDAP服务
参考:
安装前检查,发现系统默认安装了OpenLDAP,但是没有安装ldap-server和ldap-client。
#find / -name openldap*
/usr/share/doc/openldap-2.4.23
/usr/libexec/openldap
/etc/openldap
使用yum安装:
#su root
#yum install -y openldap openldap-servers openldap-clients
配置:
#cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
#cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
#mv /etc/openldap/slapd.d{,.bak}
修改slapd.conf文件
#vim /etc/openldap/slapd.conf
找到:107 by dn.exact=”cn=Manager,dc=my-domain,dc=com” read
改为:107 by dn.exact=”cn=OpenStack,dc=stackinsider,dc=cn” read
设置目录树后缀
找到:115 suffix “dc=my-domain,dc=com”
改为:115 suffix “dc=stackinsider,dc=cn”
设置LDAP管理员DN
找到:117 rootdn “cn=Manager,dc=my-domain,dc=com”
改为:117 rootdn “cn=OpenStack,dc=stackinsider,dc=cn”
设置LDAP管理员口令(最好使用明文加密后的密码)
找到:121 # rootpw secret
改为:121 rootpw 123456
修改相关文件权限
#chown ldap.ldap /etc/openldap/*
#chown ldap.ldap /var/lib/ldap/*
#mkdir /etc/openldap/cacerts
Reboot机器后,启动OpenLDAP服务
#/etc/init.d/slapd start
OpenLDAP默认网络服务端口为389,也可以修改
slapd -f /etc/openldap/slapd.conf -h ldap://389
新建初始化文件init.ldif
#cat init.ldif
dn:dc=stackinsider,dc=cn
objectclass:dcObject
objectclass:organization
o:Stackinsider, Inc.
dc:Stackinsider
dn:cn=OpenStack,dc=stackinsider,dc=cn
objectclass:organizationalRole
cn:OpenStack
导入文件,初始化OpenLDAP服务器
#ldapadd -x -W -D “cn=OpenStack,dc=stackinsider,dc=cn” -f init.ldif
Enter LDAP Password: [123456]
查看结果
#ldapsearch -x -LLL -H ldap:/// -b dc=stackinsider,dc=cn dn
dn: dc=stackinsider,dc=cn
dn: cn=OpenStack,dc=stackinsider,dc=cn [后面会用到]
设置开机自启动,并开放389服务端口
#chkconfig slapd on
#iptables -A INPUT -p tcp –dport 389 -j ACCEPT
#/etc/rc.d/init.d/iptables save
下载并安装windows客户端软件Softerra LDAP Administrator
连接刚才配置的OpenLDAP服务器[ad.stackinsider.cn],保证客户端windows能ping通它。
鼠标右击Local Servers;选择New;再选择New profile;填入任意连接名(假设为ad.stackinsider.cn);下一步;填写Host为ad.stackinsider.cn;下一步;在principal填入cn=OpenStack,dc=stackinsider,dc=cn , Password填入123456并选择save;点击完成。
二 创建OpenLDAP对象
准备Users OU,并添加相关用户。
创建OU=Users:选中dc=stackinsider鼠标右击;选择New,再选择New Entry;选择Template-Based下一步;选择Organizational Unit 下一步;Type为ou,Value填入Users下一步;完成OU=Users的创建;
为OU=Users添加用户:选中OU=Users鼠标右击;选择New,再选择New Entry;选择Template-Based下一步;选择Organizational Person 下一步;Type为cn,Value为admin 下一步;填入属性sn=admin并填入userPassword 完成。(注意:这里的admin密码要与OpenStack环境中admin密码一致)同样操作可以添加glance,cinder,nova,neutron等用户。
在cn=OpenStack下面创建Projects OU和Roles OU。
鼠标右击cn=OpenStack;选择New;再选择New Entry;选择Template-Based下一步;选择Organizational Unit 下一步;Type为ou,Value填入Projects下一步;完成OU=Projects的创建;同样的操作创建OU=Roles。
然后再在OU=Projects下创建OU=admin和OU=services。目前的OU结构图如下。
在OU=Roles下面创建OrgainzationalRole Object,分别是admin和Member。其中admin需要先填入roleOccupant属性值。具体步骤:选中OU=Roles右击鼠标;选择New,再选择New Entry;选择Schema-Based 下一步;找到organizationalRole点击>>添加到右边窗口,点击下一步;选择Type为cn,Value为admin 下一步;找到roleOccupant属性右边的按钮;选择OU=Users下面的admin用户(cn=admin,ou=Users,dc=stackinsider,dc=cn,注意若没看到Users可以再次点击dc=stackinsider);最后点击完成。
同样操作在OU=Roles下添加cn=Member,其roleOccupant属性可暂时不填。
在ou=admin,ou=Projects,ou=OpenStack,鼠标右击Projects下的admin同样的方法创建organizationalRole,其roleOccupant属性为cn=admin,ou=Users,dc=stackinsider,dc=cn。接着鼠标右击Projects下的admin;选择创建Group(LDAP Group Of Names object)下一步;Type为cn,Value为adminUsers下一步;member属性添加cn=admin,ou=Users,dc=stackinsider,dc=cn。
【说明:Projects下面的admin和services对应到openstack-keystone就是租户的概念,然后经过上一步就是向admin租户中添加了admin用户。】
至此LDAP Adminstrator大致结构显示如下:
三 配置keystone并测试
备份
# cp keystone.conf keystone.conf.init
配置认证backends为ldap
159 [identity]
160 # driver = keystone.identity.backends.sql.Identity
161 driver = keystone.identity.backends.ldap.Identity
配置ldap
[ldap]
url = ldap://ad.stackinsider.cn
user = cn=OpenStack,dc=stackinsider,dc=cn
password = 123456
suffix = dc=stackinsider,dc=cn
use_dumb_member = True
dumb_member = cn=OpenStack,ou=Users,dc=stackinsider,dc=cn
user_tree_dn = ou=Users,dc=stackinsider,dc=cn
user_objectclass = organizationalPerson
user_id_attribute = cn
user_name_attribute = sn
user_mail_attribute = email
user_enabled_attribute = userAccountControl
user_enabled_mask = 2
user_enabled_default = 512
user_attribute_ignore = password,tenant_id,tenants
user_allow_create = False
user_allow_update = False
user_allow_delete = False
tenant_tree_dn = ou=Projects,cn=OpenStack,dc=stackinsider,dc=cn
tenant_objectclass = organizationalUnit
tenant_id_attribute = ou
tenant_member_attribute = member
tenant_name_attribute = ou
tenant_allow_create = True
tenant_allow_update = True
tenant_allow_delete = True
role_tree_dn = ou=Roles,cn=OpenStack,dc=stackinsider,dc=cn
role_objectclass = organizationalRole
role_id_attribute = cn
role_name_attribute = cn
role_member_attribute = roleOccupant
role_allow_create = True
role_allow_update = True
role_allow_delete = True
重启openstack-keystone服务,并查看user,role和tenant
四 添加openstack其它服务(以glance为例),通过keystone-ldap认证
确保OU=Users下面已经创建glance用户,并且密码与openstack环境中glance密码一致。
鼠标右击OU=Roles下面的cn=admin;鼠标右击选择All task,再选择Add/Modify Attribute;找到roleOccupant,点击下一步;选择Users=glance(cn=glance,ou=Users,dc=stackinsider,dc=cn),点击完成。
在OU=Projects下面的services鼠标右击;选择New,再选择New Entry;选择Schema-Based 下一步;找到organizationalRole点击>>添加到右边窗口,点击下一步;选择Type为cn,Value为admin 下一步;找到roleOccupant属性右边的按钮;选择OU=Users下面的admin用户(cn=glance,ou=Users,dc=stackinsider,dc=cn,注意若没看到Users可以再次点击dc=stackinsider);最后点击完成。
在OU=Projects下面的services鼠标右击;选择New,再选择New Entry;选择Template-Based下一步;创建Group(LDAP Group Of Names object)下一步;Type为cn,Value为servicesUsers下一步;member属性添加cn=glance,ou=Users,dc=stackinsider,dc=cn。
添加glance之前
[root ~(keystone_admin)]# glance index
ID Name Disk Format Container Format Size
———————————— —————————— ——————– ——————– ————–
Request returned failure status.
Invalid OpenStack Identity credentials.
测试glance服务:
同样方法添加cinder,nova,neutron等服务,只需在Roles/admin添加相应用户(cinder,nova,neutron)到roleOccupant属性;在Projects/services/admin添加相应用户到roleOccupant属性;在Projects/services/servicesUsers添加相应用户到member属性。
第二部分
keystone与Microsoft Active Directory(AD)的集成
一 环境准备
安装或在现有的windows server2008,操作Microsoft Acitve Directory(以下简称AD)。欲了解AD请看系列文章[深入浅出Active Directory ]。配置了AD后这台windows server会自成一个DNS服务器。配置相应的hostname和域 ad-ldap.opentest.com ,并且保证装有keystone服务的节点可以ping通它。
若在部署OpenStack环境中各个密码无法达到windows server密码复杂度要求,在此之前请先disable掉AD用户密码复杂度的要求,参考 。并且将windows server原始的管理员用户名 Adminstrator更名为admin。修改管理员用户名的步骤是:依次点击开始,管理工具,Active Directory管理中心;选中右边的tab,可以看到opentest(本地);点击Users可以看到右边列出了所有的用户;选中Adminstrator右击鼠标,然后点属性,更改“全名”和“用户”即可。
同样可以在此可以创建新的用户,如glance,cinder,nova,neutron等,需要注意创建这些用户的密码一定要与OpenStack环境中相应密码一致;密码选项要选择“其他密码选项”,并设置为“密码永不过期”。
此时也可以使用Softerra LDAP Administrator连接到这个windows server的AD服务。Host为ad-ldap.opentest.com,可以使用Lookup Servers搜索出来,Principal为cn=admin,cn=Users,DC=opentest,DC=com,密码为server admin的密码。
接下来的操作可以借助Softerra LDAP Administrator软件,配合windows server 的AD管理和编辑工具,这样效率更高。
二 创建相关的OU,即组织单元/单位
使用AD管理中心工具,找到opentest(本地),鼠标右击;选“新建”,再选择“组织单位[OU]”。名称填OpenStack,点确定完成。同样的操作步骤在OpenStack下面创建Projects和Roles组织单位。
接下来打开AD编辑器(开始,搜索ADSIEDIT.msc即可打开)。展开DC=opentest,DC=com;找到OU=OpenStack,OU=Roles;鼠标右击OU=Roles,选新建,对象;在选择类中找到organizationalRole,点下一步;值填为admin,下一步;再选择更多属性,找到roleOccupant,填入属性值为CN=admin,CN=Users,DC=opentest,DC=com;添加,确定,最后点击完成。(注意roleOccupant的属性值为用户的“组织路径”)
同样的方法创建organizationalRole=Member,暂时不需要填写“更多属性“。以上步骤也可以在Softerra LDAP Administrator软件中完成,且更方便快捷。
同Roels下的organizationalRole=admin类似的操作:在OU=OpenStack,OU=Projects,OU=admin下面创建admin organizationalRole,并且添加roleOccupant属性值为CN=admin,CN=Users,DC=opentest,DC=com。再在OU=OpenStack,OU=Projects,OU=admin下面创建名为adminUsers的 groupOfName[CN];在其member属性中添加admin用户(对应的DN值为:CN=admin,CN=Users,DC=opentest,DC=com)。
同上面的操作在OU=OpenStack,OU=Projects,OU=services下面创建organizationalRole 对象admin和groupOfName 对象servicesUsers。它们的roleOccupant属性值和member属性值可以先不填写。
类似操作可以在Projects下面创建TeantA,接着创建名为Member的 organizationRole对象,roleOccupant属性值为UserA(CN=UserA,CN=Users,DC=opentest,DC=com);创建名为UserAUsers的groupOfName对象,member属性值为UserA,UserB等。
至此以上操作的结果,结构图如下:
三 配置keystone
[identity]
# driver = keystone.identity.backends.sql.Identity
driver = keystone.identity.backends.ldap.Identity
[ldap]
url = ldap://ad-ldap.opentest.com
user = cn=admin,cn=Users,dc=opentest,dc=com
password = password
suffix = dc=opentest,dc=com
use_dumb_member = True
dumb_member = cn=OpenStack,cn=Users,dc=opentest,dc=com
user_tree_dn = cn=Users,dc=opentest,dc=com
user_objectclass = organizationalPerson
user_id_attribute = cn
#user_name_attribute = sn
user_name_attribute = sAMAccountName
user_mail_attribute = email
user_enabled_attribute = userAccountControl
user_enabled_mask = 2
user_enabled_default = 512
user_attribute_ignore = password,tenant_id,tenants
user_allow_create = False
user_allow_update = False
user_allow_delete = False
tenant_tree_dn = ou=Projects,ou=OpenStack,dc=opentest,dc=com
tenant_objectclass = organizationalUnit
tenant_id_attribute = ou
tenant_member_attribute = Member
tenant_name_attribute = ou
tenant_allow_create = True
tenant_allow_update = True
tenant_allow_delete = True
role_tree_dn = ou=Roles,ou=OpenStack,dc=opentest,dc=com
role_objectclass = organizationalRole
role_id_attribute = cn
role_name_attribute = cn
role_member_attribute = roleOccupant
role_allow_create = True
role_allow_update = True
role_allow_delete = True
测试keystone服务,列出windows server AD中的用户,租户和角色。
四 集成服务
将cinder,glance,nova,neutron等用户:
加入到OU=OpenStack,OU=Roles,CN=admin里面的roleOccupant属性;
加入到OU=OpenStack,OU=Projects,OU=services,CN=admin里面的roleOccupant属性;
加入到OU=OpenStack,OU=Projects,OU=services,CN=servicesUsers里面的member属性。
选中相应的OU,鼠标右击选择All task,再选择Add/Modify Attribute;找到roleOccupant或member属性,点击下一步;选择/添加/替换用户,点击完成。
测试OpenStack各项服务均正常,由下图可证。
第三部分
总结
keystone在Grizzly版本就实现了标准ldap协议的后端用户认证。本文的OpenLDAP和Microsoft Acitve Directory都是标准ldap协议的具体实现工具,并且这两种工具在实际工作或商业环境中广泛使用。
总体上两种工具集成的过程类似,主要是创建用于openstack环境的各种Organizational,Unit,organizationalRole和groupOfName等ldap协议对象,使tenant,role和user与之相对应,详细对应关系在/etc/keystone/keystone.conf文件中的[ldap]中连接ldap服务器并做映射。
经过简单的测试,目前可能还存在一些不同和问题,比如:
1:对用户的管理直接通过OpenLDAP和Microsoft Acitve Directory管理了,不能用keystone的命令和horizon界面操作了。
2:由上一步影响到租户/用的资源配额属性的设定问题,只能通过nova,neutron等服务的命令间接来做配额设置了。
3:对性能方面,有一定的负面影响。
其它:特别是keystone和 Microsoft Active Directory(AD)的集成,按市场需求来看,私有云环境中这个解决方案具体相当的商业价值。欲投商业,请君全面并深度测试,以免给您和您的客户带来麻烦。
仅供参考,欢迎雅正!