Debian Samba 与 OpenLDAP 统一认证配置
1. 服务介绍
Samba 通过 SMB/CIFS 为 Linux、Windows 等客户端提供跨平台文件共享;OpenLDAP 用于集中保存用户、组和目录属性。将 Samba 与 OpenLDAP 结合,可以让共享服务使用统一的 LDAP 身份进行认证,减少多台服务器重复创建本地账号的维护成本,适合实验环境、团队共享目录和需要集中账号管理的局域网场景。
2. 准备运行环境
• **系统**:Debian 系 Linux,Server1 与 Server2 位于同一实验网络。
• **角色**:Server1 作为 OpenLDAP 服务器,Server2 作为 Samba 文件共享服务器,Client1 作为访问验证客户端。
• **目录域**:示例使用 qwe.com,对应 LDAP 基准 DN 为 dc=qwe,dc=com;实际环境请替换为自己的域名。
• **权限**:使用 root 或具备 sudo 权限的管理员账号。
• **网络**:确保主机名解析、默认网关和 Server1/Server2/Client1 之间的连通性正常。
• **软件源**:apt 软件源可用,可安装 slapd、ldap-utils、migrationtools、Samba 及 LDAP 客户端组件。
• **端口**:LDAP 通常使用 TCP 389/636,Samba 常用 TCP 445,部分旧环境还会使用 139;防火墙只放行实验所需端口。
• **操作建议**:修改 slapd、LDAP 模板或 /etc/samba/smb.conf 前先备份;密码使用实际环境中的安全值,不要把明文密码写入公开文章或脚本。
3. 相关知识
• LDAP 条目通过 DN 定位。dc 表示域组件,ou 表示组织单位,uid 表示用户标识,uidNumber 和 gidNumber 用于 Unix/Linux 身份映射。
• Samba 认证不仅受 LDAP 查询影响,还受 Samba 配置、系统用户/组、共享目录属主、目录权限和 ACL 共同影响。
• pdbedit -L 用于查看 Samba 本地账号数据库;LDAP 账号能查询到,不等于已经完成 Samba 侧的认证和授权配置。
• testparm -s 可以检查 Samba 配置语法并显示解析后的配置。修改配置后先检查,再重启服务。
• 共享目录至少要同时检查 Linux 文件权限和 Samba valid users、read only、write list 等参数;只修改其中一层,可能仍然无法读写。
• 生产环境应优先使用加密 LDAP(LDAPS 或 StartTLS),并限制 LDAP 管理员 DN 的访问范围;本实验以明文 LDAP 连接验证基本流程。
• 认证失败时按"网络连通性 → LDAP 查询 → NSS/PAM 映射 → Samba 配置 → 目录权限 → 日志"的顺序排查,避免直接反复重启服务。
4. 实验步骤
4.1 Server1:安装并配置 OpenLDAP
Server1:LDAP 服务器。

4.1.1 安装 LDAP 组件
bash
apt update
apt install -y slapd ldap-utils migrationtools

4.1.2 修改 LDAP 基础配置
根据实验域名修改 LDAP 配置文件中的基础域、管理员 DN 和相关默认参数;示例域名为 qwe.com。

4.1.3 修改监听地址
确认 slapd 监听实验网络所需地址和端口,避免只监听回环地址导致 Server2 无法访问。

4.1.4 修改 migrationtools 默认域名
将 migrationtools 模板中的默认域名改为实验使用的 LDAP 域名。

4.1.5 复制 migrationtools 配置文件
按实验环境将 migrationtools 的配置文件复制到 /etc/perl,供后续生成 LDAP 条目使用。

4.1.6 重新配置 slapd
执行交互式配置,填写与实验域一致的域名、组织名和管理员密码。密码只在本机交互输入,不要照抄示例中的明文值。
bash
dpkg-reconfigure slapd

配置过程中的页面截图:








4.1.7 查看 LDAP 域条目
完成初始化后,查看基准域和目录结构是否创建成功。

4.1.8 创建模板组和用户
创建本地组、用户信息,作为导入 LDAP 的模板。uidNumber、gidNumber 建议使用大于 5000 的值,避免与客户端本地账号冲突;模板用户必须设置密码。

