出于个人兴趣,我尝试使用 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 的正常结果。password
和keyboard-interactive
auth 方法都设计使用 PAM,并且都调用完全相同的 PAM 堆栈。(毕竟,您确实有“UsePAM yes”,这意味着您告诉它使用 PAM 进行密码验证,因此它会尽职尽责地调用 PAM 来验证它认为的密码。)因此它们两者都将接受相同的输入。
这两种机制之间的唯一区别在于,只有“键盘交互”才允许 PAM 连续显示多个提示,或者更改显示的提示文本。而“密码”是一种固定格式的机制——不发送到 SSH 客户端的实际“提示”;它只要求您输入一个密码,仅此而已。
换句话说,将这两种机制结合起来是没有用的——你不能让 OpenSSH 分别验证密码和令牌,要么全有,要么全无。(尽管在 OpenSSH 中指定两个不同的 PAM 堆栈的能力已被多次提出,但到目前为止,还没有这样的补丁被接受。)