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

Ara*_*vor 26 ssh public-key

我正在运行 SSH 服务器,但我仍在使用简单的密码身份验证。在我阅读有关安全性的任何地方,我都建议使用公钥身份验证。但我没有得到好处。在我看来,使用它们要么是不安全的,要么是很多方便的工作。

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

顾问们大多认为您不必记住密码。这有多不安全?因此,如果有人入侵我的计算机,他不仅会盗取我的计算机,还会盗取我的服务器?如果我使用来自各种不同客户端的 SSH,我必须每一个都存储一个公钥,这增加了它们落入不法之徒手中的可能性。我可以将它们保存在随身携带的 U 盘上,但它可能会丢失并且查找器可以访问我的服务器。

可能我更适合使用双因素身份验证。

有什么我想念的论点吗?对我来说最好的方法是什么?

pjc*_*c50 32

如果有人入侵我的电脑,他不仅会入侵我的电脑,还会入侵我的服务器?

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

但是key有3个优点:

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

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

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

(这也可以使用个人帐户和 sudo 来完成,但是您必须以某种方式配置这些帐户)

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

(它替代了非常不安全的 rlogin/rsh)

编辑:公钥而不是密码的另一个优势是服务器因漏洞而受到损害的常见情况。在这种情况下,使用密码登录会立即泄露密码。使用密钥登录不会!我会说这比管理员的原始桌面受到损害更常见。

  • 2b *非常*重要。授权密钥很容易集中管理,更改密码并将其分发给所有用户需要更多的工作。 (2认同)

Kha*_*led 12

如果您使用良好的密码,这可能足够安全。我通常将可公开访问的服务器数量限制在最低限度,并尽可能允许来自特定 IP 的 SSH。

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

有类似的帖子:

  1. serverfault发布。
  2. 安全堆栈交换发布
  3. 来自超级用户的帖子。

  • 恕我直言,关键短语是必须的。使用 ssh-agent 时,请查看 ssh-add 的 -t 选项以使其在一段时间后卸载密钥。 (2认同)

Paŭ*_*ann 12

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

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

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

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

当然,正如其他答案已经说过的那样,您需要确保您的私钥安全,例如使用密码加密,或者可能在单独的设备上仅在输入 PIN 后创建签名。