为什么要使用SSH的公钥authentication?

我正在运行一个SSH服务器,我仍然使用简单的密码authentication。 我在任何地方读到关于安全性的信息时都build议使用公钥authentication。 但我没有得到好处。 在我看来,使用它们要么是不安全的,要么是很多方便的工作。

当然,如果有人试图暴力login到我的SSH服务器,公钥比任何密码都强。 但是除此之外,这完全是不安全的。

这些顾问主要争辩说,你不必记住密码。 那有多不安? 所以如果有人侵入我的电脑,他不只是让我的电脑,但我的服务器呢? 如果我使用来自不同客户的SSH,我必须将公钥存储在每一个客户端,这使得他们可能陷入虚假的手中。 我可以把它们保存在随身携带的usb-stick上,但是可能会丢失,取景器可以访问我的服务器。

可能我更好地服务于双因素authentication。

有没有我失踪的论点? 对我来说最好的办法是什么?

    如果有人入侵我的电脑,他不只是让我的电脑,但我的服务器呢?

    无论如何,键盘logging程序可能是这样的:只要您从受感染的计算机login到服务器,他们就会获得密码。

    但是键有三个好处:

    1)可caching的authentication。 input一次密码,执行多个ssh命令。 这是非常有用的,如果你使用的东西,使用ssh作为传输,如scp,rsync或git。

    2)可伸缩的身份validation。 input您的密码一次, login到多台机器 。 你有更多的机器,这是更有用的。 如果你有100台机器,你会怎么做? 你不能使用相同的密码(除非它是一个克隆农场),你不能记得那么多。 所以你不得不使用一个密码pipe理器,你又回到了单一的妥协点。 密钥密码有效的密码pipe理器。

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

    (这也可以用个人账户和sudo来完成,但是你必须以某种方式提供这些账户)

    3)自动化和部分授权。 您可以设置SSH,以在键连接时运行特定的命令 。 这使系统A上的自动化过程能够在系统B上执行某些操作,而不会在两者之间产生完全的无密码信任。

    (这是rlogin / rsh的替代品,这是不安全的)

    编辑:公钥而不是密码的另一个好处是服务器通过漏洞被攻破的情况。 在这种情况下,使用密码login会立即危害密码。 使用密钥login不会! 我会说这比pipe理员的原始桌面受到攻击更普遍。

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

    此外,您可以通过密码(密码)保护您的密钥。 所以,无论何时您需要login您的服务器,都必须input此密码。 除非提供正确的密码,否则没有人可以使用您的密钥。

    有类似的post:

    1. 从serverfault发布。
    2. 从安全stackexchange发布 。
    3. 从超级用户发布。

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

    (当攻击者设法控制服务器时也是如此,并且还有其他服务器可以使用相同的凭证。)

    使用标准的基于密码的身份validation,您将以明文forms提交密码(在encryption连接内),真正的服务器通常会对其进行哈希处理,并将结果与​​存储在其密码数据库中的哈希进行比较。 一个MitM攻击者可以改用这个密码,打开一个到真实服务器的连接,然后在那里login…并把内容转发给你(所以你什么也没有注意到),或者只是在你的服务器上做自己的坏东西。

    使用公钥authentication,客户端基本上是对服务器和客户端已知的一些数据进行签名,以certificate其拥有私钥,并将签名发送给服务器。 这个签名的数据包括一个会话标识符,它依赖于客户端和服务器所select的随机数,因此每个会话都是不同的。 如果MitM与真实服务器打开自己的SSH连接,那么它将具有不同的会话ID,因此客户端提供的签名将不会在此工作。

    当然,正如已经告诉过的其他答案一样,您需要保证您的私钥安全,例如使用密码encryption,或者可以在单独的设备上inputPIN后创build签名。

    OpenSSH可以保留自己的CApipe理SSH主机和客户端密钥,并可以使用撤销列表。 这可能会增加基于密钥的身份validation提供的安全性。

    你对“你不需要密码”的说法是正确的。 这在客户端是非常不安全的。

    什么让只有公共密钥login更安全的事实是,没有办法暴力强制访问您的服务器。 攻击者所能做到的一切就是在你的服务器上加载一些负载 – 你可以使用fail2ban来保持这一点。

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

    可能我更好地服务于双因素authentication。

    SSH的一种可能性是2FA(并且需要相对较less的设置/复杂性)实际上是使用公共密钥和密码。

    我相信一些与AuthenticationMethods publickey,keyboard-interactive可以添加到/etc/ssh/sshd_config来实现这个function。

    更一般地说,问题更多的是密码(单独)不是一个很好的validation方法,因为它们通常是可疑的质量。 对于密钥vs密码来说,一个非常简单的“参数”是一个密钥通常至less2048位,而且通常更多(对于EC密钥,这将是有效的强度,而不是实际的大小)。 这些位也是由密码安全(或适当的)机制生成的。

    密码通常less于2048位,并且通常不是从密码安全的来源派生的。

    你也可以用密码保护你的密钥,以防止与丢失密码相关的问题(尽pipe有人可以尝试和强制密码)。

    所以基本上,密钥和密码之间的区别可以相当透明,使用密钥会为您购买比人类更好的密码。 这并不是说它们是万能的,但平均而言,它们比密码提供更多的安全性。