本教程将使用 Ubuntu 22.04 作为服务器操作系统,但步骤同样适用于其他基于 Debian 的发行版(如 Debian)。

第一部分:LDAP 服务器端搭建
环境准备
- 服务器: 一台干净的 Ubuntu 22.04 虚拟机或物理机。
- IP 地址: 假设服务器 IP 为
168.1.100。 - 域名: 假设域名为
example.com。 - 主机名: 设置服务器主机名,
ldap-server。sudo hostnamectl set-hostname ldap-server
- 更新系统
sudo apt update && sudo apt upgrade -y
安装 OpenLDAP 及相关工具
OpenLDAP 是最流行的开源 LDAP 实现,我们还需要安装 slapd (LDAP 守护进程) 和 ldap-utils (客户端工具)。
sudo apt install -y slapd ldap-utils
安装过程中,系统会要求你设置管理员密码。请务必记住这个密码,这是你 cn=admin,dc=example,dc=com 用户的密码,如果错过了设置,可以通过 sudo dpkg-reconfigure slapd 重新配置。
重新配置 slapd (如果需要)
如果你错过了设置密码,或者想修改配置(如 Base DN),可以运行:
sudo dpkg-reconfigure slapd
在配置向导中,你会被问到以下问题:

- Omit OpenLDAP server configuration?: 选择
<No>。 - DNS domain name: 输入你的域名,
example.com。 - Organization name: 输入你的组织名,
Example Inc。 - Administrator password: 输入你之前设置的 LDAP 管理员密码。
- Database backend to use: 选择
HDB(HDB 是 BDB 的现代替代品,支持后缀子树)。 - Do you want to allow the removal of database when slapd is purged?: 选择
<Yes>。 - Move old database?: 选择
<Yes>。 - Force secured protocol?: 选择
<No>(为了方便测试,生产环境应考虑使用 LDAPS 或 StartTLS)。
配置完成后,OpenLDAP 服务会自动启动。
初始化 LDAP 数据库结构
我们需要定义我们的组织结构,我们会创建一个 ou=People (用于存放用户) 和一个 ou=Groups (用于存放组)。
我们将使用 ldapadd 命令来添加这些条目,创建一个包含 LDIF (LDAP Data Interchange Format) 文件的脚本。
创建 base.ldif 文件:

