![仅在外部地址上进行双因素 SSH 身份验证](https://linux22.com/image/613915/%E4%BB%85%E5%9C%A8%E5%A4%96%E9%83%A8%E5%9C%B0%E5%9D%80%E4%B8%8A%E8%BF%9B%E8%A1%8C%E5%8F%8C%E5%9B%A0%E7%B4%A0%20SSH%20%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81.png)
我有一台 Ubuntu 服务器,它既有私有的内部 IP,也有面向公众的 IP。我想在公共端为 SSH 设置双因素身份验证。这可能吗?我原本打算使用 Google Authenticator,但我也愿意接受其他想法。
答案1
是的,你可以用这个来做pam_access.so
。这个食谱取自Google Authenticator 的 wiki:
一个有用的 PAM 配方是允许在连接源自某些来源时跳过双因素身份验证。PAM 已经支持此功能。例如,pam_access 模块可用于针对本地子网检查来源:
# skip one-time password if logging in from the local network auth [success=1 default=ignore] pam_access.so accessfile=/etc/security/access-local.conf auth required pam_google_authenticator.so
在这种情况下,access-local.conf 看起来像:
# only allow from local IP range + : ALL : 10.0.0.0/24 + : ALL : LOCAL - : ALL : ALL
因此,从 10.0.0.0/24 进行的登录尝试不需要双因素身份验证。
答案2
我的要求非常相似,但更具体地说,我想要 1)从外部拥有公钥和 googleAuth 以及 2)从内部拥有公钥或密码(以防我丢失所有公钥,则使用密码):
在 /etc/ssh/sshd_config 中:
AuthenticationMethods publickey,keyboard-interactive
Match address 192.168.2.0/24
PasswordAuthentication yes
AuthenticationMethods "password" "publickey"
Match all
/etc/pam.d/sshd:
# Google Authenticator
auth [success=1 default=ignore] pam_access.so accessfile=/etc/security/access-local.conf
auth sufficient pam_google_authenticator.so
# Standard Un*x authentication.
auth [success=ignore default=4] pam_access.so accessfile=/etc/security/access-local.conf
@include common-auth
/etc/security/access-local.conf
+ : ALL : 192.168.2.0/24
- : ALL : ALL
除了之前的回答之外,当从外部访问时,我必须跳过 /etc/pam.d/common-auth 中的 4 条规则,我还将 google auth 配置为 adequate 而不是 required。我在 Ubuntu 20.04 上这样做了,但这个解决方案应该很通用