我花了几个小时尝试在 Debian 12 上正确配置 ssh MFA,使用公钥或在 OTP 代码之前询问的密码。
目前我已经能够配置 publickey+MFA 和 password+MFA,但无法配置 publickey|password+MFA
公钥+MFA
编辑
/etc/pam.d/sshd
- 评论
@include common-auth
auth required pam_google_authenticator.so
在后面添加
- 评论
创建
/etc/ssh/sshd_config.d/mfa.conf
包含以下内容的文件
UsePAM yes
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
通过此配置,我可以使用 publickey+MFA 登录,但是当使用密码时,我得到一个Permission denied (publickey)
密码+MFA
编辑
/etc/pam.d/sshd
- 保持
@include common-auth
auth required pam_google_authenticator.so
在后面添加
- 保持
创建
/etc/ssh/sshd_config.d/mfa.conf
包含以下内容的文件
UsePAM yes
ChallengeResponseAuthentication yes
通过此配置,我可以使用密码+MFA 登录,但是使用公钥身份验证时不会要求输入 OTP 代码
我尝试了许多不同的配置并做了大量研究,但我找不到按照我想要的方式配置身份验证。
例如
AuthenticationMethods publickey,keyboard-interactive password,keyboard-interactive
我可以使用 publickey+MFA 正确登录,但是当使用密码时,即使我使用的是正确的密码,也会出现“权限被拒绝”的情况。
我甚至尝试使用自定义 pam 配置文件,如下所示
auth substack pam_unix.so
auth required pam_google_authenticator.so
auth requisite pam_deny.so
auth required pam_permit.so
但我试过的所有方法都不起作用
我不明白为什么配置起来这么困难,因为 sshd 本身就可以处理这个问题,但是当添加 OTP MFA 时,它不能在 sshd basic auth 之后直接插入
如果有人找到实现该配置的方法我会很高兴听到这个消息。
提前致谢
这就是问题所在;事实并非如此。该
password
机制实际上外包给了 PAM – 运行完全相同的 /etc/pam.d/sshd 堆栈来验证password
身份验证和处理keyboard-interactive
身份验证。因此,如果您使用
AuthenticationMethods password,keyboard-interactive
,您最终实际上会调用相同的 pam_google_authenticator 两次。我认为没有一个好的方法可以纯粹在 sshd 端实现您的要求,因为 PAM 堆栈对 sshd 是不透明的 - 它不能运行半个堆栈,要么全部运行,要么全部不运行 - 并且不幸的是 sshd 没有办法为每种身份验证方法指定自定义 PAM 服务名称,因此您也不能让它根据情况使用两个不同的堆栈。
(我个人宁愿完全避免这种情况——“公钥或密码+MFA”对我来说比“公钥+MFA”更有意义,因为附加因素可以在私钥存储上更好地实现,例如通过使用硬件令牌或短期证书或笔记本电脑的 TPM2 模块。)
顺便提一下,
auth substack pam_unix.so
这是无意义的。'substack' 关键字的作用类似于 'include',并且只接受另一个 PAM 服务名称,例如auth substack common-auth
在 Debian 上;它不适用于 .so 模块名称。