分享

Openstack Keystone LDAP后端配置

xioaxu790 发表于 2015-1-9 22:52:30 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 29424
问题导读
1、什么是LDAP?
2、LDAP和keystone结合有什么优势?
3、完全删除LDAP的命令是什么?





写在最前面:
以下内容在openstack G版2013.1代码和ubuntu 12.04 LTS环境验证
LDAP版本为openldap-2.4.28

1、安装LDAP
  1. apt-get install ldap-utils
  2. apt-get install slapd
复制代码


2、验证LDAP登录
ldap安装默认根据当前主机的域名,生成登陆的DN
查看 /etc/hosts

所以这个环境上的登陆DN为 cn=admin,dc=openstack,dc=org
使用此命令验证是否配置成功
  1. ldapsearch -x -LLL -Hldap:/// -b dc=openstack,dc=org dn
复制代码



3、修改LDAP的默认schema
LDAP的默认schema不能直接和openstack配合使用,有些openstack的用户、角色、租户需要的属性默认schema中没有,例如:enable,description等等,需要修改;其次,需要添加存储openstack相关模型(user,tenant,group,role,domain)的dn,以便保存数据。
我自己写了两个ldif文件,以便完成上面两件事,内容如下:
modify.ldif
  1. dn: cn={0}core,cn=schema,cn=config  
  2. changetype: modify  
  3. add: olcAttributeTypes  
  4. olcAttributeTypes: {52}( 2.5.4.66 NAME 'enabled' DESC 'RFC2256: enabled of a group' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )  
  5.   
  6. dn: cn={0}core,cn=schema,cn=config  
  7. changetype: modify  
  8. delete: olcObjectClasses  
  9. olcObjectClasses: {7}( 2.5.6.9 NAME 'groupOfNames' DESC 'RFC2256: a group of names (DNs)' SUP top STRUCTURAL MUST ( member $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) )  
  10. -  
  11. add: olcObjectClasses  
  12. olcObjectClasses: {7}( 2.5.6.9 NAME 'groupOfNames' DESC 'RFC2256: a group of names (DNs)' SUP top STRUCTURAL MUST ( member $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description $ enabled) )  
  13.   
  14. dn: cn={3}inetorgperson,cn=schema,cn=config  
  15. changetype: modify  
  16. delete: olcObjectClasses  
  17. olcObjectClasses: {0}( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL MAY ( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo $ roomNumber $ secretary $ uid $ userCertificate $ x500uniqueIdentifier $ preferredLanguage $ userSMIMECertificate $ userPKCS12 ) )  
  18. -  
  19. add: olcObjectClasses  
  20. olcObjectClasses: {0}( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL MAY ( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo $ roomNumber $ secretary $ uid $ userCertificate $ x500uniqueIdentifier $ preferredLanguage $ userSMIMECertificate $ userPKCS12 $ description $ enabled $ email ) )
复制代码


将以上内容保存到对应的文件之后,执行如下命令:
  1. ldapmodify -c -Y EXTERNAL -H ldapi:/// -f modify.ldif
  2. add.ldif
  3. [plain] view plaincopyprint?
  4. dn: ou=users,dc=openstack,dc=org  
  5. objectClass: top  
  6. objectClass: organizationalUnit  
  7.   
  8. dn: ou=projects,dc=openstack,dc=org  
  9. objectClass: top  
  10. objectClass: organizationalUnit  
  11.   
  12. dn: ou=roles,dc=openstack,dc=org  
  13. objectClass: top  
  14. objectClass: organizationalUnit  
  15.   
  16. dn: ou=groups,dc=openstack,dc=org  
  17. objectClass: top  
  18. objectClass: organizationalUnit  
  19.   
  20. dn: ou=domains,dc=openstack,dc=org  
  21. objectClass: top  
  22. objectClass: organizationalUnit
复制代码


将以上内容保存到对应的文件之后,执行如下命令:
  1. ldapadd -x -c -D"cn=admin,dc=openstack,dc=org" -w "Galax8800" -f add.ldif
复制代码


注意Galax8800是安装LDAP的时候,输入的root密码

4、修改keystone的配置文件
  1. /etc/keystone/keystone.conf
复制代码


将Identity的后端配置为ldap
  1. [identity]  
  2. driver = keystone.identity.backends.ldap.Identity
复制代码


