公開鍵認証で秘密鍵にパスフレーズを設定すると、鍵が盗まれても即座には悪用されず安全です。しかし、そのままだと接続のたびにパスフレーズの入力を求められて面倒です。これを解決するのがssh-agentです。パスフレーズを最初の1回だけ入力すれば、あとはそのセッションの間、再入力なしで接続できるようになります。
ssh-agentは「復号済みの秘密鍵をメモリ上で預かってくれる常駐プログラム」で、ssh-addで鍵を預けます。この記事では、実機のLinux(WSLのDebian)でssh-agentを起動し、鍵を登録・確認・削除する流れを動かしながら整理します。「セキュリティ(パスフレーズ)と快適さ(省略)を両立する」ための定番の仕組みです。
ssh-agentは、復号した秘密鍵をメモリで預かりパスフレーズ入力を省略します。- 起動は
eval "$(ssh-agent -s)"、鍵の登録はssh-add 鍵ファイルです。 - パスフレーズを聞かれるのは登録時の1回だけ。以降の接続では省略されます。
- 登録済みの鍵は
ssh-add -lで確認、ssh-add -Dで全削除できます。 ~/.ssh/configにAddKeysToAgent yesで自動登録もできます。- エージェント転送(
-A)は便利ですが、信頼できるサーバーにだけ使います。
鍵とパスフレーズの作り方はssh-keygenで公開鍵認証を設定する方法、接続設定の集約は~/.ssh/configもあわせて参考になります。
ssh-agentを起動する
まずssh-agentを起動します。eval "$(ssh-agent -s)"と実行すると、エージェントが立ち上がり、接続に必要な環境変数(SSH_AUTH_SOCKなど)が現在のシェルに設定されます。
# ssh-agent を起動し、環境変数を現在のシェルに反映 eval "$(ssh-agent -s)" # Agent pid 12345 ← 起動した # eval を付ける理由: ssh-agent は「環境変数を設定するコマンド」を # 出力するだけなので、eval で実際にシェルへ反映させる # 多くのLinuxデスクトップやmacOSでは、ログイン時に # 自動で ssh-agent が起動しているため、この手順は不要なことも多い
実機でも、eval "$(ssh-agent -s)"を実行するとAgent pid ...と表示され、SSH_AGENT_PIDとSSH_AUTH_SOCKの環境変数が設定されました。この2つがあることで、sshやssh-addがエージェントと通信できるようになります。evalを付けるのは、ssh-agent自身は「環境変数を設定するためのコマンド文字列」を出力するだけで、それを現在のシェルに反映させるために評価(eval)が必要だからです。なお、macOSや多くのLinuxデスクトップではログイン時に自動でエージェントが起動しているため、この起動手順自体が不要なこともあります。
ssh-addで鍵を登録する(パスフレーズは1回だけ)
エージェントに秘密鍵を預けるのがssh-addです。ここでパスフレーズを1回だけ入力すれば、以降はエージェントが復号済みの鍵を保持し、接続時のパスフレーズ入力が省略されます。
# 鍵を登録(パスフレーズを1回だけ聞かれる) ssh-add ~/.ssh/id_ed25519 # Enter passphrase for ~/.ssh/id_ed25519: ← ここで1回入力 # Identity added: ~/.ssh/id_ed25519 # 以降、ssh 接続ではパスフレーズを聞かれない ssh myserver # パスフレーズなしでつながる # 登録済みの鍵を一覧表示 ssh-add -l # 256 SHA256:xxxx... comment (ED25519)
実機で確認しました。パスフレーズ付きの鍵を用意し、まずssh-add -lを実行するとThe agent has no identities.(登録なし)と表示されました。次にssh-add ./id_passで登録するとIdentity addedと表示され(このときパスフレーズを1回だけ入力)、再度ssh-add -lすると登録された鍵がSHA256指紋つきで一覧表示されました。さらにその指紋が、ssh-keygen -lfで確認した鍵本体の指紋と完全に一致することも確認できました(=正しい鍵がエージェントに預けられている)。一度登録してしまえば、以降そのセッションの間は何度sshしてもパスフレーズを聞かれません。「パスフレーズで安全性を確保しつつ、入力の手間はほぼゼロ」という理想的な状態になります。
登録の確認と削除(-l / -d / -D)
エージェントに預けた鍵は、ssh-addのオプションで管理します。-lで一覧、-dで個別削除、-Dで全削除です。共用PCなど、席を離れるときに鍵を消したい場合に使います。
# 登録済みの鍵を一覧 ssh-add -l # 特定の鍵を削除 ssh-add -d ~/.ssh/id_ed25519 # すべての鍵を削除(席を外すときなどに) ssh-add -D # All identities removed. # 一定時間で自動的に鍵を失効させる(例: 1時間 = 3600秒) ssh-add -t 3600 ~/.ssh/id_ed25519
実機でも、ssh-add -Dを実行するとAll identities removed.と表示され、直後のssh-add -lでThe agent has no identities.(登録が空になった)ことを確認しました。共用の端末では、作業が終わったらssh-add -Dで鍵を消しておくと安全です。また-tで有効期限を指定して登録すると(例: -t 3600で1時間)、その時間が過ぎると自動で鍵が失効し、次回はまたパスフレーズが必要になります。セキュリティを重視するなら、この時間制限つき登録が便利です。
自動登録(AddKeysToAgent)
毎回ssh-addを打つのも手間なら、~/.ssh/configにAddKeysToAgent yesを書いておく方法があります。すると、初めてその鍵で接続したときに自動でエージェントに登録され、以降は省略されます。
# ~/.ssh/config
Host *
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519
# これで、初回接続時にパスフレーズを1回入力すると
# 自動的にエージェントへ登録され、以降は省略される
# macOS ではキーチェーンに保存する設定も便利
# Host *
# AddKeysToAgent yes
# UseKeychain yes
AddKeysToAgent yesを書いておくと、明示的にssh-addしなくても、初回接続時のパスフレーズ入力だけでエージェントに登録されます。~/.ssh/configの設定なので、Host *(全ホスト共通・必ずファイル末尾に)に入れておくと便利です。macOSでは、パスフレーズをOSのキーチェーンに保存する設定(UseKeychain yesやssh-add --apple-use-keychain)を使うと、再起動後も入力が不要になります。
エージェント転送(-A)と注意
エージェント転送(-A)は、接続先のサーバーからさらに別のサーバーへ、手元の鍵を使って接続できるようにする機能です(多段SSH)。便利ですが、セキュリティ上の注意が必要です。
# -A: 接続先で、手元のエージェントを使えるようにする ssh -A user@step-server # → step-server から、さらに ssh git@github.com などが # 手元の鍵で行える(鍵は step-server に置かなくてよい) # config で特定ホストにだけ許可する書き方 # Host step-server # ForwardAgent yes
-A(エージェント転送)は、踏み台サーバー経由で別のサーバーへ接続する(多段SSH)ときに便利です。接続先に秘密鍵を置かなくても、手元の鍵を使って先の接続ができます。ただし注意が必要です。エージェント転送を有効にすると、接続先サーバーの管理者権限を持つ人が、あなたのエージェントを一時的に利用できてしまう可能性があります(あなたが接続している間、その鍵で別のサーバーへログインされる恐れ)。したがって、-Aは自分が管理する・信頼できるサーバーにだけ使ってください。共用サーバーや信頼できないホストへの-Aは避けます。常時オンにするのではなく、~/.ssh/configで必要なホストにだけForwardAgent yesを書くのが安全です。多段接続の代替としては、ProxyJump(ssh -J 踏み台 目的地)のほうが安全とされ、近年はこちらが推奨されます。
主なコマンド一覧
ssh-agent/ssh-addの要点をまとめます。
| コマンド | 働き |
|---|---|
eval "$(ssh-agent -s)" |
エージェントを起動 |
ssh-add 鍵 |
鍵を登録(パスフレーズは1回) |
ssh-add -l |
登録済みの鍵を一覧 |
ssh-add -d 鍵 / -D |
個別削除 / 全削除 |
ssh-add -t 秒数 鍵 |
有効期限つきで登録 |
AddKeysToAgent yes |
configで自動登録 |
よくある失敗
evalを付けずにssh-agentを実行する
環境変数が設定されず「Could not open a connection to your authentication agent」になります。eval "$(ssh-agent -s)"で起動します。
ターミナルを閉じると再登録が必要
エージェントはセッション単位です。AddKeysToAgent yesやOSの自動起動を使うと楽になります。
パスフレーズ入力が毎回出る
鍵がエージェントに登録されていません。ssh-add -lで確認し、未登録ならssh-addします。
信頼できないサーバーに-Aを使う
エージェントを悪用される恐れがあります。信頼できるホストにだけ、またはProxyJumpを使います。
共用PCで鍵を預けたまま離席する
ssh-add -Dで消すか、-tで有効期限をつけて登録します。
よくある質問
ssh-addで1回入力すれば、以降そのセッションの間は再入力なしで接続できます。パスフレーズによる安全性を保ちつつ、快適さを両立できます。ssh-agentを起動(eval "$(ssh-agent -s)")し、ssh-add ~/.ssh/id_ed25519で鍵を登録してください。登録時に1回だけパスフレーズを入力すれば、以降は省略されます。~/.ssh/configにAddKeysToAgent yesを書けば、初回接続時に自動登録もできます。ssh-add -lで登録済みの鍵を一覧表示できます。削除は、特定の鍵ならssh-add -d 鍵ファイル、すべてならssh-add -Dです。実機でも、-Dで全削除すると一覧が空になることを確認しています。共用PCで席を外すときは-Dで消すか、-t 秒数で有効期限をつけて登録すると安全です。-Aを有効にすると、接続先サーバーの管理者があなたのエージェントを一時的に利用できてしまう可能性があります。共用サーバーや信頼できないホストでは避け、多段接続には、より安全なProxyJump(ssh -J 踏み台 目的地)の利用も検討してください。ssh-agentは基本的にセッション単位で動くため、閉じると登録が失われることがあります。ただし、macOSや多くのLinuxデスクトップではログイン時にエージェントが自動起動し、鍵も保持される設定が一般的です。~/.ssh/configのAddKeysToAgent yesや、macOSのキーチェーン連携を使うと、再登録の手間を減らせます。まとめ
ssh-agentは復号済みの鍵を預かり、パスフレーズ入力を省略します。- 起動は
eval "$(ssh-agent -s)"、登録はssh-add 鍵(パスフレーズは1回)。 - 確認は
ssh-add -l、削除は-d/-D、期限つきは-t。 ~/.ssh/configのAddKeysToAgent yesで自動登録できます。- エージェント転送(
-A)は信頼できるサーバーにだけ。多段はProxyJumpも。
ssh-agentは、「パスフレーズで安全性を確保しつつ、入力の手間はなくす」ための仕組みです。鍵にパスフレーズを設定したうえでエージェントを使えば、安全性と快適さを両立できます。~/.ssh/configとあわせて設定し、ストレスのないSSH環境を整えましょう。

