云计算-OpenStack+LDAP集成-第五节-Keystone与OpenLDAP集成
到这一步,LDAP 里已经有一套账号了,但 OpenStack 还在用它自己的 MySQL 用户表。本节要做的事:让 Keystone(OpenStack 的认证中心)在验证某个域的用户时,转而去问 LDAP。做完之后,学生用 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 监控。

