停止ssh客户端提供它可以找到的所有公钥?


32

像大多数系统管理员一样,我一直都使用openssh。我大约有十二个ssh密钥,我希望每个主机都有一个不同的ssh密钥。但是,这在我第一次连接到主机时会出现问题,我所拥有的只是一个密码。我只想使用密码连接主机,在这种情况下不使用ssh键。但是ssh客户端将提供my中的所有公钥~/.ssh/(我通过查看的输出知道这一点ssh -v)。既然我有那么多,我将因身份验证失败而断开连接。

有什么方法可以告诉我的ssh客户端不提供所有的ssh密钥吗?


2
您为什么要为每个主机使用不同的密钥?密钥也可以在单个管理域内的主机之间共享。显然,您将在工作机器上使用一个密钥,而在私有计算机上使用另一个密钥,但是在工作中的每台计算机上使用单独的密钥背后的逻辑是什么?
亚历克斯·霍尔斯特

@AlexHolst我正在使用许多键。我有一个用于内部基础结构的默认加密文件(要求我输入密码)。我还有另一种未加密(没有密码)的密码,我用于一项特定服务,既不能使用代理,也不想每分钟都输入密码。我还有其他一些不属于我们内部基础架构的连接。这是一个好习惯,因为即使某人很难从公共密钥中恢复私有密钥,也可以做到。例如,几年前的Debian openssh bug ...
惠更斯(Huygens)2015年

@Huygens我很乐意看到您的风险分析文档,得出的结论是您需要使用多个SSH密钥,但是具有清晰的文本密钥是可以的。您可以发布链接吗?
Alex Holst

@AlexHolst您不必这么“直接”。首先,我的答案是关于拥有多个密钥对的原因。我想我给了你几个。之后,我们都必须应对怪癖,而别无所求。我有一个测试系统,我无法使用通过SSH隧道传输数据的应用程序,而不会连续不断地提示输入密钥密码,从而使该软件无法使用。由于版本不兼容或类似原因,这似乎是一个错误。我收到有关任何SSH登录名的电子邮件通知,并且是该框的唯一登录名。因此风险是可以接受的。
惠更斯2015年

Answers:


31

根据以下手册页,这是预期的行为ssh_config

 IdentityFile
         Specifies a file from which the user's DSA, ECDSA or DSA authentica‐
         tion identity is read.  The default is ~/.ssh/identity for protocol
         version 1, and ~/.ssh/id_dsa, ~/.ssh/id_ecdsa and ~/.ssh/id_rsa for
         protocol version 2.  Additionally, any identities represented by the
         authentication agent will be used for authentication.  

         [...]

         It is possible to have multiple identity files specified in configu‐
         ration files; all these identities will be tried in sequence.  Mul‐
         tiple IdentityFile directives will add to the list of identities
         tried (this behaviour differs from that of other configuration
         directives).

基本上,指定IdentityFiles只是将密钥添加到已经提供给客户端的SSH代理的当前列表中。

请尝试在.ssh/config文件底部使用此方法来覆盖此行为:

Host *
  IdentitiesOnly yes

您还可以在主机级别覆盖此设置,例如:

Host foo
  User bar
  IdentityFile /path/to/key
  IdentitiesOnly yes

4
您也可以使用ssh -o "IdentitiesOnly true" -v -A user@host我用来登录没有密钥但我想提供代理转发功能的机器。(-v用于详细调试)。
eckes

1
@eckes是一个不错的提示,但不是吗yes(不是true)?
aexl

IdentitiesOnly不一定总是有帮助,您可能必须专门排除主机;看到superuser.com/questions/859661/...
aexl

38

尽管其他人已经通过基于配置的解决方案暗示了这一点,但可能值得指出的是,您可以使用以下命令在命令行上轻松地仅此一项:

ssh -o 'PubkeyAuthentication no' myhostname.mydomain

3
完美..解决方案恕我直言
drAlberT 2014年

1
更正这应该是公认的答案。
JM Becker'3

11

按照James Sneeringer的解决方案,您可能只想按照以下方式设置ssh_config:

Host *.mycompany.com
  IdentityFile .ssh/id_dsa_mycompany_main

Host *.mycustomer.com
  IdentityFile .ssh/id_dsa_mycustomer

Host *
  RSAAuthentication no #this should be up top, avoid ssh1 at all costs
  PubkeyAuthentication no

如果使用特定的密钥连接到不在公共域中的许多计算机,请考虑在您自己的DNS中为它们提供所有CNAME。我对所有客户系统都这样做。


2

类似于user23413的解决方案,您可以完全禁用特定主机(或通配符模式)的公钥身份验证:

Host *.example.org
RSAAuthentication no        # SSHv1
PubkeyAuthentication no     # SSHv2

-1

如果使用ssh -i / path / to / key指向特定的密钥文件,即使其他文件已加载到代理中,它也只会使用该文件,并且不会提示您输入密码。您还可以编辑〜/ .ssh / config并投放类似这样的内容...

主机foo.example.com
IdentityFile .ssh / id_rsa_foo.example.com

你也可以做...

主机* .example.org
IdentityFile .ssh / id_rsa_example.org


这只是将目标键添加到列表的末尾,这无法解决问题。IdentitiesOnly只有这样。
Jo Rhett
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.