OpenSSH 结合 PAM 和密码的问题

OpenSSH 结合 PAM 和密码的问题

出于个人兴趣,我尝试使用 MFA,但遇到了一个我无法解决的问题。我最近设置了 PAM(使用 Google Authenticator),并希望将其与另一种类型的身份验证相结合。

我有几个帐户和 sshd_config 如下:

PasswordAuthentication no
PermitEmptyPasswords no
AuthenticationMethods publickey,keyboard-interactive
ChallengeResponseAuthentication yes
UsePAM yes

Match User user2
PasswordAuthentication yes
AuthenticationMethods password,keyboard-interactive

对于除“user2”之外的所有用户,我都可以使用密钥和验证码正确进行身份验证。但是,尝试与“user2”连接时会出现问题。尝试从客户端连接时,我正确地获得了密码和验证码提示。但预期的密码不是“user2”帐户密码(假设是“hunter2”),而是应用程序中看到的验证码:

$ ssh user2@machine -p port
user2@machine's password:

当我在密码提示中输入“hunter2”时,我被拒绝了。但是,如果我输入应用程序中显示的验证码,我就会进入下一个提示:

$ ssh user2@machine -p port
user2@machine's password:
Verification Code:

当然,这需要再次输入验证码。然后我就登录成功了。

我在 user2-block 中尝试了几种不同的组合:

Match User user2
PasswordAuthentication yes
AuthenticationMethods password

上面需要在密码提示中输入验证码,就像上面一样,它在验证码提示之前成功登录了我。

我的 /etc/pam.d/sshd 文件除了添加以下内容外,完全未受影响:

auth required pam_google_authenticatior.so

并注释掉

@include common-auth

->

#@include common-auth
auth required pam_google_authenticatior.so

答案1

这是 OpenSSH 的正常结果。passwordkeyboard-interactiveauth 方法都设计使用 PAM,并且都调用完全相同的 PAM 堆栈。(毕竟,您确实有“UsePAM yes”,这意味着您告诉它使用 PAM 进行密码验证,因此它会尽职尽责地调用 PAM 来验证它认为的密码。)因此它们两者都将接受相同的输入。

这两种机制之间的唯一区别在于,只有“键盘交互”才允许 PAM 连续显示多个提示,或者更改显示的提示文本。而“密码”是一种固定格式的机制——发送到 SSH 客户端的实际“提示”;它只要求您输入一个密码,仅此而已。

换句话说,将这两种机制结合起来是没有用的——你不能让 OpenSSH 分别验证密码和令牌,要么全有,要么全无。(尽管在 OpenSSH 中指定两个不同的 PAM 堆栈的能力已被多次提出,但到目前为止,还没有这样的补丁被接受。)

相关内容