我在 Ubuntu 20 上设置了一对 OpenLDAP 服务器,并使用 Syncrepl 进行定向故障转移。LDAP 用户可以成功执行的操作包括:
- 登录
su - <uid>
- 从 PHPLDAPAdmin 或 Apache Directory Studio 进行远程绑定
id <uid>
但是,同一个 LDAP 用户无法使用 SSH 登录。(本地用户可以。)以下是 OpenLDAP 服务器日志的摘录:
Oct 19 18:29:38 s-tow-01 slapd[15532]: conn=1185 fd=20 ACCEPT from IP=127.0.0.1:60066 (IP=0.0.0.0:389)
Oct 19 18:29:38 s-tow-01 slapd[15532]: conn=1185 op=0 BIND dn="cn=admin,dc=878,dc=home,dc=arpa" method=128
Oct 19 18:29:38 s-tow-01 slapd[15532]: conn=1185 op=0 BIND dn="cn=admin,dc=878,dc=home,dc=arpa" mech=SIMPLE ssf=0
Oct 19 18:29:38 s-tow-01 slapd[15532]: conn=1185 op=0 RESULT tag=97 err=0 text=
Oct 19 18:29:38 s-tow-01 slapd[15532]: conn=1185 op=1 SRCH base="dc=house,dc=878,dc=home,dc=arpa" scope=2 deref=0 filter="(uid=webmin)"
Oct 19 18:29:38 s-tow-01 slapd[15532]: conn=1185 op=1 SRCH attr=host authorizedService shadowExpire shadowFlag shadowInactive shadowLastChange shadowMax shadowMin shadowWarning uidNumber
Oct 19 18:29:38 s-tow-01 slapd[15532]: conn=1185 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
Oct 19 18:29:38 s-tow-01 slapd[15532]: conn=1185 op=2 BIND anonymous mech=implicit ssf=0
Oct 19 18:29:38 s-tow-01 slapd[15532]: conn=1185 op=2 BIND dn="uid=webmin,ou=users,dc=house,dc=878,dc=home,dc=arpa" method=128
Oct 19 18:29:38 s-tow-01 slapd[15532]: conn=1185 op=2 RESULT tag=97 err=49 text=
Oct 19 18:29:38 s-tow-01 slapd[15532]: conn=1185 op=3 BIND dn="cn=admin,dc=878,dc=home,dc=arpa" method=128
Oct 19 18:29:38 s-tow-01 slapd[15532]: conn=1185 op=3 BIND dn="cn=admin,dc=878,dc=home,dc=arpa" mech=SIMPLE ssf=0
Oct 19 18:29:38 s-tow-01 slapd[15532]: conn=1185 op=3 RESULT tag=97 err=0 text=
用户 ( uid=webmin
) 的绑定尝试导致错误 49,即凭证无效。但是,对于上面列出的其他情况,相同的凭证是有效的。
我已经遇到这个问题有一段时间了,在绝望中,我试图通过安装 SSSD 来解决它。这只是为了解释一下,在上面的日志中,我不知道第一行 ( ACCEPT from IP=127.0.0.1:60066
) OpenLDAP 服务器是在与 SSSD 还是 SSH 通信。不过,很明显,它没有使用 StartTLS,否则它会使用 StartTLS。这很重要吗?OpenLDAP 服务器是否会因为不是 StartTLS 而原则上拒绝身份验证尝试?
我已经运行pam-auth-update
并告诉它我正在使用 LDAP、SSSD 等,但尽管文件中有一两处小改动,但并没有什么区别common-*
。
我不知道如何调试它。我已经没有东西可以谷歌搜索了。有人能帮我吗?
答案1
一种非常简单的蛮力方式可以快速找出您遗漏的内容或哪个文件可能需要编辑(正如您提到的,用户是已知的并且可以执行许多操作,它可能只需要将其名称添加到 /etc 下的某个文件中):
# compare with another regular username (ex: "smith") that can log in via ssh
grep -rl "smith" /etc # and look particularly : ssh related files, sudoers, etc
grep -rl "webmin" /etc # and compare, see what's missing
答案2
我找到了问题的答案。简而言之,/etc/ssh/sshd_config
至少在 Ubuntu 20 中,需要将以下行添加到:
PAMAuthenticationViaKbdInt yes
然后经过 LDAP 验证的 SSH 就可以工作了。
但是,systemctl status ssh
会出现以下警告:
Deprecated option PAMAuthenticationViaKbdInt
所以这只是一个临时解决方案。如果有人知道如何解决此问题并避免使用 PAMAuthenticationViaKbdInt,请将其添加为答案。然后我会将其标记为可接受的答案。