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


70

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

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

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

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

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

「クライアント」とはマニュアルとはどういう意味ですか?ターミナルからsshコマンドを実行して接続するだけではありません-他のクライアントは何ですか?なぜsshコマンドのようにそのsshプライベートファイルへのパスを使用できないのですか?

回答:


76

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

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

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

SSHエージェントのもう1つの利点は、SSHを介して転送できることです。そのため、エージェントを転送しながらホストAにsshする場合、ホストAに(暗号化された形式でも)キーがなくても、Aから別のホストBにsshできます。


10
これが最も完全な答えだと思いますが、まだ1つのポイントがありません。キーエージェントを使用すると、複数のキーを簡単に使用できます。キーへのパスを指定する代わりに、キーエージェントを使用すると、sshはその中のすべてのキーを試します。
パトリック

3
@Patrickも不利な場合があります-サーバー上で無効なキーを何度も試してください。有効なキーに到達する前に接続が閉じられます。もちろん、それは何~/.ssh/configIdentityFileオプションは、エージェントの有無にかかわらず、ために良いです
トビアスKienzler

@Patrickはエージェントなしでも同様に可能と思われる
アンドレイフェドロフ

@AndreyFedorovはい、エージェントなしで複数のキーを持つことができますが、~/.ssh/configどのリモートホストにどのキーを使用するかを指定することもできます。
パトリック

3
だからssh-agent、秘密鍵がパスフレーズで保護されていない場合、それは必要ないと仮定できますか?
pkaramol

16

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


7

sshそれぞれが独自のキーとパスフレーズを持つさまざまな異なるマシンに定期的にログインしている場合、実行ssh-agentすると、セッションの開始時に1回ずつ各キーのパスフレーズを入力でき、各マシンに対して何度でも認証できますパスフレーズを再入力せずに好きなように。

さらなる利点は、manページごとに、エージェントがリクエストチャネルを介してプライベートキーを送信しないことです。したがって、異なるボックス間を移動する場合、秘密鍵は保護されます。

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


6

ウィキペディアの記事には、おそらく最高の説明があります。

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

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

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

それは、典型的には、システムまたはユーザーのRCファイルのいずれかに入れていますのような$HOME/.bashrcまたは$HOME/.profile(bashのシェルの)環境変数は、そのように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は、次のような他のX11起動スクリプトで使用されます/etc/X11/xinit/Xclients

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実際にはユーザーごとに起動アプリケーションとして起動されます。

                     起動アプリの

TL; DR

要するにssh-agent、sshキーが必要な場合、パスフレーズで1回ロック解除するだけで(1つあれば)、それ以降はメモリ(RAM)の解読された形式で利用できるようになります。


1

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.