为什么SSH密码身份验证会带来安全风险?


68

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


2
密码是一种可以被嗅探,猜测和重播的单因素身份验证。密钥(可能)是两个因素。在某些系统上,仅凭一个因素就可以从任何地方登录都是不可接受的。
Alex Holst

Answers:


25

有基于密码的验证或基于密钥的验证的优缺点。

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

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

在决定这一点时,请三思而后行。在安全性方面是否获得利益还是取决于环境的其余部分和其他措施。

编辑:哦,刚刚看到您正在谈论家庭服务器。我处在相同的情况下,“密码”或“带有钥匙的USB记忆棒”总是和我在一起吗?我选择了前者,将SSH侦听端口更改为不同于22的端口。这阻止了所有那些la脚的脚本小子强行强制整个网络范围。


在许多情况下,将SSH端口从22更改可能根本不是一个好主意。 adayinthelifeof.nl/2012/03/12/…–蒂梅克
'17

75

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

例如,

command="/usr/local/bin/your_backup_script.sh", ssh-rsa auiosfSAFfAFDFJL1234214DFAfDFa...

将只允许带有特定键的命令“ /usr/local/bin/your_backup_script.sh”。

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

from="yourclient,yourotherclient", ssh-rsa auiosfSAFfAFDFJL1234214DFAfDFa...

或结合两者:

from="yourbackupserver", command="/usr/local/bin/your_backup_script.sh", ssh-rsa auiosfSAFfAFDFJL1234214DFAfDFa...

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


非常非常有用的提示。
2011年

3
除此之外,与您可以在终端机中手动键入的密码相比,使用Keys就像拥有2000个字符的长密码(从技术上讲,它甚至还具有更大的强度):D
Abhishek Dujari

3
关于SSH身份验证的两个非常有用的技巧,但实际上并没有为我解答这个问题……
MikeMurko 2011年

如果要强制经过密码验证的用户执行特定命令,请更改其登录外壳。另外,“在不透露密码的情况下允许临时访问”是一个非常糟糕的主意。有数百种不同的方法可以保留该访问权限以备后用。
2015年

仅最后一段回答了IMO问题-密钥允许进行细化吊销,而使用密码则需要告知每个人您正在对其进行更改。
Riking

48

通过只允许从网络内部进行密码身份验证,您可以兼得两全。在您的末尾添加以下内容sshd_config

PasswordAuthentication no
Match Address 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
    PasswordAuthentication yes

7

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

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


4
96位的熵表示一个80个字符的密码(如果使用英语书写);15个字符(如果它是来自可打印字符集的乱码)。您确定自己的ssh密码长/强吗?
MadHatter

3
如果您有多个带有96位熵的密码,而这些密码不会受到字典攻击,那么您可能仍然需要使用某种密码管理软件,因此您实际上会失去使用密码的所有可访问元素。
尼克·唐顿

5
@SachinDivekar仅在使用集合[a-zA-Z]中的随机密码时才具有96位的熵,而在英语单词中则不然。
Jaap Eldering 2011年

16
@NickDownton-您可以使用一个不错的长密码,而无需借助keypass软件。诸如此类的mywifesnameisangelaandshehasanicebutt字典攻击是无法抗拒的,它非常强大,并且很容易记住,但无法猜测。如果您需要将密码提供给您的妻子,那么如果果仁巧克力点了,它就会附带奖金。
马克·亨德森

7
抱歉,马克,但这是错误的。您提供的密码短语有37个字符,因此大约有44位熵,比7个可随机打印的字符弱,并且很容易受到攻击。有关详细信息,请阅读Wikipedia上有关Claude Shannon作品的文章,但结果是英语的书写是高度可预测的-例如,在“ mywifesname”之后,“ is”一词几乎可以保证。对于包含单词的强密码,从字典中串出的四个随机单词将为您提供10 ** 23的可能性,这大约是77位熵。仍然不是很好,但还不错。
MadHatter 2011年

7

使用密码登录时,会将密码传输到服务器。这意味着服务器的操作员可以修改SSHD来访问您的密码。使用公钥身份验证,他们无法获得您的私钥,因为只有您的公钥每次都进入服务器。


2
当由于错字而连接到错误的服务器时,这一点尤其重要。例如,在某个时间点,.cg是通配符,指向启用了ssh的一台计算机。每当您将.cg键入错误的.c​​h时,最终都将连接到该框并泄露密码...
b0fh 2015年

确实是@ b0fh。据我所知,这是通过在ssh中使用密码引入的唯一真正的漏洞。如果有人已经拥有您要连接的服务器,或者可以欺骗您要连接的IP地址(MITM),则您已经迷路了。
炉灶

6

ssh密钥可防止中间人对您的密码进行攻击。

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

您的私钥永远不会发送到服务器,并且监听的任何人都无法执行任何操作,除非拦截该单个会话。

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

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

虽然安装挂载软件很麻烦(truecrypt)


