ファイル名でssh-agentからIDを選択します


9

問題:私は20〜30 ssh-agent人のID を持っています。Too many failed authenticationsSSHでは通常、20の異なるキーでログインを試行できないため、ほとんどのサーバーはによる認証を拒否します。

現時点では、IdentityFileおよびIdentitiesOnlyディレクティブを使用して、すべてのホストのIDファイルを手動で指定しているため、SSHは1つのキーファイルのみを試行し、機能します。

残念ながら、これは元のキーが利用できなくなるとすぐに機能を停止します。ssh-add -lすべてのキーファイルの正しいパスが表示され、それらはのパスと一致しますが.ssh/config、機能しません。どうやら、SSHはファイル名ではなく公開鍵の署名によってインデンティティを選択します。つまり、SSHが公開鍵を抽出できるように、元のファイルが使用可能である必要があります。

これには2つの問題があります。

  • キーを保持しているフラッシュドライブを取り外すとすぐに機能しなくなります
  • 鍵ファイルがリモートホストで利用できないため、エージェント転送が役に立たなくなる

もちろん、公開鍵を自分のIDファイルから抽出して自分のコンピューターに保存したり、普段ログインしているすべてのリモートコンピューターに保存したりすることもできます。しかし、これは望ましい解決策のようには見えません。

必要なのは、ファイル名でssh-agentからIDを選択する可能性です。これにより、SSHを実行したリモートホスト上でも.ssh/config、を使用して-i /path/to/original/key、またはを渡すことで、適切なキーを簡単に選択できます。フルパスを指定する必要がないように、キーに「ニックネーム」を付けることができればさらに良いでしょう。


1
なぜ多くのSSH IDが必要なのですか?1つの不正使用された秘密キーがすべてのアカウントへのアクセスを許可することを回避することである場合、なぜそれらすべてを1つのフラッシュドライブに保持するのでしょうか。複数のssh IDの管理に関連する問題を聞いたのはこれが初めてではありませんが、なぜそれらが必要なのかを尋ねる機会がありませんでした。
Dmitri Chubarov

それらのすべてが1つのフラッシュドライブにあるとは決して言いませんでした。
leoluk

3
@DmitriChubarov複数のssh IDの1つの可能なアプリケーションは、authorized_keys使用されるキーに応じて、シェルへの直接アクセスを許可せずにさまざまなコマンドを実行するファイルです。
Tobias Kienzler 2012年

回答:


8

ファイル名でIDを要求する方法はないようなので、自分の質問に答える必要があると思います。

.ssh/fingerprintsエージェントが保持するすべてのキーに対して公開キーファイルを作成する、汚いPythonスクリプトを作成しました。次に、秘密鍵を含まないこのファイルを指定してIdentityFile、SSHがSSHエージェントから正しいIDを選択するようにします。完全に問題なく動作し、エージェントを必要なだけの秘密鍵に使用できます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Dumps all public keys held by ssh-agent and stores them in ~/.ssh/fingerprints/, so that
they can be identified using the IdentityFile directive.

"""

import sys, os
import stat
import re
import envoy

RE_MATCH_FILENAME = re.compile(r'([^\\/:*?"<>|\r\n]+)\.\w{2,}$', re.IGNORECASE)

if os.getuid() == 0:
    USERNAME = os.environ['SUDO_USER']
else:
    USERNAME = os.environ['USER']

def error(message):
    print "Error:", message
    sys.exit(1)

def main():
    keylist = envoy.run('ssh-add -L').std_out.strip('\n').split('\n')

    if len(keylist) < 1:
        error("SSH-Agent holds no indentities")

    for key in keylist:
        crypto, ckey, name = key.split(' ')
        filename = os.path.join(os.environ['HOME'], '.ssh/fingerprints',
                  RE_MATCH_FILENAME.search(name).group(1)+'.pub')

        with open(filename, 'w') as f:
            print "Writing %s ..." % filename
            f.write(key)

        envoy.run('chmod 600 %s' % filename)
        envoy.run('chown %s %s' % (USERNAME, filename))


if __name__ == '__main__':
    main()


3

走る

ssh-add -L | gawk ' { print $2 > $3 ".pub" } '

リモートマシン上ですべての公開鍵ファイルを自動的に生成します(自分の公開鍵に.ssh/config名前が付けられprivateKeyFileName.pub、矛盾しないパスが含まれていないと仮定します)。chown $USER .ssh/*あなたのsudoケースを呼び出します。


1

受け入れられたソリューションからピックアップし、初期サーバーへのアクセスに使用されるIDを再利用したい場合は、次のようにします。

Host github.com
    IdentitiesOnly yes
    IdentityFile ~/.ssh/authorized_keys

十分です


これは私にはうまくいきません。IDファイルに公開鍵が1つしかない場合-機能しますが、複数の場合は機能しません。
ygrek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.