为什么我应该对SSH使用公钥身份验证?


26

我正在运行SSH服务器,但仍在使用简单的密码身份验证。我到处都了解安全性,建议我使用公钥身份验证。但是我没有优势。在我看来,使用它们既不安全也不是很多方便的工作。

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

顾问们大多认为您不必记住密码。那有多不安全?因此,如果有人入侵了我的计算机,他不仅可以获取我的计算机,还可以获取我的服务器吗?如果我从各种不同的客户端使用SSH,则必须将每个公钥存储一个,这会使公钥落入虚假手中的可能性成倍增加。我可以将它们保存在随身携带的USB记忆棒中,但它可能会丢失,并且查找程序可以访问我的服务器。

两因素身份验证可能会更好。

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


10
正确完成后,公钥身份验证就是一种2FA形式,其中包含您知道的内容(私钥的密码短语)和您拥有的某些内容(私钥)。
斯文

1
@EEAA只要您的私钥有一个,为什么这么重要?
user253751 '17

6
使用私钥,如果我欺骗您错误地连接到错误的服务器,则无需在服务器中输入密码。
user253751 '17

1
许多组织必须(出于任何原因)要求使用两因素身份验证。依靠加密的私钥是不可能做到的。
EEAA

6
就其价值而言,我与Sven完全不同意将私钥归类为您拥有的东西。它无法对您所拥有东西进行基本测试,因为它是任意可复制的,仅仅是数字数据。本身的公钥认证不是 2FA;如果您告诉自己是这样,那么您就在自欺欺人。
MadHatter支持Monica

Answers:


32

如果有人入侵我的计算机,他不仅会拿到我的计算机,还会拿我的服务器吗?

无论如何,对于按键记录程序而言,这都是可能的事实:一旦您从受感染的计算机登录服务器,他们就会获得密码。

但是密钥有3个优点:

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

2)可扩展的身份验证。一次输入密码,登录多台机器。您拥有的机器越多,它就越有用。如果您有100台机器,该怎么办?您不能使用相同的密码(除非它是一个克隆服务器场),并且您也记不起那么多密码。因此,您必须使用密码管理器,而您又回到了单点攻击的境地。实际上,密钥密码短语您的密码管理器。

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

(这也可以使用单个帐户和sudo来完成,但随后必须以某种方式设置这些帐户)

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

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

编辑:公钥而不是密码的另一个优点是服务器容易受到漏洞感染的常见情况。在这种情况下,使用密码登录会立即破坏密码。使用密钥登录无法!我要说的是,这比管理员的原始桌面受到损害更为普遍。


2
2b 非常重要。授权密钥易于集中管理,更改密码并将其分发给所有用户需要更多的工作。
乔纳斯·谢弗(JonasSchäfer)

有哪些用于集中管理授权密钥的技术?(我熟悉将authorized_keys文件放在共享文件系统上,但必须有其他文件)
pjc50

1
此时,您有数十台或数百台服务器,您可能正在使用Chef,Ansible,Puppet,Holo或类似的服务器来管理这些服务器。或者您在LDAP或其他数据库中具有授权密钥。
JonasSchäfer'17

1
不要忘记代理转发:您可以在ssh -A那里进行登录,并登录到允许您的原始主机公开的计算机上。
Halfgaar

@Halfgaar ...无需专门更改要连接的主机上的任何内容。我刚刚学习了该功能,我喜欢它!
加拿大卢克REINSTATE MONICA

12

如果您使用的是正确的密码,则此密码足够安全。我通常将公共可访问服务器的数量限制为最少,并尽可能地允许来自特定IP的SSH。

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

有类似的帖子:

  1. serverfault发布。
  2. 安全stackexchange发布
  3. 来自超级用户的帖子。

2
关键字短语是必须的恕我直言。使用ssh-agent时,请查看ssh-add的-t选项,使其在一定时间后卸载密钥。
fuero

12

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

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

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

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

当然,正如已经回答的其他答案一样,您需要保持私钥的安全(例如,使用密码短语进行加密),或者在单独的设备上(仅在输入PIN后创建签名)才能使用。


2

OpenSSH可以保留自己的CA来管理SSH主机和客户端密钥,并且可以在它们上使用吊销列表。这可以增加基于密钥的身份验证提供的安全性。


2

您对“您不需要密码”的主张是正确的。在客户端那确实是不安全的。

使允许使用公共密钥登录更加安全的原因是,没有办法强行访问服务器。攻击者所能实现的只是在服务器上加一些负载-您可以使用fail2ban进行检查。

为了确保客户端的安全,您必须使用良好的密码保护私钥。当然,现在连接服务器比使用密码更麻烦。为了解决这个问题,如果您打算连续几次连接到服务器,可以使用ssh代理将私钥存储在内存中。优良作法是限制将密钥保留在内存中的时间。


3
没有办法强行访问 ...我不会说没有办法...您可以以与密码相同的方式来蛮力私钥,但是与一般密码相比,私钥中的熵更多完全没有用(到目前为止还没有量子计算机)。
雅库耶

0

两因素身份验证可能会更好。

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

我相信AuthenticationMethods publickey,keyboard-interactive可以添加一些类似的内容/etc/ssh/sshd_config来使该功能生效。

更普遍的问题是,密码(单独使用)不是一种很好的身份验证方法,因为密码质量通常令人怀疑。密钥与密码的一个非常简单的“论点”是密钥通常至少为2048位,并且通常更多(对于EC密钥,这是有效强度,而不是实际大小)。这些位也由密码安全(或适当的)机制生成。

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

您也可以使用密码保护密钥,以防止与丢失密钥有关的问题(尽管有人可以尝试强行使用该密码)。

因此,基本上,可以使密钥和密码之间的差异变得相当透明,并且使用密钥可以为您提供比人类可以承受的更好的密码。这并不是说它们是灵丹妙药,但是平均而言,它们提供的安全性高于密码。

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.