web-dev-qa-db-ja.com

ssh-agentの目的は何ですか?

私は公式の定義を読みました:

ssh-agentは、公開鍵認証(RSA、DSA、ECDSA)に使用される秘密鍵を保持するプログラムです。 ssh-agentはXセッションまたはログインセッションの最初に開始され、他のすべてのウィンドウまたはプログラムはssh-agentプログラムのクライアントとして開始されるという考え方です。環境変数を使用することで、ssh(1)を使用して他のマシンにログインするときに、エージェントを見つけて自動的に認証に使用できます

".. a秘密鍵を保持するプログラム.."-IMHO-ssh鍵はssh-keygenコマンドでユーザーによって生成され、〜/ .sshに単純かつ簡単に保存されます-なぜデーモンが必要なのですかこれらのキーを保持しますか?とにかくどれだけ正確にそれらを保持します-それらは単に.sshに保存されていませんか?

"ssh-agentプログラムのクライアントとして開始されます"-わかりません。どこでそれが必要でしょうか?私は通常、sshを次のように使用します。

 ssh -i ~/.ssh/private_key_name username@hostname

手動で「クライアント」とはどういう意味ですか-どのクライアントですか?ターミナルからsshコマンドを実行して接続しないでください-他にどのようなクライアントがあり、sshコマンドのように、そのsshプライベートファイルへのパスを使用できないのですか?

77
agent_smith

SSHエージェントは、認証データの署名を処理します。サーバーへの認証を行う場合、本人であることを証明するために、秘密鍵を使用して一部のデータに署名する必要があります。

セキュリティ対策として、ほとんどの人は秘密鍵をパスフレーズで慎重に保護しているため、認証を試みる場合はこのパスフレーズを入力する必要があります。これは望ましくない可能性があるため、ssh-agentはキーをキャッシュに保存します。エージェントがパスワードを復号化する場合は、パスワードを1回入力するだけで済みます(ssh-agentはpamと統合できるため、パスワードを復号化する必要はありません)。多くのディストリビューションが行います)。

SSHエージェントはこれらのキーをクライアントプログラムに渡さず、クライアントがデータを送信し、署名されたデータで応答するソケットを提示するだけです。これの副次的な利点は、完全に信頼していないプログラムでも秘密鍵を使用できることです。

SSHエージェントのもう1つの利点は、SSH経由で転送できることです。したがって、エージェントを転送している間にホストAにsshすると、Aから別のホストBにsshすることができ、ホストAに(暗号化されていなくても)鍵が存在する必要はありません。

84

ssh-agentの利点は、パスフレーズを1回入力するだけで済むことです。 RSA秘密鍵がパスフレーズで暗号化されていない場合、ssh-agentは必要ありません。 sshコマンドはクライアントの例です。

16
jordanm

さまざまな異なるマシンに日常的にsshingしていて、それぞれが独自のキーとパスフレーズを持っている場合は、ssh-agentを使用すると、各キーのパスフレーズを1回入力できます1 セッションの開始時に、パスフレーズを再入力しなくても、何度でも各マシンに対して認証できます。

もう1つの利点は、manページのように、エージェントがリクエストチャネルを介して秘密鍵を送信しないことです。したがって、異なるボックス間を行き来する場合、秘密鍵は保護されます。

1キーがエージェントに保持されるlife時間を設定できます。

7
jasonwryan

ウィキペディアの記事 おそらく最も良い説明があります:

サーバーへの検証は、チャレンジ/レスポンス認証に基づいています。 sshは、ユーザー名とキーの要求を使用してサーバーに接続します。 sshデーモンは要求を取得し、認証ファイルに格納されている公開鍵に基づいてチャレンジを送り返します。 sshは秘密鍵を使用してキー応答を作成し、それを接続の反対側の待機中のsshdに送信します。秘密鍵自体は送信しません。 sshデーモンはキーレスポンスを検証し、有効な場合はシステムへのアクセスを許可します。 ssh-agentは、SSH接続を待機するソケットを作成することで、これを簡素化します。ユーザーは単にssh-agentを起動し、キーの検索方法を指示し(デフォルトの場所にない場合)、使用する各キーのパスフレーズを1回だけ入力してから、ssh-agentがユーザーがリモートサーバーに接続するたびに休憩します。

再びウィキペディアの記事から逐語的に:

... ssh-agentはソケットを作成し、sshからの接続を確認します。このソケットに接続できるすべてのユーザーは、ssh-agentにもアクセスできます。権限は通常のLinuxまたはUnixシステムと同様に設定されます。エージェントが起動すると、/ tmpに新しいディレクトリが作成され、権限が制限されます。ソケットはフォルダにあります。

通常、システム変数または$HOME/.bashrc$HOME/.profile(bashシェルの場合)などのユーザーのrcファイルに配置され、環境変数ssh-agentセットが環境に完全に組み込まれます。

私のFedora 14システムでは、X11サブシステムの一部としてかなり早く起動します。このファイルでは、/etc/X11/xinit/xinitrc-common

# Prefix launch of session with ssh-agent if available and not already running.
SSH_AGENT=
if [ -z "$SSH_AGENT_PID" ] && [ -x /usr/bin/ssh-agent ]; then
    if [ "x$TMPDIR" != "x" ]; then
        SSH_AGENT="/usr/bin/ssh-agent /bin/env TMPDIR=$TMPDIR"
    else
        SSH_AGENT="/usr/bin/ssh-agent"
  fi
fi

変数$SSH_AGENTは、ここで/etc/X11/xinit/Xclientsなどの他のX11起動スクリプトで使用されます。

exec -l $Shell -c "$SSH_AGENT $XCLIENTS_D/Xclients.$1.sh"

これをここに組み込むと、次の環境変数が親シェルの一部として設定されるため、フォークされたすべての子にもそれらが必要になります。たとえば、次のようになります。

SSH_AUTH_SOCK=/tmp/ssh-PspRF18958/agent.18958; export SSH_AUTH_SOCK;
SSH_AGENT_PID=18959; export SSH_AGENT_PID;

これは少し複雑ですが、簡単に言えば、これは基本的にssh-agentで行われていることです。

たとえばGNOMEでは、実際にssh-agentは起動アプリケーションとしてユーザーごとに起動されます。

ss of startup apps

TL; DR

結論として、ssh-agentが存在するため、sshキーが必要な場合は、パスフレーズを使用して1回ロックを解除するだけで(パスフレーズがある場合)、それ以降はメモリ内の復号化された形式で利用できます(羊)。

7
slm

「ssh-agentプログラムのクライアントとして開始される」とは、(ローカル)ログインセッションの初期化中にssh-agentが開始されるため、すべてのプログラムが環境変数$SSH_AGENT_PIDおよび$SSH_AUTH_SOCKエージェントの接続に必要です。

秘密鍵の処理をsshから取り除くもう1つの利点は、ssh-agentをgpg-agentに置き換えることができることです。したがって、SSHにOpenPGP鍵(認証機能付き)を使用できます。これは、スマートカード上のOpenPGP鍵の優れたソリューションです。

1
Hauke Laging