LDAP认证需分层排查:先确保nss能查(/etc/nsswitch.conf含ldap且nslcd运行正常),再验证pam能验(PAM配置中pam_ldap.so位置正确、account段不缺失),最后确认服务(如sshd)启用该流程,同时TLS加密与家目录创建等细节不可忽略。

LDAP 认证不是“配完就能用”,而是要让系统真正信任并能查到远端目录里的用户——多数失败都卡在“查得到但认不了”或“认得了但没家目录/没权限”。
怎么让 Linux 真正“看见”LDAP 用户
核心是三件事:让 nss 能查、让 pam 能验、让服务(比如 sshd)愿意走这套流程。
-
/etc/nsswitch.conf中的passwd:和group:行必须包含ldap,且顺序重要:files ldap表示先查本地/etc/passwd,查不到才问 LDAP;写成ldap files会导致本地 root 登录失败 -
nss-pam-ldapd(即nslcd)必须运行,且配置文件/etc/nslcd.conf里uri、base、binddn和bindpw都得对——尤其注意base是dc=example,dc=com这种格式,不是 URL 或路径 - 测试是否“看见”:运行
getent passwd testuser。有输出说明 NSS 层通了;没输出,先检查nslcd日志(journalctl -u nslcd),再用ldapsearch -x -H ldap://server -b "dc=example,dc=com" "(uid=testuser)"手动验证连通性和搜索权限
为什么 PAM 配错会导致“能登录但 sudo 失败”
PAM 不只是管“密码对不对”,还管“登录后该给什么 shell、home 目录在哪、能不能执行 sudo”。默认配置几乎从不兼容 LDAP 场景。
- 关键模块是
pam_ldap.so,不是pam_unix.so—— 后者只认本地密码哈希;auth [success=ok default=ignore] pam_ldap.so use_first_pass这行必须加在/etc/pam.d/system-auth或common-auth里,且位置要在pam_unix.so之前(否则永远走不到 LDAP) -
account段漏配会直接拒绝登录:必须加account [default=bad success=ok user_unknown=ignore] pam_ldap.so,否则即使密码正确,PAM 也会因无法确认账户状态而拦住 - sudo 权限不会自动继承——LDAP 用户想用
sudo,要么在/etc/sudoers里显式加%ldapgroup ALL=(ALL) NOPASSWD: ALL,要么在 LDAP 服务器上用sudoRole对象类定义规则(需额外配置sudoersschema 和sssd或ldapsudo 支持)
家目录不自动创建?mkhomedir 不是万能开关
authconfig --enablemkhomedir 或 authselect select sssd --force 确实能触发自动建家目录,但前提是 PAM 的 session 段真调用了它。
- 检查
/etc/pam.d/system-auth是否含session optional pam_mkhomedir.so umask=0022 skel=/etc/skel;缺这行,--enablemkhomedir就是摆设 - 如果用的是
sssd(FreeIPA 或现代发行版推荐方案),则靠override_homedir和create_homedir = True控制,和nslcd完全无关——混用两种客户端是常见翻车点 - 家目录路径必须和 LDAP 中
homeDirectory属性值一致;若 LDAP 里存的是/home/testuser,但系统尝试建在/users/testuser,就会失败且无明确报错
加密和 TLS 容易被跳过,但生产环境不能妥协
明文传 LDAP 密码 = 把所有用户口令裸奔在内网——哪怕你信得过交换机,也挡不住抓包、中间人或误配的镜像端口。
-
ldaps://(端口 636)或StartTLS(端口 389)二选一,别用ldap://;nslcd.conf中必须设ssl start_tls或ssl on,并指定tls_cacertfile /etc/openldap/certs/ca.crt - 证书主机名必须匹配 LDAP 服务器真实 FQDN;若用 IP 访问却配了域名证书,
nslcd会静默失败(日志里只有 “TLS initialization failed”) - OpenLDAP 服务端若未启用
olcSecurity策略(如simple_bind: require strong),客户端即使配了 TLS,服务端仍允许降级到明文——安全是两端的事,单边努力没用

















