为什么我应该对 SSH 使用公钥认证?

为什么我应该对 SSH 使用公钥认证?

我正在运行 SSH 服务器,并且仍在使用简单的密码身份验证。我读到的所有关于安全性的文章都建议我使用公钥身份验证。但我不明白这样做有什么好处。在我看来,使用公钥身份验证要么不安全,要么需要做很多麻烦的工作。

当然,如果有人试图强行登录我的 SSH 服务器,公钥比任何密码都要强得多。但除此之外,它完全不安全。

顾问们大多认为你不必记住密码。这有多不安全?所以如果有人入侵了我的计算机,他不仅会入侵我的计算机,还会入侵我的服务器?如果我从不同的客户端使用 SSH,我必须存储每个客户端的公钥,这会增加公钥落入不法之徒之手的可能性。我可以将它们保存在随身携带的 USB 记忆棒上,但它可能会丢失,而发现者可以访问我的服务器。

或许双因素身份验证更适合我。

我遗漏了什么论点吗? 对我来说最好的方法是什么?

答案1

如果有人入侵了我的计算机,他不只是入侵了我的计算机,还入侵了我的服务器?

无论如何,对于键盘记录器来说,这可能是真的:只要你从受感染的计算机登录到你的服务器,他们就会获得密码。

但是钥匙有 3 个优点:

1) 可缓存身份验证。输入一次密码,执行多个 ssh 命令。如果您使用使用 ssh 作为传输方式的程序(如 scp、rsync 或 git),这将非常有用。

2)可扩展的身份验证。输入一次密码,登录多台机器。您拥有的机器越多,这个功能就越有用。如果您有 100 台机器,您会怎么做?您不能使用相同的密码(除非是克隆农场),而且您记不住那么多密码。因此,您必须使用密码管理器,然后您又回到了单点攻击。实际上,密钥密码您的密码管理器。

2b)如果有多个管理员使用相同的系统,它以另一种方式扩展,因为您可以撤销用户 A 的密钥,而无需告诉 B、C、D、E、F……密码已更改。

(这也可以通过个人账户和 sudo 来完成,但你必须以某种方式配置这些账户)

3)自动化和部分委派。您可以设置 SSH 来当按键连接时运行特定命令。这使得系统 A 上的自动化流程可以在系统 B 上执行某些操作,而无需两者之间建立完全无密码的信任。

(它是 rlogin/rsh 的替代品,非常不安全)

编辑:公钥比密码的另一个优势是,服务器通过漏洞被攻破的常见情况。在这种情况下,使用密码登录会立即泄露密码。使用密钥登录则不会!我想说,这种情况比管理员的原始桌面被攻破更常见。

答案2

如果您使用的密码足够安全,那么这应该足够安全。我通常会将可公开访问的服务器数量限制为最小值,并尽可能允许来自特定 IP 的 SSH。

此外,您还可以通过密码保护您的密钥。因此,每当您需要登录服务器时都必须输入此密码。除非提供正确的密码,否则任何人都无法使用您的密钥。

还有类似的帖子:

  1. 帖子来自服务器故障
  2. 帖子来自安全 StackExchange
  3. 帖子来自超级用户

答案3

公钥授权更安全的一种方式是,当攻击者设法成为您的客户端计算机和服务器之间的中间人(MitM),而您没有注意到更改的主机密钥(可能是因为您没有旧密钥,例如因为这是第一次使用这台特定的客户端计算机)。

(当攻击者设法控制服务器时,同样的情况也适用,并且其他服务器也可以使用相同的凭据。)

使用标准的基于密码的身份验证,您将以纯文本形式提交密码(在加密连接内),真正的服务器通常会对其进行哈希处理,并将结果与​​存储在其密码数据库中的哈希值进行比较。中间人攻击者可以获取此密码,打开与真实服务器的连接,然后登录那里……然后将内容转发给您(这样您就不会注意到任何事情),或者只是在您的服务器上执行自己的恶意操作。

使用公钥身份验证,客户端基本上是签署一些服务器和客户端都知道的数据,以证明它拥有私钥,并将签名发送到服务器。此签名数据包含一个会话标识符,该标识符取决于客户端和服务器选择的随机数,因此每个会话都不同。如果 MitM 打开自己的 SSH 连接到真实服务器,该服务器将具有不同的会话 ID,因此客户端提供的签名在那里将不起作用。

当然,正如其他答案已经提到的,您需要保证您的私钥安全,例如使用密码加密,或者放在仅在输入 PIN 后才创建签名的单独设备上。

答案4

你说的“不需要密码”是正确的。这对客户端来说确实不安全。

是什么让仅有的公钥登录更安全的事实是,没有办法暴力访问您的服务器。攻击者所能做的就是在您的服务器上施加一些负载 - 您可以采用失败2ban以控制这种情况。

为了客户端的安全,您必须使用好的密码短语保护私钥。当然,现在连接到服务器比使用密码更麻烦。为了克服这个问题,您可以使用ssh 代理如果您打算连续多次连接到服务器,请将私钥存储在内存中。限制密钥在内存中保存的时间是一种很好的做法。

相关内容