1
错了 一旦知道了服务器的公钥(如果将其添加到缓存中并且在第一个连接上未获得MITM的操作,便会这样做),您就可以免受MITM攻击。基于密钥/密码的身份验证与此无关。密码永远不会通过网络明确发送,在用户级别的身份验证(您的密码/向我证明是您的公共密码)之前,始终会在计算机级别的身份验证(您/我的公共密钥)上建立安全连接。 。
Thomas

3
托马斯(Thomas),实际上许多人都忽略了有关指纹更改的警告。即使服务器的私钥以某种方式受到破坏或人为的类型也不是“肯定”,Pubkey auth仍可保证MITM保护:攻击者必须在无法查看流量和发送无法登录的公共密钥之间进行选择,这是一种赢得。
Score_Under

5
对于回答者:您不必使用truecrypt,openssh私钥带有它们自己的可选的基于密码的加密。
Score_Under

5

正如@MartinVejmelka所说,这是一个折衷方案。

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

密码存在以下问题:

  • 如果太短,可能会被强行使用
  • 如果很长很容易被遗忘
  • 可以肩膀冲浪

键长了几个数量级,并且在任何时候都不显示,因此可以避免这三个问题。


但是使用密钥文件会增加丢失笔式驱动器或使用的任何存储空间的问题。
若昂里斯本

1
此时可以删除丢失的密钥,并添加新密钥。使用密码(尤其是共享密码)可能会给我带来极大的痛苦,并且会带来很多痛苦。
SplinterReality

我的(最近退休的)密码之一:08Forging2?seminal*^Rajas-(Posed/|。它是随机生成的,但我记得它没有问题。并祝您好运,它可以用肩膀冲浪或用力踢。
finnw 2012年

1
@finnw正确的马电池主食:-) security.stackexchange.com/q/6095/485
罗里·

2

这里已经提到好点了。

考虑到您已经使用强密码保护了基础知识,我认为最大的风险是许多计算机都安装了键盘记录程序,而用户却没有意识到这一点。甚至有人创建包含特洛伊木马的有用实用程序的整个站点,因此对我们所有人来说,这都是可能的。例如,键盘记录器会将登录详细信息通过电子邮件发送给黑客,然后黑客可以轻松访问服务器。

最近,诺顿警告我有关下载Zombee Mod安装程序(而不是jar,即安装程序)以增加对Minecraft jar的飞行。我查看了详细信息,诺顿在此站点上列出了很多标记为包含木马的实用程序。我不知道这是否正确,但是它与文件名非常明确。众所周知,特洛伊木马在分发之前先放入(一些)warez中。


2

SSH优于密码的一个潜在好处是,如果您不指定SSH密码短语,则无需再次输入密码……您的计算机在服务器上是本质上受信任的,因为它具有密钥。就是说,我通常总是使用SSH密码,因此我认为这样做是有好处的。

我找到了最佳答案,这就是为什么用户指南经常推荐SSH over password身份验证来自SSHOpenSSHKeys的Ubuntu手册。我引用,

如果您认为这并不重要,请尝试记录下周获得的所有恶意登录尝试。我的计算机-完全是普通的台式机-仅在上个星期就进行了4,000次以上的猜测我的密码的尝试,以及近2500次的侵入尝试。您认为在攻击者偶然发现密码之前需要进行几千次随机猜测?

本质上,如果您拥有标点符号,大写和小写以及数字的坚如磐石的长密码,那么您可以通过密码身份验证。另外,如果您打算监视日志,并且无论如何都不会通过网络进行“超级安全”的操作,即将其用于家庭服务器。然后,一定可以使用密码。


1

Passwd auth方法确实不安全(imho)。通过这种机制,密码将被传输到sshd服务器(就像@ramon已经说过的那样)。这意味着某些人可以修改sshd服务器以检索密码。借助中间人攻击,在本地网络中非常容易完成此攻击。

您可以通过安装此修补程序(https://github.com/jtesta/ssh-mitm)来修补sshd服务器。使用arpspoofiptables将修补的服务器置于客户端和真实的sshd服务器之间。

请禁用密码身份验证:打开配置文件/etc/ssh/ssh_config并添加PasswordAuthentication no


SSH客户端不检查服务器的RSA指纹吗?在至少一次向该特定服务器发送数据之后,它的指纹会被记住,因此,在可能的MITM攻击情况下,SSH会发出警告,不是吗?
Septagram '17

1
是的 出现警告,但由于99%的时间是由于重新安装操作系统,配置更改了ecc引起的,大多数用户将忽略警告并继续操作。
皮奥斯

@Septagram许多外壳账户提供商没有发布新订阅当前服务器密钥指纹,用户帐户到新的服务器等的迁移的习惯
达米安Yerrick

-2

您可以使用-o StrictHostKeyChecking=no选项绕过。在shell脚本中使用ssh时,这非常有用。

ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 -o PasswordAuthentication=no -o ConnectionAttempts=5 xxUser@xxxHost
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.