cat << EOF > base.ldif dn: ou=People,dc=example,dc=com objectClass: organizationalUnit ou: People dn: ou=Groups,dc=example,dc=com objectClass: organizationalUnit ou: Groups EOF
执行导入:
# 使用管理员身份和密码进行导入 sudo ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f base.ldif
系统会提示你输入之前设置的 cn=admin 密码,如果成功,你会看到 added 的提示。
创建测试用户和组
现在我们来创建一个测试用户 testuser 和一个测试组 developers。
创建 users.ldif 文件:
cat << EOF > users.ldif
dn: uid=testuser,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: testuser
sn: User
givenName: Test
cn: Test User
userPassword: {SSHA}your_encrypted_password <!-- 注意:这里需要生成密码 -->
uidNumber: 10000
gidNumber: 10000
homeDirectory: /home/testuser
loginShell: /bin/bash
dn: cn=developers,ou=Groups,dc=example,dc=com
objectClass: posixGroup
cn: developers
gidNumber: 10000
memberUid: testuser
EOF
关键步骤:生成加密密码
你不能直接明文写密码,需要使用 slappasswd 命令生成。
slappasswd
- 系统会提示你输入并确认一个明文密码(
MySecretPassword123)。 - 然后会输出一串加密后的字符串,格式类似
{SSHA}xxxxxxxxxxxx。 - 将这个完整的字符串(包括
{SSHA})复制到users.ldif文件的userPassword字段中。
执行导入:
sudo ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f users.ldif
验证 LDAP 服务器
使用 ldapsearch 命令来查询我们刚刚创建的数据。
# 查询整个目录树 sudo ldapsearch -x -b "dc=example,dc=com" "(objectClass=*)" # 只查询用户 sudo ldapsearch -x -b "ou=People,dc=example,dc=com" "uid=testuser" # 只查询组 sudo ldapsearch -x -b "ou=Groups,dc=example,dc=com" "cn=developers"
如果能看到正确的条目信息,说明你的 LDAP 服务器已经成功搭建并配置好了!
第二部分:客户端配置 (Ubuntu/Debian)
现在我们配置另一台 Ubuntu 客户端,使其能够通过我们刚搭建的 LDAP 服务器进行用户认证。
安装客户端工具
sudo apt install -y libnss-ldap libpam-ldap nslcd
安装过程中会出现配置向导,请仔细填写以下信息:
- LDAP server URI:
ldap://192.168.1.100(如果你的服务器 LDAPS,则用ldaps://...) - Distinguished name of the search base:
dc=example,dc=com - LDAP version to use: 选择
3 - Make local root database admin: 选择
<No> - Does the LDAP database require login?: 选择
<No> - LDAP account for root:
cn=admin,dc=example,dc=com - LDAP root password: 输入你在服务器上设置的 LDAP 管理员密码。
- How to authenticate to the LDAP server: 选择
crypt(如果用户密码在 LDAP 中是明文或 SSHA 加密,这个选项通常没问题)。
配置完成后,nslcd 服务会自动启动。
配置 NSS 和 PAM
编辑 /etc/nsswitch.conf 文件,确保 passwd, group, shadow 这三项包含 ldap。
sudo nano /etc/nsswitch.conf
类似这样(ldap 可以在 files 之后或之前,但通常推荐在 files 之后作为后备):
passwd: files ldap
group: files ldap
shadow: files ldap
测试用户认证
创建本地用户家目录 (可选但推荐)
为了让首次登录的用户能自动创建家目录,可以安装 pam_mkhomedir。
sudo apt install -y pam_mkhomedir
然后编辑 /etc/pam.d/common-session,在文件末尾添加一行:
sudo nano /etc/pam.d/common-session
添加:
session required pam_mkhomedir.so skel=/etc/skel umask=0077
进行测试
-
在客户端上,尝试切换到 LDAP 用户:
su - testuser
如果一切正常,你应该能成功切换,并且系统会自动为
testuser创建/home/testuser目录。 -
在另一个终端,直接使用 SSH 尝试登录
testuser:ssh testuser@<客户端的IP地址>
输入你在
users.ldif中为testuser设置的密码,应该能成功登录。
第三部分:进阶配置 (可选)
使用 Samba 集成 (共享目录)
如果你想通过 LDAP 管理可以在 Windows (Samba) 和 Linux 上登录的用户,需要集成 Samba。
在服务器上安装 Samba:
sudo apt install -y samba
安装 Samba LDAP 工具:
sudo apt install -y smbldap-tools
配置 Samba:
- 备份原配置文件:
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak - 编辑
/etc/samba/smb.conf,在[global]部分添加或修改:[global] security = user passdb backend = ldapsam:ldap://127.0.0.1 ldap admin dn = cn=admin,dc=example,dc=com ldap suffix = dc=example,dc=com ldap group suffix = ou=Groups ldap user suffix = ou=People ldap machine suffix = ou=Computers ldap idmap suffix = ou=Idmap - 创建一个共享目录:
sudo mkdir -p /srv/samba/share sudo chown nobody:nogroup /srv/samba/share sudo chmod 777 /srv/samba/share
- 在
smb.conf末尾添加共享定义:[share] comment = Samba Share path = /srv/samba/share browsable = yes guest ok = yes read only = no
同步 Samba 和 LDAP 密码
smbldap-tools 提供了脚本,你需要先配置 /etc/samba/smbldap.conf 文件,使其与你的 LDAP 设置匹配,然后可以使用 smbpasswd 命令来管理用户的 Samba 密码。
# 为 testuser 设置 Samba 密码 sudo smbpasswd -a testuser
testuser 就可以通过 Samba 访问共享目录了。
启用 SSL/TLS (生产环境必需)
在生产环境中,LDAP 通信必须加密以防止密码和数据被窃听,这需要配置 LDAPS (LDAP over SSL) 或 StartTLS。
- 生成证书: 你可以使用 OpenSSL 生成自签名证书,或者从受信任的 CA 获取。
- 将证书放到服务器:
/etc/ssl/certs/和/etc/ssl/private/。 - 修改 slapd 配置: 编辑
/etc/ldap/slapd.conf(或通过cn=config动态配置),启用TLSCertificateFile和TLSCertificateKeyFile。 - 重启 slapd 服务:
sudo systemctl restart slapd。 - 修改客户端配置: 将客户端的 LDAP URI 从
ldap://改为ldaps://或ldap://... starttls=yes。
总结与排错
- 查看日志: 遇到问题时,首先查看日志。
- 服务器日志:
journalctl -u slapd -f - 客户端日志:
journalctl -u nslcd -f
- 服务器日志:
- 防火墙: 确保服务器的防火墙(如
ufw)允许 LDAP 端口(389/TCP, 636/TCP for LDAPS)。sudo ufw allow 389/tcp sudo ufw allow 636/tcp
- SELinux/AppArmor: 如果启用了这些强制访问控制工具,可能会阻止 LDAP 服务,可以先禁用它们来测试,如果问题解决,再学习如何编写正确的策略。
这份指南涵盖了从零开始搭建一个功能可用的 LDAP 服务器的全过程,祝你搭建顺利!