4.1.9 导出用户信息
将本地模板用户和组转换为 migrationtools 可处理的格式。

4.1.10 生成 LDAP 组织单位、用户和组条目
创建组织单位
生成组织单位条目,并将文件中的域信息修改为实验环境的基准 DN。

根据目录用途整理条目内容:groups 用于保存用户组,Users 用于保存用户。

生成用户组和用户模板文件
生成组和用户模板文件,并将其中的域信息、组织单位和属性值改为实验环境中的实际值。



4.1.11 导入 LDAP 数据
将组织单位、用户和组条目导入 LDAP,并分别查询组与用户确认导入结果。

查看组:

查看用户:

4.2 Server2:配置 Samba LDAP 客户端
Server2:Samba 文件共享服务器。先安装 Samba、LDAP 客户端及 NSS/PAM 相关组件,再按图示填写 Server1 地址、基准 DN 和认证参数。



4.2.1 填写 LDAP 服务器地址
将 LDAP 服务器地址、基准 DN 和查询参数配置为 Server1 的实际信息。



4.2.2 创建 Samba 共享目录
创建共享目录,并先确认目录属主、属组和基础权限符合实验要求。

4.2.3 添加 Samba 共享配置
在 /etc/samba/smb.conf 中添加共享定义,按实验需要设置共享路径、可写权限和允许访问的 LDAP 用户或组。

4.2.4 重启 Samba 服务
修改配置后先检查语法,再重启服务。

4.2.5 添加 Samba 认证账号
按实验要求将 LDAP 用户加入 Samba 认证数据库;该步骤的实际命令以 Server2 的 Samba 版本和当前认证方案为准。


4.3 Client1:访问共享验证
Client1:客户端。使用 LDAP 用户访问 Server2 共享目录,验证账号查询、身份认证和文件读写权限。


5. 验证结果
5.1 Server1:验证 OpenLDAP
bash
systemctl is-active slapd
ss -lntup | egrep ':(389|636)\b'
ldapsearch -x -H ldap://127.0.0.1 -b dc=qwe,dc=com -s base
ldapsearch -x -H ldap://127.0.0.1 -b ou=Users,dc=qwe,dc=com '(uid=*)' uid uidNumber gidNumber
journalctl -u slapd -n 50 --no-pager
确认 slapd 处于 active 状态、LDAP 端口监听正常,并能查询基准域、用户和组条目。
5.2 Server2:验证 Samba 和 LDAP 身份映射
bash
testparm -s
systemctl is-active smbd nmbd 2>/dev/null || systemctl is-active smbd
ss -lntup | egrep ':(445|139)\b'
getent passwd <ldap-user>
getent group <ldap-group>
pdbedit -L
journalctl -u smbd -n 50 --no-pager
testparm -s 无语法错误,Samba 服务处于 active 状态,getent 能查询 LDAP 用户或组,说明客户端身份映射链路基本生效。
5.3 Client1:验证共享访问和权限
bash
smbclient -L //<samba-server> -U <ldap-user>
smbclient //<samba-server>/<share-name> -U <ldap-user> -c 'ls'
smbclient //<samba-server>/<share-name> -U <ldap-user> -c 'put test.txt; ls'
在 Windows 客户端也可以访问 \\<samba-server>\<share-name>。验证时分别测试允许访问的用户和不允许访问的用户,检查共享列表、目录读取和文件写入结果是否符合预期。若认证失败,优先查看 journalctl -u smbd、Samba 日志、LDAP 查询结果以及共享目录权限。
6. 常见问题排查
• **LDAP 查询不到用户**:检查 Server1 的基准 DN、用户所在 ou、LDAP 端口和 ldapsearch 查询过滤器。
• **Server2 无法获取 LDAP 用户**:检查 NSS/PAM 配置、getent passwd、Server1 网络连通性和防火墙。
• **Samba 能列出共享但不能写入**:同时检查 smb.conf 共享参数、目录属主/属组、Linux 权限和 ACL。
• **认证反复失败**:清理客户端缓存凭据后重试,并对照 Samba 与 LDAP 日志确认实际失败阶段。
• **配置改完服务无法启动**:先执行 testparm -s,再查看 systemctl status smbd 和 journalctl -u smbd。