为什么 SSH 密码认证存在安全风险?

Sep*_*ram 69 security ssh authentication ssh-keys

大多数 OpenSSH 配置指南建议禁用密码身份验证以支持基于密钥的身份验证。但在我看来,密码认证有一个显着的优势:无需密钥即可从任何地方进行连接。如果始终使用强密码,这不应该是安全风险。还是应该?

Jan*_*nen 78

与密码登录相比,使用 ssh 密钥确实有一个独特的功能:您可以指定允许的命令。这可以通过修改~/.ssh/authorized_keys服务器上的文件来完成。

例如,

command="/usr/local/bin/your_backup_script.sh", ssh-rsa auiosfSAFfAFDFJL1234214DFAfDFa...
Run Code Online (Sandbox Code Playgroud)

将只允许使用该特定密钥的命令 `/usr/local/bin/your_backup_script.sh"。

您还可以为密钥指定允许的主机:

from="yourclient,yourotherclient", ssh-rsa auiosfSAFfAFDFJL1234214DFAfDFa...
Run Code Online (Sandbox Code Playgroud)

或者将两者结合起来:

from="yourbackupserver", command="/usr/local/bin/your_backup_script.sh", ssh-rsa auiosfSAFfAFDFJL1234214DFAfDFa...
Run Code Online (Sandbox Code Playgroud)

使用密钥,您还可以授予某些用户(例如顾问)临时访问服务器的权限,而无需透露该特定帐户的密码。顾问完成他/她的工作后,可以删除临时密钥。

  • 此外,与您可以在终端中手动输入的内容相比,使用 Keys 就像拥有一个 2000 个字符的长密码(从技术上讲,它的强度更大):D (4认同)
  • 关于 SSH 身份验证的两个非常有用的提示,但真的没有回答我的问题...... (3认同)

Mik*_*eyB 48

您可以通过只允许在您的网络内进行密码验证来获得两全其美的效果。将以下内容添加到您的末尾sshd_config

PasswordAuthentication no
Match Address 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
    PasswordAuthentication yes
Run Code Online (Sandbox Code Playgroud)


Rom*_*man 25

密码或基于密钥的身份验证各有利弊。

在某些情况下,例如,基于密钥的认证是比密码认证安全。在其他情况下,其基于密码的安全性较低。在某些情况下,一种更方便,而在另一些情况下,则更少。

这一切都归结为:当您进行基于密钥的身份验证时,您必须使用密码保护您的密钥。除非您运行 ssh-agent(ssh-agent 使您无需每次都输入密码),否则您在便利性方面一无所获。安全性是有争议的:攻击媒介现在从服务器转移到了你,或者你的帐户,或者你的个人机器,(...) - 这些可能更容易,也可能不会更容易破解。

在决定这一点时,要跳出框框思考。您在安全性方面获得或失去取决于您的环境和其他措施的其余部分。

编辑:哦,刚刚看到您在谈论家庭服务器。我遇到了同样的情况,“密码”或“带有密钥的 USB 记忆棒”总是在我身边?我选择了前者,将 SSH 侦听端口更改为与 22 不同的端口。这阻止了所有那些蹩脚的脚本小子蛮力强制整个网络范围。

  • 在许多情况下,将 SSH 端口从 22 更改可能根本不是一个好主意。https://www.adayinthelifeof.nl/2012/03/12/why-putting-ssh-on-another-port-than-22-is-bad-idea/ (2认同)

Ram*_*mon 8

当您使用密码登录时,您会将密码传输到服务器。这意味着服务器的运营商可以修改 SSHD 以访问您的密码。使用公钥身份验证,他们无法获得您的私钥,因为只有您的公钥才会到达服务器。

  • 当您由于拼写错误而连接到错误的服务器时,这一点尤其重要。例如,在某个时间点,.cg 是一个通配符,指向启用了 ssh 的单个机器。任何时候您将 .cg 错误输入为 .ch,您最终都会连接到该框并泄露您的密码...... (3认同)

Mar*_*lka 7

您已经部分回答了您的问题 - 攻击者可以连接的地方越多,他通过暴力破解闯入您的服务器的可能性就越大(考虑 DDoS)。

还将您的密码长度与密钥大小(通常为数千位)进行比较。

  • @NickDownton - 您可以拥有一个不错的长密码,而无需求助于 keypass 软件。像“mywifesnameisangelaandshehasanicebutt”这样的东西不受字典攻击的影响,非常强大,而且很容易记住,但不可能猜到。如果您需要将密码提供给您的妻子,它会附带奖励,如果布朗尼点数。 (16认同)
  • 对不起,马克,但那是错误的。您提供的密码短语有 37 个字符,因此大约有 44 位熵,这比 7 个随机可打印字符弱,并且非常容易攻击。阅读维基百科关于 Claude Shannon 工作的文章以了解详细信息,但结果是书面英语是高度可预测的——例如,在“mywifesname”之后,“is”这个词几乎是肯定的。对于涉及单词的强密码,从字典中串在一起的四个**随机**单词将为您提供大约 10**23 种可能性,大约是 77 位的熵;仍然不是很好,但也不错。 (9认同)
  • @SachinDivekar 只有在使用集合 [a-zA-Z] 中的随机密码时才为 96 位熵,如果它是英文单词,则不是。 (5认同)
  • 96 位熵意味着 80 个字符的密码,如果它是英文写的;如果是可打印字符集中的随机乱码,则为 15 个字符。您确定您的 ssh 密码那么长/那么强吗? (4认同)
  • 如果您有多个具有 96 位熵的密码,这些密码不易受到字典攻击,那么无论如何您可能需要使用某种密码管理软件,因此您实际上失去了使用密码的无处不在的元素. (3认同)

Tac*_*cus 7

ssh 密钥可防止基于中间人的密码攻击。

当您尝试使用密钥登录时,服务器将根据您的公钥构造一个质询并将其发送给您的客户端。它将解密它并构造一个适当的响应来发送。

您的私钥永远不会发送到服务器,任何监听的人都无法做任何事情,只能拦截那个会话。

使用密码,他们将拥有您的凭据。

我的解决方案是在 USB 密钥的加密分区上拥有一个合适格式的便携式 ssh 密钥。这使我能够:
在丢失密钥时轻松收回该密钥。
限制它允许我访问哪些服务器
并仍然随身携带

虽然安装挂载软件很痛苦(truecrypt)

  • 对于回答者:您不需要使用 truecrypt,openssh 私钥带有自己的可选的基于密码的加密。 (6认同)
  • 托马斯,实际上很多人都忽略了有关指纹变化的警告。即使服务器的私钥不知何故遭到破坏或人类心不在焉地输入“是”,公钥身份验证也能保证 MITM 保护:攻击者必须在无法看到流量和发送不会登录的公钥之间做出选择,这是一个赢。 (4认同)

Ror*_*sop 5

正如@MartinVejmelka 所说,这是一种权衡。

您使用基于密钥的身份验证的原因是,该密钥远高于当前或不久的将来的暴力破解,您需要来自自己的 PC,或者将密钥放在 USB 记忆棒或类似设备上。

密码有以下问题:

  • 如果它很短,它可以被蛮力
  • 如果时间长了很容易忘记
  • 它可以是肩部冲浪

键的数量级更长,并且不会在任何时候显示,因此避免了这三个问题。