有没有办法对 Unix PAM 子系统上 SSH 服务器上的所有用户强制执行双因素身份验证 (2FA)?
答案1
我无法访问像您这样的未命名 UNIX 系统,因此您必须根据您自己的情况调整我在这里描述的解决方案。 (请随意编辑此答案以添加您的具体信息。)
这PAM子系统允许在身份验证过程中包含其他模块。其中一项规定谷歌身份验证器 (以及任何兼容的产品,例如 Microsoft 的产品)。
在开始之前,请确保您已建立根会话,并且在验证您仍然可以登录(并使用sudo
或su
)的另一个连接之前不要关闭它。
这里是Debian 12(“书虫”)的安装和配置过程。你需要贯穿root
始终,所以从sudo -s
获取root
shell 开始:
sudo -s
apt update
apt install libpam-google-authenticator
cp -p /etc/pam.d/common-auth{,.$(date +'%Y-%m-%d')}
echo 'auth required pam_google_authenticator.so nullok echo_verification_code' >>/etc/pam.d/common-auth
现在编辑/etc/ssh/sshd_config
(不是 ssh_config
)并添加或编辑这些行。如果要添加它们,请将它们立即放在下面UsePAM yes
。
cp -p /etc/ssh/sshd_config{,.$(date +'%Y-%m-%d')}
vi /etc/ssh/sshd_config # or nano, or any preferred editor
ChallengeResponseAuthentication yes
KbdInteractiveAuthentication yes
并重新启动sshd
systemctl restart sshd
现在以普通用户身份登录并设置身份验证器。
google-authenticator
Do you want authentication tokens to be time-based (y/n) y
Warning: pasting the following URL into your browser exposes the OTP secret to Google:
https://www.google.com/chart?...secret...stuff...
您将在文本终端中或单击生成的网页链接时显示一个二维码。像往常一样在身份验证器应用程序中捕捉它。
Your new secret key is: 4JD3xxxxxxxxxxxxxxxxxxH7EE
Enter code from app (-1 to skip): xxxxxx
Code confirmed
Your emergency scratch codes are:
…
Do you want me to update your "/home/{user}/.google_authenticator" file? (y/n) y
Do you want to disallow multiple uses of the same authentication token? (y/n) y
By default […] This will permit for a time skew of up to 4 minutes
between client and server. Do you want to do so? (y/n) n
Do you want to enable rate-limiting? (y/n) y
现在测试一下。如果有效的话,那就太好了。如果没有,则恢复/etc/pam.d/common-auth
并重/etc/ssh/sshd_config
试。
请注意,因为我已nullok
在 PAM 配置条目中包含该选项,所以用户可以选择避免设置身份验证。如果删除它,它将成为必需的值。请务必小心删除此选项,因为它将对所有用户帐户(包括root
.您可以阅读文档中的其他选项(请参阅man pam_google_authenticator
和man google-authenticator
)。