Linux用LDAP或AD实现统一身份控制的核心是NSS、PAM、Samba三者配置对齐并指向同一目录数据:LDAP需启用nsswitch.conf中ldap条目、加载samba.schema、smb.conf设ldapsam;AD需security=ads、idmap映射、Kerberos与DNS就绪、winbind运行,且PAM模块正确集成。

Linux 上用 LDAP 或 AD 实现统一身份控制,核心是让系统用户认证和账号管理不再依赖本地文件(/etc/passwd、/etc/shadow、/etc/group),而是通过网络目录服务集中拉取。关键不在于“能不能连上”,而在于 NSS、PAM、Samba 三者配置是否对齐,且每层都指向同一套用户数据结构。
LDAP 集成:OpenLDAP + Samba 的基础链路
适用于自建目录环境(如 OpenLDAP 搭配 smbldap-tools):
-
NSS 层必须启用 ldap:修改
/etc/nsswitch.conf,确保这三行包含ldap:passwd: files ldapshadow: files ldapgroup: files ldap -
OpenLDAP 要加载 samba.schema:把 Samba 提供的
samba.schema复制到/etc/openldap/schema/,并在slapd.conf或cn=config中显式 include;否则无法存储 Samba 特有属性(如sambaSID、sambaNTPassword) -
Samba 认证后端设为 ldapsam:在
smb.conf的[global]段写明:passdb backend = ldapsam:ldap://127.0.0.1/ldap suffix = dc=example,dc=comldap admin dn = cn=admin,dc=example,dc=com
同时配好ldap user suffix和ldap group suffix,让 Samba 知道去哪里查用户和组
AD 域集成:Linux 加入 Windows 域的标准流程
适用于企业已有 Active Directory,希望 Linux 主机作为域成员参与统一权限管理:
-
security 必须是 ads,不是 user 或 domain:Samba 配置中
security = ads是硬性要求;设成user就退化为本地密码验证,完全绕过 AD -
idmap 配置不可省略:AD 用户没有 UID/GID,Linux 需靠 idmap 映射。至少要配:
idmap config * : backend = tdbidmap config * : range = 10000-20000
否则getent passwd 'DOMAIN\user'查不到结果,SSH 或 Samba 登录都会失败 -
Kerberos 和 DNS 必须就绪再加域:执行
net ads join前,先运行kinit administrator@YOURDOMAIN.LOCAL(注意 realm 全大写);同时确认/etc/resolv.conf的 nameserver 是 DC IP,且主机名能被正反向 DNS 解析(host $(hostname)和host $(ip route get 1 | awk '{print $7}')都应返回 FQDN)
权限落地:让共享和登录真正生效
光连上目录还不够,用户得能在实际场景中使用:
-
winbind 或 nslcd 必须运行:AD 场景启用
winbind服务;LDAP 场景常用nslcd或sssd。启动后检查getent passwd是否列出域用户 -
共享访问控制需匹配目录结构:例如限制只有 AD 组
Finance访问某共享,smb.conf 中写:valid users = @"FINANCE"(注意大小写和 @ 符号);若用 LDAP,则对应组名需与ldap group suffix下的 DN 匹配,如cn=finance,ou=Groups,dc=example,dc=com -
PAM 需支持 LDAP/AD 认证:通常由
pam_ldap.so或pam_winbind.so提供;确认/etc/pam.d/system-auth或common-auth中已包含对应模块,否则 SSH 登录会失败
常见卡点与验证顺序
出问题时别直接重装,按这个顺序排查:
- 用
ldapsearch -x -H ldap://server -b "dc=ex,dc=com" -D "cn=admin..." -W测试 LDAP 连通性和绑定权限 - 用
kinit+klist验证 Kerberos 是否拿到票据(AD 场景) - 运行
getent passwd 'DOMAIN\user'或getent passwd uidnumber看 NSS 是否解析成功 - 执行
smbclient -L //localhost -U 'DOMAIN\user'测试 Samba 层能否完成完整认证流程


















