OpenLDAP 是企業級統一身份認證的核心組件。本文基於 CentOS/RHEL 系統,詳細講解 OpenLDAP 服務端部署、配置文件精簡、數據庫初始化、系統賬號遷移導入、客戶端驗證的完整鏈路,並提供自動化腳本與常見故障排查。
yum install -y openldap-servers openldap-clients migrationtools
cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
# 或現代版本使用 slapd.d 動態配置目錄,本文採用傳統靜態 slapd.conf 便於理解
rm -rf /var/lib/ldap/*
# 保留 DB_CONFIG.example 可選
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap:ldap /var/lib/ldap
chown ldap:ldap /etc/openldap/slapd.conf
chmod 640 /etc/openldap/slapd.conf
/etc/openldap/slapd.conf 精簡版# Schema 包含順序重要:core 必須在前
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
# 按需添加:ppolicy, sudo, sshPublicKey 等
allow bind_v2
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
# 數據庫定義
database bdb
suffix "dc=example,dc=com"
checkpoint 1024 15
rootdn "cn=Manager,dc=example,dc=com"
rootpw {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx # 使用 slappasswd 生成
directory /var/lib/ldap
# 索引優化查詢速度
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
# 監控數據庫
database monitor
access to *
by dn.exact="cn=Manager,dc=example,dc=com" read
by * none
slappasswd -s "YourStrongPassword"
# 輸出 {SSHA}xxx... 複製到 rootpw 行
systemctl enable --now slapd
systemctl status slapd
# 測試匿名綁定
ldapsearch -x -b "dc=example,dc=com"
# 測試管理員綁定
ldapsearch -x -D "cn=Manager,dc=example,dc=com" -W -b "dc=example,dc=com"
# base.ldif
dn: dc=example,dc=com
objectClass: top
objectClass: domain
dc: example
dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Groups,dc=example,dc=com
objectClass: organizationalUnit
ou: Groups
# 導入
ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f base.ldif
cd /usr/share/migrationtools
./migrate_passwd.pl /etc/passwd /tmp/users.ldif
./migrate_group.pl /etc/group /tmp/groups.ldif
migrate_common.phvim migrate_common.ph
# 修改以下行
$DEFAULT_MAIL_DOMAIN = "example.com";
$DEFAULT_BASE = "dc=example,dc=com";
./migrate_passwd.pl /etc/passwd /tmp/users.ldif
./migrate_group.pl /etc/group /tmp/groups.ldif
ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f /tmp/users.ldif
ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f /tmp/groups.ldif
yum install -y sssd oddjob-mkhomedir
authconfig --enableldap --enableldapauth \
--ldapserver=ldap://ldap.example.com \
--ldapbasedn="dc=example,dc=com" \
--enablemkhomedir --updateall
systemctl enable --now sssd oddjobd
| 現象 | 原因 | 解決 |
|---|---|---|
| slapd 啟動失敗 | schema 缺失、權限、端口佔用 | 檢查 journalctl -u slapd,確保 schema 文件存在 |
| ldap_bind: Invalid credentials | rootpw 哈希錯誤、DN 錯誤 | 重新生成 slappasswd,確認 rootdn 完全匹配 |
| 查詢無結果 | suffix 不匹配、數據未導入 | 確認 base.ldif 已導入,搜索基準正確 |
| 性能差 | 索引缺失、緩存太小 | 添加索引後 slapindex 重建,調大 DB_CONFIG cachesize |
| 防火牆阻擋 | 389/636 端口未開放 | firewall-cmd --add-service=ldap --permanent |