增加ldap段的配置,只需如下配置,其他可以使用默认值
  1. [ldap]  
  2. url = ldap://localhost  
  3. user = cn=admin,dc=openstack,dc=org  
  4. password = Galax8800  
  5. suffix = dc=openstack,dc=org  
  6. use_dumb_member = True  
  7. allow_subtree_delete = False  
  8.   
  9. user_tree_dn = ou=users,dc=openstack,dc=org  
  10. tenant_tree_dn = ou=projects,dc=openstack,dc=org  
  11. role_tree_dn = ou=roles,dc=openstack,dc=org  
  12. group_tree_dn = ou=groups,dc=openstack,dc=org  
  13. domain_tree_dn = ou=domains,dc=openstack,dc=org  
复制代码


注意:password = Galax8800 此密码为当时安装LDAP时,输入的root密码
配置完成之后,重启keystone

5、初始化keystone的基本用户
这个步骤网上的一些外国大牛已经提供了一些脚本,这里为了流程完整,就提供一个参考版本
keystone_basic.sh
  1. #!/bin/sh  
  2. #  
  3. # Keystone basic configuration   
  4.   
  5. # Mainly inspired by https://github.com/openstack/keystone/blob/master/tools/sample_data.sh  
  6.   
  7. # Modified by Bilel Msekni / Institut Telecom  
  8. #  
  9. # Support: openstack@lists.launchpad.net  
  10. # License: Apache Software License (ASL) 2.0  
  11. #  
  12. #. /root/novarc  
  13. #HOST_IP=${MASTER}  
  14. ADMIN_PASSWORD=Galax8800  
  15. SERVICE_PASSWORD=Galax8800  
  16. SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-service}  
  17.   
  18. get_id () {  
  19.     echo `$@ | awk '/ id / { print $4 }'`  
  20. }  
  21.   
  22. # Tenants  
  23. ADMIN_TENANT=$(get_id keystone tenant-create --name=admin)  
  24. SERVICE_TENANT=$(get_id keystone tenant-create --name=$SERVICE_TENANT_NAME)  
  25.   
  26.   
  27. # Users  
  28. ADMIN_USER=$(get_id keystone user-create --name=admin --pass="$ADMIN_PASSWORD" --email=admin@domain.com)  
  29.   
  30.   
  31. # Roles  
  32. ADMIN_ROLE=$(get_id keystone role-create --name=admin)  
  33. KEYSTONEADMIN_ROLE=$(get_id keystone role-create --name=KeystoneAdmin)  
  34. KEYSTONESERVICE_ROLE=$(get_id keystone role-create --name=KeystoneServiceAdmin)  
  35.   
  36. # Add Roles to Users in Tenants  
  37. keystone user-role-add --user-id $ADMIN_USER --role-id $ADMIN_ROLE --tenant-id $ADMIN_TENANT  
  38. keystone user-role-add --user-id $ADMIN_USER --role-id $KEYSTONEADMIN_ROLE --tenant-id $ADMIN_TENANT  
  39. keystone user-role-add --user-id $ADMIN_USER --role-id $KEYSTONESERVICE_ROLE --tenant-id $ADMIN_TENANT  
  40.   
  41. # The Member role is used by Horizon and Swift  
  42. MEMBER_ROLE=$(get_id keystone role-create --name=Member)  
  43.   
  44. # Configure service users/roles  
  45. NOVA_USER=$(get_id keystone user-create --name=nova --pass="$SERVICE_PASSWORD" --email=nova@domain.com)  
  46. keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $NOVA_USER --role-id $ADMIN_ROLE  
  47.   
  48. GLANCE_USER=$(get_id keystone user-create --name=glance --pass="$SERVICE_PASSWORD" --email=glance@domain.com)  
  49. keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $GLANCE_USER --role-id $ADMIN_ROLE  
  50.   
  51. QUANTUM_USER=$(get_id keystone user-create --name=quantum --pass="$SERVICE_PASSWORD" --email=quantum@domain.com)  
  52. keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $QUANTUM_USER --role-id $ADMIN_ROLE  
  53.   
  54. CINDER_USER=$(get_id keystone user-create --name=cinder --pass="$SERVICE_PASSWORD" --email=cinder@domain.com)  
  55. keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $CINDER_USER --role-id $ADMIN_ROLE
复制代码


将以上内容保存到对应的文件之后,执行如下命令:
  1. sh keystone_basic.sh
复制代码


6、验证keystone
如果上述流程都已经执行成功了,需要验证一下keystone中的数据,执行
  1. keystone user-list
  2. keystone role-list
  3. keystone tenant-list
  4. keystone user-role-list
复制代码


