openssh 通过系统级 pam 和 nss 机制集成 ldap 实现统一认证,关键在于配置 nss(如 sssd)使系统识别 ldap 用户,再通过 pam(如 pam_sss.so)让 ssh 验证 ldap 密码,无需修改 openssh 自身配置。

OpenSSH 本身不直接支持 LDAP 认证,但可通过系统级 PAM(Pluggable Authentication Modules)与 NSS(Name Service Switch)机制,将 SSH 登录与 LDAP 目录服务打通,实现企业级统一身份认证。关键不在 OpenSSH 配置本身,而在于 Linux 系统如何将用户查询和密码验证委托给 LDAP。
一、前提条件:确保 LDAP 服务可用且客户端可访问
必须已有运行正常的 LDAP 服务(如 OpenLDAP 或 Microsoft Active Directory),并确认以下几点:
- LDAP 服务器地址、端口(通常为 389 或 LDAPS 的 636)、Base DN(如 dc=example,dc=com)已明确
- 客户端机器能网络连通 LDAP 服务器(telnet ldap.example.com 389 或 ldapsearch -x -H ldap://ldap.example.com -b "dc=example,dc=com" -D "cn=admin,dc=example,dc=com" -W 可测试)
- 已规划用于 SSH 认证的 LDAP 用户属性:通常用 uid(对应 Linux 用户名)、userPassword(或 AD 中的 unicodePwd,需注意加密方式)
二、配置 NSS:让系统“看得到”LDAP 用户
编辑 /etc/nsswitch.conf,启用 LDAP 查询用户与组信息:
- 修改两行:
passwd: files ldap
group: files ldap - 安装并配置 libnss-ldapd(Debian/Ubuntu)或 sssd(RHEL/CentOS/Fedora 推荐)作为 NSS 后端;sssd 更健壮,支持缓存、TLS、AD 集成等
- 以 SSSD 为例:配置 /etc/sssd/sssd.conf,指定 id_provider = ldap,设置 ldap_uri、ldap_search_base、ldap_id_use_start_tls 等,并确保权限为 600,然后启动 sssd 服务
三、配置 PAM:让 SSH 登录“验得了”LDAP 密码
OpenSSH 通过 PAM 进行认证,因此需调整 SSH 对应的 PAM 配置文件(通常是 /etc/pam.d/sshd):
- 确保该文件包含 auth [success=done default=ignore] pam_succeed_if.so user ingroup nopasswdlogin 等逻辑前,加入 LDAP 验证模块(如 auth [success=ok default=bad] pam_ldap.so 或更推荐的 auth [success=ok default=bad] pam_sss.so)
- 若使用 SSSD,只需在 /etc/pam.d/sshd 中添加一行:
auth [default=ignore] pam_sss.so - 禁用本地密码 fallback(如需严格 LDAP-only 登录),可移除或注释掉 pam_unix.so 的 auth 行;但建议保留,便于应急登录
四、OpenSSH 服务端微调与安全加固
SSH 本身无需特殊 LDAP 参数,但需确认以下设置以保障体验与安全:
- 确认 /etc/ssh/sshd_config 中 UsePAM yes 已启用(默认开启)
- 如需限制仅 LDAP 用户登录,可配合 AllowGroups 或 AllowUsers,例如:
AllowGroups ldapusers(前提是 LDAP 中该组已映射到本地组名,或通过 SSSD 的 ldap_group_object_class 等正确同步) - 强制密钥登录 + LDAP 认证(双因子增强):设 PasswordAuthentication no,同时允许公钥认证;此时 LDAP 仅用于用户存在性校验与授权,不参与密码验证——适用于已部署 SSH 密钥体系的企业
不复杂但容易忽略:每次修改 NSS/PAM 配置后,务必重启相关服务(systemctl restart sssd 或 systemctl restart nslcd),并用 getent passwd username 和 su - username 本地测试,再尝试 SSH 登录。避免直接锁死 root 或唯一管理员账户。










