BlankSlate

いや、そういう声もあるというだけです

ssh-agentとssh-add

manの書き起こし

ssh-agent

秘密鍵を管理する。

ssh-agent(以下、認証エージェント)が起動している状態でssh等を実行すると、sshSSH_AUTH_SOCKにあるUNIXソケットファイルを経由して認証エージェントとやり取りし、秘密鍵が登録されている場合は認証エージェントが必要な認証を代行する。

環境変数

  • SSH_AUTH_SOCK
    • 認証エージェントが作成したUNIXソケットファイルへのパス
  • SSH_AGENT_PID
    • 起動した認証エージェントのプロセスID

起動

graph LR subgraph 環境変数 SSH_AGENT_PID SSH_AUTH_SOCK end subgraph $TMPDIR/ssh-XXX/agent.XXX UNIXソケットファイル end ssh-agent-- 作成 -->UNIXソケットファイル ssh-agent-- 定義 -->SSH_AGENT_PID ssh-agent-- 定義 -->SSH_AUTH_SOCK UNIXソケットファイル-- ソケットファイルのパス ---SSH_AUTH_SOCK

実行すると認証エージェントが起動する。

同時に、標準出力へ環境変数の設定と認証エージェントのプロセスIDを出力するコードを吐き出すので、evalすることが前提。

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-RisMJzx3gFiV/agent.8320; export SSH_AUTH_SOCK;
SSH_AGENT_PID=8321; export SSH_AGENT_PID;
echo Agent pid 8321;

また、$TMPDIR/ssh-<なんか適当な文字列>/agent.<プロセスID>1UNIXソケットファイルを作成する。

終了

-kSSH_AUTH_SOCKを削除し、プロセスID:SSH_AGENT_PIDを終了させる。要は認証エージェントを終了させる。

同時に認証エージェントが定義した環境変数の定義を外すコードを吐き出すので、やっぱりevalが前提。

$ ssh-agent -k
unset SSH_AUTH_SOCK;
unset SSH_AGENT_PID;
echo Agent pid 8321 killed;

ssh-add

graph LR subgraph 環境変数 SSH_AUTH_SOCK end subgraph $TMPDIR/ssh-XXX/agent.XXX UNIXソケットファイル end UNIXソケットファイル-- ソケットファイルのパス ---SSH_AUTH_SOCK ssh-add-- 参照 -->SSH_AUTH_SOCK ssh-add-- 経由 -->UNIXソケットファイル UNIXソケットファイル-- 秘密鍵を登録 -->認証エージェント

認証エージェントへ秘密鍵を登録する。秘密鍵にパスフレーズが設定されている場合は入力を促される。

秘密鍵を引数で指定されなかった場合、以下のファイルが登録される。

  • ~/.ssh/identity
  • ~/.ssh/id_dsa
  • ~/.ssh/id_ecdsa
  • ~/.ssh/id_ed25519
  • ~/.ssh/id_rsa

認証エージェントとのやり取りは、SSH_AUTH_SOCKを経由して行われる。

環境変数

  • SSH_AUTH_SOCK
    • 認証エージェントとやり取りするためのUNIXソケットファイルへのパス
    • 基本的に認証エージェントが起動時に定義する

ユースケース

  1. ssh-agentを起動する。
  2. ssh-addを用い、秘密鍵をssh-agentへ登録する。
  3. sshする

→ 一度ssh-addしておくと、同一セッション中は秘密鍵のパスフレーズを入力しなくてもよくなる。

問題

  • ssh-agentは明示的に終了させないといけない

参考

  1. TMPDIRが定義されていない場合は/tmpになるっぽい

History