注意:keystone user-role-list如果执行失败,没有关系,这不是LDAP配置的问题,是一个keystone-client的bug,通过Rest Client重新验证一下就可以了
https://bugs.launchpad.net/python-keystoneclient/+bug/1058750

7、查看LDAP中的数据结构
我们再来看一下LDAP中的数据结构,如果和下图一致,就没有问题了


8、重启openstack的所有进程
配置keystone LDAP成功之后,需要重启openstack的所有进程,以nova为例,nova会缓存api-paste.ini中配置的admin_user的token,如果配置LDAP之前是使用的sql Identity后端,那么nova会使用这个缓存的admin_token去验证消息携带的token,keystone在判断admin_token是否可用时,会报错,造成认证失败,这个问题当时困扰了我很久,所以一定要重启openstack的所有进程,然后需要验证一下nova list,cinder list,glane image-list,quantum net-list是否可用。

9、将以上步骤浓缩为一个脚本
写了一个脚本将以上步骤全部实现
  1. #!/bin/bash  
  2.   
  3. # ubunut 12.04 LTS keystone G 2013.1 openldap 2.4.28  
  4.   
  5. LDAP_PASS='Galax8800'  
  6.   
  7. KEYSTONE_CONF='/etc/keystone/keystone.conf'  
  8.   
  9. #step0 install ldap and set password  
  10. function install_ldap()  
  11. {  
  12.     cat <<LDAP_PRESEED | debconf-set-selections   
  13. slapd slapd/password1 password ${LDAP_PASS}  
  14. slapd slapd/password2 password ${LDAP_PASS}  
  15. LDAP_PRESEED  
  16.   
  17.     apt-get -y --force-yes install slapd  
  18.     apt-get -y --force-yes install ldap-utils  
  19.   
  20. }  
  21.   
  22. #step1 check ldap login  
  23. function check_ldap_login()  
  24. {  
  25.     local first_line=$(ldapsearch -x -LLL -H ldap:/// -b dc=openstack,dc=org dn | sed -n 1p)  
  26.       
  27.     if [ "${first_line}" == "dn: dc=openstack,dc=org" ]  
  28.     then  
  29.         echo "login success"  
  30.     else  
  31.         echo "login failed"  
  32.         exit  
  33.     fi  
  34. }  
  35.   
  36. #step2 modify ldap schema  
  37. function modify_ldap_schema()  
  38. {  
  39.     cat > ./modify.ldif <<EOF  
  40. dn: cn={0}core,cn=schema,cn=config  
  41. changetype: modify  
  42. add: olcAttributeTypes  
  43. olcAttributeTypes: {52}( 2.5.4.66 NAME 'enabled' DESC 'RFC2256: enabled of a group' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )  
  44.   
  45. dn: cn={0}core,cn=schema,cn=config  
  46. changetype: modify  
  47. delete: olcObjectClasses  
  48. olcObjectClasses: {7}( 2.5.6.9 NAME 'groupOfNames' DESC 'RFC2256: a group of names (DNs)' SUP top STRUCTURAL MUST ( member $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) )  
  49. -  
  50. add: olcObjectClasses  
  51. olcObjectClasses: {7}( 2.5.6.9 NAME 'groupOfNames' DESC 'RFC2256: a group of names (DNs)' SUP top STRUCTURAL MUST ( member $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description $ enabled) )  
  52.   
  53. dn: cn={3}inetorgperson,cn=schema,cn=config  
  54. changetype: modify  
  55. delete: olcObjectClasses  
  56. olcObjectClasses: {0}( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL MAY ( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo $ roomNumber $ secretary $ uid $ userCertificate $ x500uniqueIdentifier $ preferredLanguage $ userSMIMECertificate $ userPKCS12 ) )  
  57. -  
  58. add: olcObjectClasses  
  59. olcObjectClasses: {0}( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL MAY ( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo $ roomNumber $ secretary $ uid $ userCertificate $ x500uniqueIdentifier $ preferredLanguage $ userSMIMECertificate $ userPKCS12 $ description $ enabled $ email ) )  
  60. EOF  
  61.   
  62.     ldapmodify -c -Y EXTERNAL -H ldapi:/// -f modify.ldif > /dev/null 2>&1   
  63.   
  64.     if [ $? -eq 0 ]  
  65.     then  
  66.         echo "modify.ldif success"  
  67.     else  
  68.         echo "modify.ldif failed"  
  69.         exit  
  70.     fi  
  71.       
  72.     cat > ./add.ldif <<EOF  
  73. dn: ou=users,dc=openstack,dc=org  
  74. objectClass: top  
  75. objectClass: organizationalUnit  
  76.   
  77. dn: ou=projects,dc=openstack,dc=org  
  78. objectClass: top  
  79. objectClass: organizationalUnit  
  80.   
  81. dn: ou=roles,dc=openstack,dc=org  
  82. objectClass: top  
  83. objectClass: organizationalUnit  
  84.   
  85. dn: ou=groups,dc=openstack,dc=org  
  86. objectClass: top  
  87. objectClass: organizationalUnit  
  88.   
  89. dn: ou=domains,dc=openstack,dc=org  
  90. objectClass: top  
  91. objectClass: organizationalUnit  
  92. EOF  
  93.   
  94.     ldapadd -x -c -D "cn=admin,dc=openstack,dc=org" -w "${LDAP_PASS}" -f add.ldif > /dev/null 2>&1   
  95.       
  96.     if [ $? -eq 0 ]  
  97.     then  
  98.         echo "add.ldif success"  
  99.     else  
  100.         echo "add.ldif failed"  
  101.         exit  
  102.     fi  
  103.       
  104.     rm -rf ./modify.ldif  
  105.     rm -rf ./add.ldif  
  106.   
  107. }  
  108.   
  109. #step3 modify keystone.conf  
  110. function modify_keystone_conf()  
  111. {  
  112.     cat > ./keystone_ldap.conf <<EOF  
  113. url = ldap://localhost  
  114. user = cn=admin,dc=openstack,dc=org  
  115. password = ${LDAP_PASS}  
  116. suffix = dc=openstack,dc=org  
  117. use_dumb_member = True  
  118. allow_subtree_delete = False  
  119.   
  120. user_tree_dn = ou=users,dc=openstack,dc=org  
  121. tenant_tree_dn = ou=projects,dc=openstack,dc=org  
  122. role_tree_dn = ou=roles,dc=openstack,dc=org  
  123. group_tree_dn = ou=groups,dc=openstack,dc=org  
  124. domain_tree_dn = ou=domains,dc=openstack,dc=org  
  125. EOF  
  126.   
  127.     if [ -w "${KEYSTONE_CONF}" ]  
  128.     then  
  129.         sed "s/^\(driver = keystone.identity.backends.\).*\(.Identity\)/\1ldap\2/" -i ${KEYSTONE_CONF}  
  130.         sed "/^\[ldap\]$/r ./keystone_ldap.conf" -i ${KEYSTONE_CONF}  
  131.     else  
  132.         echo "modify keystone.conf failed"  
  133.         exit  
  134.     fi  
  135.       
  136.     rm -rf ./keystone_ldap.conf  
  137.       
  138.     stop keystone && start keystone > /dev/null 2>&1  
  139.     if [ $? -eq 0 ]  
  140.     then  
  141.         echo "restart keystone success"  
  142.     else  
  143.         echo "restart keystone failed"  
  144.         exit  
  145.     fi  
  146.     sleep 2  
  147. }  
  148.   
  149. #step4 init keystone  
  150. function init_keystone()  
  151. {  
  152.         cat > ./keystone_basic.sh <<EOF  
  153. #!/bin/sh  
  154. #  
  155. # Keystone basic configuration   
  156.   
  157. # Mainly inspired by https://github.com/openstack/keystone/blob/master/tools/sample_data.sh  
  158.   
  159. # Modified by Bilel Msekni / Institut Telecom  
  160. #  
  161. # Support: openstack@lists.launchpad.net  
  162. # License: Apache Software License (ASL) 2.0  
  163. #  
  164. #. /root/novarc  
  165. #HOST_IP=\${MASTER}  
  166. ADMIN_PASSWORD=Galax8800  
  167. SERVICE_PASSWORD=Galax8800  
  168. SERVICE_TENANT_NAME=\${SERVICE_TENANT_NAME:-service}  
  169.   
  170. get_id () {  
  171.     echo \`\$@ | awk '/ id / { print \$4 }'\`  
  172. }  
  173.   
  174. # Tenants  
  175. ADMIN_TENANT=\$(get_id keystone tenant-create --name=admin)  
  176. SERVICE_TENANT=\$(get_id keystone tenant-create --name=\$SERVICE_TENANT_NAME)  
  177.   
  178.   
  179. # Users  
  180. ADMIN_USER=\$(get_id keystone user-create --name=admin --pass="\$ADMIN_PASSWORD" --email=admin@domain.com)  
  181.   
  182.   
  183. # Roles  
  184. ADMIN_ROLE=\$(get_id keystone role-create --name=admin)  
  185. KEYSTONEADMIN_ROLE=\$(get_id keystone role-create --name=KeystoneAdmin)  
  186. KEYSTONESERVICE_ROLE=\$(get_id keystone role-create --name=KeystoneServiceAdmin)  
  187.   
  188. # Add Roles to Users in Tenants  
  189. keystone user-role-add --user-id \$ADMIN_USER --role-id \$ADMIN_ROLE --tenant-id \$ADMIN_TENANT  
  190. keystone user-role-add --user-id \$ADMIN_USER --role-id \$KEYSTONEADMIN_ROLE --tenant-id \$ADMIN_TENANT  
  191. keystone user-role-add --user-id \$ADMIN_USER --role-id \$KEYSTONESERVICE_ROLE --tenant-id \$ADMIN_TENANT  
  192.   
  193. # The Member role is used by Horizon and Swift  
  194. MEMBER_ROLE=\$(get_id keystone role-create --name=Member)  
  195.   
  196. # Configure service users/roles  
  197. NOVA_USER=\$(get_id keystone user-create --name=nova --pass="\$SERVICE_PASSWORD" --email=nova@domain.com)  
  198. keystone user-role-add --tenant-id \$SERVICE_TENANT --user-id \$NOVA_USER --role-id \$ADMIN_ROLE  
  199.   
  200. GLANCE_USER=\$(get_id keystone user-create --name=glance --pass="\$SERVICE_PASSWORD" --email=glance@domain.com)  
  201. keystone user-role-add --tenant-id \$SERVICE_TENANT --user-id \$GLANCE_USER --role-id \$ADMIN_ROLE  
  202.   
  203. QUANTUM_USER=\$(get_id keystone user-create --name=quantum --pass="\$SERVICE_PASSWORD" --email=quantum@domain.com)  
  204. keystone user-role-add --tenant-id \$SERVICE_TENANT --user-id \$QUANTUM_USER --role-id \$ADMIN_ROLE  
  205.   
  206. CINDER_USER=\$(get_id keystone user-create --name=cinder --pass="\$SERVICE_PASSWORD" --email=cinder@domain.com)  
  207. keystone user-role-add --tenant-id \$SERVICE_TENANT --user-id \$CINDER_USER --role-id \$ADMIN_ROLE  
  208. EOF  
  209.       
  210.     bash keystone_basic.sh > /dev/null 2>&1  
  211.     if [ $? -eq 0 ]  
  212.     then  
  213.         echo "init keystone success"  
  214.     else  
  215.         echo "init keystone failed"  
  216.         exit  
  217.     fi  
  218.       
  219.     rm -rf ./keystone_basic.sh  
  220.   
  221. }  
  222.   
  223. #step5 check keystone  
  224. function check_keystone()  
  225. {  
  226.     keystone user-list  
  227.     keystone role-list  
  228.     keystone tenant-list  
  229. }  
  230.   
  231.   
  232. #step6 restart openstack all service  
  233. function restart_openstack_all_service()  
  234. {  
  235.     cd /etc/init.d/; for i in $( ls quantum-* ); do sudo service $i restart; done; cd -;  
  236.     cd /etc/init.d/; for i in $( ls nova-* ); do sudo service $i restart; done; cd -;  
  237.     cd /etc/init.d/; for i in $( ls cinder-* ); do sudo service $i restart; done; cd -;  
  238.     cd /etc/init.d/; for i in $( ls glance-* ); do sudo service $i restart; done; cd -;  
  239.     cd /etc/init.d/; for i in $( ls keystone ); do sudo service $i restart; done; cd -;  
  240. }  
  241.   
  242.   
  243. ###################### main #######################  
  244. install_ldap  
  245. check_ldap_login  
  246. modify_ldap_schema  
  247. modify_keystone_conf  
  248. init_keystone  
  249. check_keystone  
  250. restart_openstack_all_service
复制代码


脚本中包括:
  1. #step0 install ldap and setpassword
  2. #step1 check ldap login
  3. #step2 modify ldap schema
  4. #step3 modify keystone.conf
  5. #step4 init keystone
  6. #step5 check keystone
  7. #step6 restartopenstack all service
复制代码



最后一步重启所有openstack服务的步骤,会重启本节点的所有openstack进程,如果有其他节点需要手动重启
运行自动化脚本
  1. bash config_keystone_ldap.sh
复制代码


默认LDAP密码为Galax8800

最后附送ubuntu环境下完全删除LDAP的命令
  1. apt-get purge slapd
复制代码




没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条