OpenLDAP 服务搭建与配置全流程指南
OpenLDAP 是一款开源的轻量级目录访问协议(LDAP)实现,专注于提供集中式用户身份认证与管理解决方案,特别适用于多节点集群环境下的统一用户治理场景。本文将基于实操代码片段,详细讲解 OpenLDAP 的服务端部署、目录结构配置、用户管理及客户端集成的完整流程。
一、OpenLDAP 服务端安装与基础配置
1.1 环境准备与安装
通过yum包管理器安装 OpenLDAP 服务端及核心依赖组件:
yum -y install openldap-servers pam_ldap bind-utils
安装完成后,系统会自动创建ldap用户用于服务管理,可通过以下命令验证:
more /etc/passwd | grep ldap
1.2 版本与服务状态验证
查看 OpenLDAP 版本信息:
slapd -VV
验证基础配置文件合法性(确保服务可正常启动):
slaptest -u
# 成功提示:config file testing succeeded
1.3 日志配置
为便于问题排查,将 LDAP 日志定向到专用文件:
echo 'local4.* /var/log/ldap.log' >> /etc/rsyslog.conf
systemctl restart rsyslog.service
systemctl status rsyslog.service
1.4 管理员密码设置
使用slappasswd工具生成加密密码(用于 LDAP 管理员账户):
slappasswd
# 输入密码(示例:123456)后生成加密串,如 {SSHA}HDLnqlzEwazq7jT+WmtD9NZqZnIlYayX
1.5 服务启动与端口验证
启动slapd服务并设置开机自启:
systemctl enable slapd
systemctl restart slapd
systemctl status slapd
验证默认端口(389)是否正常监听:
netstat -antup | grep 389
# 预期输出:tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN [进程ID]/slapd
1.6 数据库初始化
OpenLDAP 默认使用 BerkeleyDB 存储数据,需配置数据库文件并设置权限:
# 复制示例数据库配置文件
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# 设置目录权限(确保ldap用户可读写)
chown ldap:ldap -R /var/lib/ldap
chmod 777 -R /var/lib/ldap
/var/lib/ldap/为 BerkeleyDB 数据库默认存储路径。
二、LDAP 目录结构与核心配置
2.1 导入基础 Schema
Schema 定义了 LDAP 目录的数据结构(对象类、属性等),需导入系统预设的基础 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
# 可选扩展Schema(根据需求导入)
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif
2.2 配置根域与管理员信息
创建slapd-config.ldif文件,定义 LDAP 根域、管理员 DN 及密码:
# 创建配置文件
vim slapd-config.ldif
文件内容(替换dc=example,dc=com为实际域名,{SSHA}xxxxxx为加密密码):
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=hadoop,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=hadoop,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}HDLnqlzEwazq7jT+WmtD9NZqZnIlYayX # 替换为slappasswd生成的密码
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=Manager,dc=hadoop,dc=com" read by * none
应用配置:
ldapmodify -Y EXTERNAL -H ldapi:/// -f slapd-config.ldif
systemctl restart slapd # 重启服务使配置生效
2.3 生成基础目录结构
使用migrationtools工具快速生成 LDAP 目录结构(根域、用户 / 组组织单元等):
-
安装工具:
yum -y install migrationtools
-
配置工具参数(修改migrate_common.ph):
vim /usr/share/migrationtools/migrate_common.ph +71
调整以下参数(根据实际域名修改):
$DEFAULT_MAIL_DOMAIN = "hadoop.com"; # 邮件域名
$DEFAULT_BASE = "dc=hadoop,dc=com"; # LDAP根域
$EXTENDED_SCHEMA = 1; # 启用扩展Schema
-
生成基础结构文件base.ldif:
cd /usr/share/migrationtools/
./migrate_base.pl > /root/base.ldif -
导入基础结构到 LDAP:
ldapadd -x -W -D "cn=Manager,dc=hadoop,dc=com" -f /root/base.ldif
若存在重复条目,可添加
-c
参数忽略错误:ldapadd -x -W -D "cn=Manager,dc=hadoop,dc=com" -c -f /root/base.ldif
2.4 配置客户端连接参数
修改ldap.conf指定 LDAP 服务地址与根域:
vim /etc/openldap/ldap.conf
添加内容:
BASE dc=hadoop,dc=com
URI ldap://172.21.35.150:389 # 替换为实际LDAP服务器IP
三、用户与组管理操作
3.1 添加用户与用户组
通过编写 LDIF 文件定义用户与组信息,建议用户 ID(UID)从 10000 开始,避免与本地用户冲突。
示例:添加 testuser 用户
-
创建testuser.ldif文件:
组信息
dn: cn=testuser,ou=Group,dc=hadoop,dc=com
objectClass: posixGroup
objectClass: top
cn: testuser
gidNumber: 3001
memberUid: testuser用户信息
dn: uid=testuser,ou=People,dc=hadoop,dc=com
uid: testuser
cn: testuser
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: testuser # 密码(实际环境建议使用加密值)
loginShell: /bin/bash
uidNumber: 3001
gidNumber: 3001
homeDirectory: /home/testuser -
导入用户:
ldapadd -x -D "cn=Manager,dc=hadoop,dc=com" -w 123456 -f testuser.ldif
-w 后为管理员密码(示例:123456)
示例:添加 hive 用户
创建hive.ldif并导入(步骤同上),注意调整gidNumber和uidNumber:
dn: cn=hive,ou=Group,dc=hadoop,dc=com
objectClass: posixGroup
objectClass: top
cn: hive
gidNumber: 1001
memberUid: hive
dn: uid=hive,ou=People,dc=hadoop,dc=com
uid: hive
cn: hive
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: hive
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/hive
3.2 常见操作命令
-
查询用户信息:
ldapsearch -x -D "cn=Manager,dc=hadoop,dc=com" -w 123456 -b 'ou=People,dc=hadoop,dc=com'
-
查询组信息:
ldapsearch -x -D "cn=Manager,dc=hadoop,dc=com" -w 123456 -b 'ou=Group,dc=hadoop,dc=com'
-
删除用户:
ldapdelete -x -D "cn=Manager,dc=hadoop,dc=com" -w 123456 'uid=testuser,ou=People,dc=hadoop,dc=com'
-
删除组:
ldapdelete -x -D "cn=Manager,dc=hadoop,dc=com" -w 123456 'cn=testuser,ou=Group,dc=hadoop,dc=com'
四、客户端集成(SSSD 配置)
SSSD(System Security Services Daemon)负责客户端与 LDAP 服务的通信及认证缓存,实现系统级别的 LDAP 身份验证。
4.1 客户端依赖安装
yum -y install openldap-clients mlocate sssd authconfig oddjob-mkhomedir nss-pam-ldapd
4.2 配置 SSSD 服务
通过authconfig命令初始化配置:
authconfig \
--enablesssd \
--enablesssdauth \
--enablerfc2307bis \
--enableldap \
--enableldapauth \
--disableforcelegacy \
--disableldaptls \
--disablekrb5 \
--enablemkhomedir \
--ldapserver ldap://172.21.35.150:389 \ # 替换为LDAP服务器IP
--ldapbasedn "dc=hadoop,dc=com" \
--update
-
若 LDAP 启用 TLS,需将--disableldaptls改为--enableldaptls。
-
若为 HA 架构,--ldapserver可指定多个地址(如ldap://ip1:389,ldap://ip2:389)。
4.3 调整 SSSD 配置文件
修改/etc/sssd/sssd.conf确保参数正确:
[domain/default]
autofs_provider = ldap
ldap_schema = rfc2307bis
ldap_search_base = dc=hadoop,dc=com
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldap://172.21.35.150:389 # 与服务端地址一致
ldap_id_use_start_tls = False
cache_credentials = True
[sssd]
services = nss, pam
domains = default
[nss]
homedir_substring = /home
[pam]
设置文件权限(SSSD 要求严格权限):
chmod 600 /etc/sssd/sssd.conf
4.4 配置 nslcd 服务
nslcd用于 LDAP 与系统名称服务的交互,修改配置:
vim /etc/nslcd.conf
内容:
uri ldap://172.21.35.150/ # LDAP服务器地址
base dc=hadoop,dc=com # 根域
4.5 PAM 与 SSH 配置
4.5.1 配置 SSH 支持 LDAP 认证
修改sshd_config启用 PAM:
# 备份配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config_bak
# 修改参数
sed -i 's%UsePAM no%UsePAM yes%g' /etc/ssh/sshd_config
4.5.2 配置 PAM 自动创建家目录
修改/etc/pam.d/sshd,添加自动创建家目录的模块:
echo 'session required pam_mkhomedir.so' >> /etc/pam.d/sshd
4.5.3 替换 PAM 认证模块
将password-auth和system-auth中的pam_sss.so替换为pam_ldap.so,确保认证通过 LDAP:
# 处理password-auth(远程服务认证,如SSH)
cp /etc/pam.d/password-auth /etc/pam.d/password-auth-bak
sed -i 's%pam_sss.so%pam_ldap.so%g' /etc/pam.d/password-auth
# 处理system-auth(本地服务认证,如su、sudo)
cp /etc/pam.d/system-auth /etc/pam.d/system-auth-bak
sed -i 's%pam_sss.so%pam_ldap.so%g' /etc/pam.d/system-auth
4.6 启动服务与验证
# 启动相关服务并设置自启
systemctl start sssd && systemctl enable sssd
systemctl start oddjobd && systemctl enable oddjobd
systemctl start nslcd && systemctl enable nslcd
systemctl restart sshd # 重启SSH服务
# 清空SSSD缓存(首次配置后建议执行)
sss_cache -E
# 验证LDAP用户是否可被识别
id testuser
# 预期输出:uid=3001(testuser) gid=3001(testuser) groups=3001(testuser)
# 测试SSH登录
ssh testuser@localhost # 本地测试
ssh testuser@172.21.35.150 # 远程测试
五、从节点配置(集群环境)
对于多节点集群,可通过复制主节点配置快速部署从节点:
-
从节点安装依赖:
yum -y install openldap-clients mlocate sssd authconfig oddjob-mkhomedir nss-pam-ldapd
-
复制主节点配置文件:
在主节点执行,复制核心配置到从节点(以cdh02为例)
scp /etc/openldap/ldap.conf root@cdh02:/etc/openldap/
scp /etc/sssd/sssd.conf root@cdh02:/etc/sssd/
scp /etc/pam.d/system-auth root@cdh02:/etc/pam.d/
scp /etc/pam.d/password-auth root@cdh02:/etc/pam.d/
scp /etc/ssh/sshd_config root@cdh02:/etc/ssh/
scp /etc/nslcd.conf root@cdh02:/etc/ -
从节点启动服务并验证:
systemctl start sssd oddjobd nslcd sshd
systemctl enable sssd oddjobd nslcd sshd
sss_cache -E # 清空缓存
id testuser # 验证用户识别
ssh testuser@cdh02 # 测试登录
六、注意事项
-
用户 ID 规划:LDAP 用户 UID 建议从 10000 开始,避免与本地用户(通常 1-1000)冲突。
-
权限控制:/var/lib/ldap/目录必须确保ldap:ldap权限,否则服务无法读写数据。
-
安全建议:生产环境中应启用 TLS 加密(配置ldap_tls_cacertdir),并使用强密码(避免示例中的 123456)。
-
本地用户保留:root用户必须保留为本地用户,LDAP 中禁止创建同名用户,防止权限混乱。
-
配置一致性:集群节点的ldap.conf、sssd.conf等文件需保持一致,避免认证异常。
通过以上步骤,可搭建一套稳定的 OpenLDAP 集中式认证系统,实现多节点环境下的统一用户管理,适用于 Hadoop、Kubernetes 等集群场景。