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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章