openstack keystone对接AD ldap认证

开始之前

需求

由于一般在配置openstack的时候,都会使用内置的default的域,并且使用密码认证。在使用过程中,有需求需要对接内部ad。

网上有思路在将openstack内部服务使用的账号和密码等信息都在ldap 上生成一份(例如:《转》OpenStack组件keystone与LDAP协议集成(OpenLDAP和Active Directory)),这种思路在尝试的时候存在很多问题和困难。

而当环境配置完成以后,由于openstack内部服务已经配置成了在default域下面使用密码认证,对接外部ldap 的时候,我们希望实现如下功能:

  • 保持OpenStack服务的独立性,即OpenStack的系统服务帐号及某些特定管理员帐号不依赖于已有的LDAP服务
  • 使用只读权限与已有LDAP服务整合,只进行帐号验证

理解

  • 目前的openstack 支持identity和assignment分离,可以再部署的时候,将认证和鉴权走走不同的方式:比如认证使用ldap,而鉴权使用keystone默认的sql方式。
  • openstack 默认的域–default也是域,当我们对接企业AD的时候(企业AD也是域),实际上是openstack的多域认证。
  • openstack keystone默认的配置文件是keystone全局配置,默认对default起作用(这就是为什么如果不做多域配置的时候,对接ldap以后,账号会被同步到default里面,这个很不正常)。在做ldap配置的时候,如果openstack环境已经使用default默认域的密码认证,我们需要走多域配置的方式。

配置

开启keystone多域支持

编辑/etc/keystone/keystone.conf配置文件,设置如下两项:

[identity]
domain_specific_drivers_enabled = True
domain_config_dir = /etc/keystone/domains

创建多域支持配置文件目录与配置文件

mkdir /etc/keystone/domains
chown -R keystone:keystone /etc/keystone/domains

配置AD对应的配置文件

在/etc/keystone/domains下创建AD对应的配置文件:keystone.{DOMAIN_NAME}.conf。{DOMAIN_NAME}需要和真正的domain name保持一致,比如我们实验环境中的test.com,那么配置文件应该为keystone.test.conf

vim /etc/keystone/domains/keystone.test.conf

添加如下配置:

[identity]
#认证使用ldap
driver = ldap
[assignment]
#鉴权使用sql
driver = sql
[ldap]
url = ldap://172.27.132.216:389
#这里绑定管理员信息(理论上其他用户也应该性)
user = CN=Administrator,CN=Users,DC=test,DC=com
password = Administrator_password
suffix = DC=test,DC=com
#use_dumb_member和allow_subtree_delete在新版配置中不存在
use_dumb_member = False
allow_subtree_delete = False

query_scope = sub
#让openstack从ostack的组织单位中同步用户
user_tree_dn = ou=ostack,dc=test,dc=com
user_objectclass = organizationalPerson
user_id_attribute = cn
user_name_attribute = sAMAccountName
user_mail_attribute = mail
#user_filter = (&(objectClass=user)(cn=*))

user_enabled_attribute = userAccountControl
user_enabled_default = 512
#openstack的用户中有一个用户激活的属性,在AD中并没有对应的feild与之对应,需要使用user_enabled_mask = 2来支持,并配置user_enabled_emulation。user_enabled_emulation是一个work round,当用户的LDAP system没有提供 enabled这个属性的时候,可以用这个做为work round,方法就是创建一个cn,专门用来放那些user是enabled。
user_enabled_mask = 2
user_enabled_emulation = False

group_tree_dn = ou=ostack,dc=test,dc=com
group_objectclass = groupOfNames
#group_filter = (&(objectClass=group)(cn=*))
group_id_attribute = cn
group_name_attribute = ou
group_member_attribute = member

#open all debug log for ldap driver
debug_level = -1

创建domain

使用原有的admin账号创建名为test的域:

openstack domain create test

重启keystone

这个时候再重启keystone,其实也是重启httpd:

systemctl restart httpd

为domain添加project与user

依然使用openstack default域下的admin账号为test域创建一个项目:

openstack project create --domain test test_project

由于我们在ad上已经为ostack组织创建了一个名为zhangxiyang的用户,正常情况下,应该已经同步到了keystone:

openstack user list --domain test
+------------------------------------------------------------------+-------------+
| ID                                                               | Name        |
+------------------------------------------------------------------+-------------+
| 48b3304d4be445373d486a2dd35f8075843f8bef3f7bd2364db003a6a91ac372 | zhangxiyang |
+------------------------------------------------------------------+-------------+

为zhangxiyang 这个用户授权项目:

openstack role add --project test_project --user 48b3304d4be445373d486a2dd35f8075843f8bef3f7bd2364db003a6a91ac372 admin

配置dashboard

我们需要在horizon中,开启多域支持,编辑/etc/openstack-dashboard/local_settings,配置如下两项:

OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'default'

重启http

systemctl restart httpd

猜你喜欢

转载自blog.csdn.net/zxycyj1989/article/details/101213003