阻止SSH客户端提供所有可以find的公钥?

像大多数系统pipe理员一样,我一直使用openssh。 我有大约十几个SSH密钥,我喜欢为每个主机有一个不同的SSH密钥。 但是,当我第一次连接到主机时,这会导致一个问题,我拥有的只是一个密码。 我想在这种情况下使用密码连接到主机,没有SSH密钥。 然而,SSH客户端将在我的~/.ssh/提供所有的~/.ssh/ (我通过查看ssh -v的输出来了解这一点)。 由于我有这么多,我会因为太多的validation失败而断开连接。

有没有办法告诉我的SSH客户端不提供所有的SSH密钥?

这是根据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). 

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

尝试在.ssh/config文件的底部覆盖此行为:

 Host * IdentitiesOnly yes 

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

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

虽然其他人已经通过基于configuration的解决scheme暗示了这一点,但可能值得指出的是,您可以轻松地做到这一点 – 只在命令行中使用:

 ssh -o 'PubkeyAuthentication no' myhostname.mydomain 

遵循James Sneeringer的解决scheme,您可能只想沿着以下方向设置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。 我所有的客户系统都是这样做的。

与user23413的解决scheme类似,您可以为特定主机(或通配符模式)完全禁用公共密钥身份validation:

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

如果使用ssh -i / path / to / key指向特定的密钥文件,即使其他人加载到代理中,也只能使用该密钥文件,并且不会提示您input密码。 你也可以编辑你〜/ .ssh / config和广告这样的东西…

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

你也可以做…

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