云计算-OpenStack+LDAP集成-第三节-安装OpenLDAP统一账号中心
想象一所学校:机房上机一个账号、借书一个账号、云平台又一个账号——学生记不住,管理员要维护三套表。OpenLDAP 解决的就是这件事:把所有账号放进一棵目录树里集中管理,其他系统都来这棵树里“查人、验人”。这一节我们把它装起来并搭出目录骨架。

一、原理:目录树、DN 与 LDIF
LDAP(轻量级目录访问协议)存数据的方式像一棵树,每个节点叫一个条目(entry),每个条目有一个全路径名字叫 DN(Distinguished Name)。比如学生张三的 DN 可能是 uid=zhangsan,ou=People,dc=example,dc=com——读起来就像“example.com 公司 → People 部门 → 张三”。
- slapd:LDAP 的服务进程,389 端口;
- schema:定义“一类东西有哪些属性”(比如 inetOrgPerson 必须有 cn、sn);
- LDIF:LDAP 的“文本配置格式”,2.4 版本之后所有配置都用 LDIF 写,不再直接改 slapd.conf;
- olcRootPW:管理员密码,必须是 slappasswd 生成的 SSHA 哈希,不能写明文。
二、操作步骤
第 1 步:安装组件并初始化数据库目录。
yum install -y openldap-servers openldap-clients openldap-devel \
compat-openldap migrationtools
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap /var/lib/ldap/DB_CONFIG
chown -R ldap:ldap /var/lib/ldap/
systemctl start slapd
systemctl enable slapd
第 2 步:生成加密的管理员密码,记下来!后面配置文件里要用的是这串哈希,而登录时输入的是明文 12345678,两者别搞混。
slappasswd -s 12345678
# 输出类似:{SSHA}O6R/ZFJ26qabGWhNvejbFlispFuLoMul
第 3 步:写入管理员密码(changepwd.ldif)。注意把 olcRootPW 换成你刚才生成的哈希。
vim ~/changepwd.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}O6R/ZFJ26qabGWhNvejbFlispFuLoMul
ldapadd -Y EXTERNAL -H ldapi:/// -f ~/changepwd.ldif
第 4 步:导入基础 schema(三个都要导)。
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
第 5 步:配置域名和管理员账号(changedomain.ldif)。这里把后缀设为 dc=example,dc=com,实验环境可以按需替换。
vim ~/changedomain.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
by dn.base="cn=admin,dc=example,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=example,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}O6R/ZFJ26qabGWhNvejbFlispFuLoMul
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=example,dc=com" write
by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=example,dc=com" write by * read
ldapmodify -Y EXTERNAL -H ldapi:/// -f ~/changedomain.ldif
第 6 步:建立基础目录结构(base.ldif)。这里用的是明文密码——因为这是“登录”动作,不是“写配置”。
vim ~/base.ldif dn: dc=example,dc=com objectClass: top objectClass: dcObject objectclass: organization o: example Company dc: example dn: cn=admin,dc=example,dc=com objectClass: organizationalRole cn: admin description: Directory Manager dn: ou=People,dc=example,dc=com objectClass: organizationalUnit ou: People dn: ou=Group,dc=example,dc=com objectClass: organizationalUnit ou: Group
ldapadd -x -D cn=admin,dc=example,dc=com -W -f ~/base.ldif # 提示输入密码:输入明文 12345678 # 成功会输出 adding new entry "dc=example,dc=com" 这样的信息
第 7 步:放行防火墙并验证。如果之前已关闭防火墙可跳过第一条。
firewall-cmd --add-service=ldap --permanent firewall-cmd --reload # 关键验证:管理员绑定查询,能列出条目即成功 ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b "dc=example,dc=com"
三、必须记住的三个路径
| 路径“, ”作用 | |
|---|---|
| /etc/openldap/slapd.d/ | 配置目录(LDIF 形式),改配置就改这里 |
| /var/lib/ldap/ | 数据库目录,DB_CONFIG 和真实数据都在这 |
| /etc/openldap/schema/ | 对象类与属性定义(cosine / nis / inetorgperson) |
四、常见错误码速查
| 错误码“, ”含义“, ”最常见原因 | ||
|---|---|---|
| 49 | invalid credentials | 密码不对:哈希和明文用反了 |
| 59 | 密码不一致 | changepwd.ldif 与 changedomain.ldif 里的哈希不同 |
| 68 | entry 已存在“, ”重复导入 base.ldif,先删再导 | |
| 连接被拒 | slapd 没起来 | systemctl status slapd 看日志 |
五、本节小结
最容易踩的坑:base.ldif 导入用明文密码,配置文件里的 olcRootPW 用 {SSHA} 哈希——两者弄混就报 49 / 59。把 slappasswd 的输出贴到记事本里保存好,后面第五节还会用到。
一句话记住:装包 → 初始化 DB_CONFIG → 起服务 → 生成哈希 → 三份 LDIF 依次导入 → ldapsearch 验证。目录树骨架(dc=example,dc=com / cn=admin / ou=People / ou=Group)建成后,下一节给它配一个网页管理端。

