如何设置 sshd 以要求私钥和密码?
在 /etc/ssh/sshd_config 中,我当前有:
RSAAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication yes
但显然这允许用户使用私钥或密码登录。
答案1
您需要设置 SSH 守卫。这允许 openssh 允许多因素身份验证。
这是一个很棒的链接:https://calomel.org/openssh.html
本质上,您使用 ForceCommand 指令在用户登录时运行脚本。然后该脚本会提示用户输入密码。我目前正在寻找一种方法来根据系统密码验证给定的密码,但我(可以理解)一无所获。
如果用户帐户存储在 LDAP 目录中,您可以尝试使用这些凭据绑定到该目录,但问题是运行的程序将以用户身份运行,而不是以 root 身份运行。我不知道编写编译代码并将其设置为 SUID 的安全隐患。
希望有人能给你更好的答案。
但既然我已经输入了这么多,你是不是在一个超级安全的网站?因为这实际上是唯一的原因。普通公钥和密码应该足以应付 99% 的情况。
答案2
OpenSSH 的最新版本使得这一目标更容易实现!
只需/etc/ssh/sshd_config
添加以下内容:
AuthenticationMethods "publickey,password" "publickey,keyboard-interactive"
如果您希望允许特定 IP 地址(例如 192.168.10.10)能够使用 OpenSSH 默认方法登录,但要求其他每个 IP 地址都使用密码和密钥,则可以添加以下Match
块:
Match Address "*,!192.168.10.10"
AuthenticationMethods "publickey,password" "publickey,keyboard-interactive"
虽然没有很好的记录,但匹配行上必须有前导星号;Match Address "!192.168.10.10"
实际上永远不会匹配。 在 OpenSSH 的未来版本中这可能会改变。
答案3
双因素身份验证?不完全是。证书是一种比密码更强大的身份验证方法。
如果您担心证书可能被盗用,请将私钥设置为受密码保护。这可确保在使用证书之前提示用户输入密码。这为您提供了双重身份验证。您将知道连接来自同时拥有私钥的人和还有解锁的密码。
并在 ssh 服务器上禁用密码验证。这可以阻止人们使用字典/暴力攻击。