SSH秘密鍵でいっぱいのディレクトリがあり、どのサーバーがログインせずにどの鍵を受け入れるかを確認したいと思います。 ssh-addを使用して認証クライアントにsshキーを追加したり、サーバーにログインせずにこれを行うにはどうすればよいですか? SSHは認証にどのキーを使用すべきかをどのように知ることができますか?サーバーが使用できるキーのフィンガープリントを送信しますか、クライアントがすべてのフィンガープリントを送信し、サーバーがそれを確認しますか?
答え1
次のようなものを使用できます。
#!/bin/bash
KEYPATH=~/.ssh/*
HOSTS=( localhost hosta hostb )
probekey ()
{
for privkey in $KEYPATH
do
if [[ "$(file $privkey)" =~ "private" ]]
then
#echo "Probing key $privkey for host $1"
ssh -i "${privkey}" -o "IdentitiesOnly yes" -o "PreferredAuthentications publickey" -o "ControlMaster no" "$1" exit 2>/dev/null
if [ "$?" == "0" ]
then
echo "Key ${privkey} matches for host $1"
fi
fi
done
}
for HOST in ${HOSTS[@]}
do
probekey $HOST
done
このスクリプトの主な目的は、ホスト配列()を繰り返して$HOSTS
そのprobekey
機能を実行することです。この関数はファイルのリストを繰り返して、$KEYPATH
ファイル形式に個人(RSAまたはDSA秘密鍵ファイルの場合)が含まれていることを確認し、一致する場合はそのssh
特定の鍵を使用してホストへの接続を開始します。接続が成功すると、戻りコードは 0 でメッセージが出力されます。
これは質問に対する正確な答えではないためするホストにログインし(キーが一致する場合)、コマンドをexit
実行して直接ログアウトします。
答え2
ログインしないと、サーバーはどのキーが許可されているかを確認できません。鍵が承認されたかどうかを知る唯一の方法は、その鍵を使用してログインしようとすることです。
アカウントで許可されているキーを一覧表示する方法がある場合、これはプライバシーを侵害し、場合によっては流出が容易になる可能性があります。 SSHは、アカウント名が有効かどうかを知らせません。ログイン拒否は、アカウント名が不明であるか、認証データが無効なため、ログインが拒否されました。そうしないと、少なくとも誰がコンピュータにアカウントを持っているかが公開され、個人情報を侵害します。さらに、攻撃者が既存のアカウントに集中する可能性があるため、パスワードの脆弱なアカウントに対する無差別の代入攻撃をログおよび侵入防止システムで検出するのがより簡単で困難になります。
サーバーに送信するキーの選択は、SSH クライアントによって異なります。 OpenSSHの場合は、IdentityFile
設定オプション(-i
コマンドラインオプション)を使用して設定し、ssh-agentにロードするキーを選択するか、設定IdentitiesOnly
オプションを指定できます。サーバーはクライアントにチャレンジ(任意に生成された文字列)を送信します。クライアントは秘密鍵とその公開鍵で暗号化され、署名された質問に答える必要があります。サーバーは、署名がその鍵を使用する質問に対する有効な署名であること、および要求されたユーザー名と公開鍵の組み合わせが有効であることを確認します。 (通常、最後の部分は~/.ssh/authorized_keys
この公開鍵を含むユーザーファイルに行があることを意味します。)クライアントは何度も試すことができます(サーバーは数回後に接続を放棄して閉じます)。
どのキーがどのサーバーに有効かを忘れた場合、最も簡単な方法はサーバーにログインして~/.ssh/authorized_keys
ファイルを確認することです。そのサーバーにログインする唯一の方法は、成功するまですべてのキーを試すことであることがわかっている場合は、そうする必要があります。 (もちろん、どのキーが利用可能かを教えてくれるので、読む必要はありません。~/.ssh/authorized_keys
)同じアカウントで複数回試す必要がある場合は、完了する前にサーバーが接続を閉じることができるように準備してからやり直してください。
後で参照できるようにさまざまなキーがある場合は、.ssh/config
各ホストの正しい指示を使用して1つを維持してください。IdentityFile
¹単純化中です実際の合意、ここには必要なものだけを保管してください。