首页›云计算›云计算-OpenStack+LDAP集成-第五节-Keystone与OpenLDAP集成

云计算-OpenStack+LDAP集成-第五节-Keystone与OpenLDAP集成

到这一步,LDAP 里已经有一套账号了,但 OpenStack 还在用它自己的 MySQL 用户表。本节要做的事:让 Keystone(OpenStack 的认证中心)在验证某个域的用户时,转而去问 LDAP。做完之后,学生用 LDAP 账号就能直接登录云平台。

第五节 Keystone 与 OpenLDAP 集成:多域驱动 → 域配置文件 → LDAP 认证
第五节 Keystone 与 OpenLDAP 集成:多域驱动 → 域配置文件 → LDAP 认证

一、原理:多域驱动,”按域分流”

Keystone 里“域(domain)”是账号的命名空间。它的身份存储有两种后端:SQL(存 MySQL)和 LDAP。Keystone 支持按域选择后端——这就是多域驱动。

  • default / service 等内置域 → 继续走 SQL,admin 账号照常能用;
  • ldap_domain(我们新建的)→ 走 LDAP,用户来自 ou=People;
  • [assignment] driver = sql —— 用户的“角色/项目归属”仍存 MySQL,LDAP 只管“你是谁”,不管“你能干什么”。

这样设计的好处是留了后路:就算 LDAP 挂了,管理员仍能用本地账号登录救火。

二、操作步骤

第 1 步:在 keystone.conf 末尾启用多域驱动。

vi /etc/keystone/keystone.conf

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

[assignment]
driver = sql
mkdir /etc/keystone/domains
chown keystone:keystone /etc/keystone/domains

第 2 步:先核对环境变量,再创建域。很多人卡在“域建不上”,其实是 admin-openrc.sh 里缺了认证方式那一行。

vi /etc/keystone/admin-openrc.sh

export OS_PROJECT_DOMAIN_NAME=demo
export OS_USER_DOMAIN_NAME=demo
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=12345678          # 换成你的 OpenStack 密码
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export OS_AUTH_TYPE=password         # 注意:默认没有这一行,必须补上
source /etc/keystone/admin-openrc.sh
openstack domain create ldap_domain
openstack domain list

第 3 步:为这个域写配置文件。文件名格式固定为 keystone.域名.conf,域名和文件名必须对应。

vi /etc/keystone/domains/keystone.ldap_domain.conf

[identity]
driver = ldap

[ldap]
url = ldap://192.168.100.10:389           # 如走 SSL 则用 ldaps://
user = cn=admin,dc=example,dc=com         # 有查询权限的绑定账号
password = 12345678                       # 明文即可
suffix = dc=example,dc=com
user_tree_dn = ou=People,dc=example,dc=com   # 用户搜索起点
user_objectclass = inetOrgPerson
user_id_attribute = uid                      # 映射为 Keystone 用户 ID
user_name_attribute = cn                     # 映射为登录名
user_mail_attribute = mail
user_pass_attribute = userPassword
user_enabled_attribute = shadowExpire        # 可选
user_enabled_default = True
user_enabled_invert = false
user_filter = "(objectClass=inetOrgPerson)"

group_tree_dn = ou=Group,dc=example,dc=com
group_objectclass = groupOfNames
group_id_attribute = cn
group_name_attribute = ou
group_member_attribute = member
group_desc_attribute = description
group_filter = "(objectClass=groupOfNames)"

use_pool = true
use_tls = false

[assignment]
driver = sql

第 4 步:重启 Keystone 并验证。

systemctl restart httpd        # Keystone 跑在 Apache 下,重启 httpd 即可

openstack user list --domain ldap_domain    # 能列出 LDAP 里的用户即成功

三、域配置字段速记

字段“, ”含义“, ”本例取值
url LDAP 服务地址 ldap://192.168.100.10:389
suffix 目录树后缀 dc=example,dc=com
user_tree_dn 从哪里找用户 ou=People,dc=example,dc=com
user_objectclass 用户对象的类型 inetOrgPerson
user_filter 只同步符合条件的用户 (objectClass=inetOrgPerson)
[assignment] driver 角色/项目存哪 sql(留在 MySQL)

四、常见问题与排错

现象“, ”原因“, ”解决办法
openstack 命令报 401 缺 OS_AUTH_TYPE=password admin-openrc.sh 补上并重新 source
domain create 报冲突“, ”占用了 default / service 域“, ”必须新建独立的域,不要复用
user list 是空的 user_tree_dn 与实际路径不一致“, ”核对 LDAP 里用户到底挂在哪个 ou
登录后无项目权限 assignment 未指回 sql [assignment] driver = sql 必须保留

五、本节小结

一句话记住:多域驱动 → 建新域 → 写 keystone.域名.conf → 重启 httpd。LDAP 管“你是谁”,SQL 管“你能干什么”。下一节给平台装上“眼睛”——Prometheus 监控。

上一篇
下一篇