【SSH】ssh-agentでパスフレーズ入力を省略する方法|ssh-addの使い方・自動登録

【SSH】ssh-agentでパスフレーズ入力を省略する方法|ssh-addの使い方・自動登録 SSH

公開鍵認証で秘密鍵にパスフレーズを設定すると、鍵が盗まれても即座には悪用されず安全です。しかし、そのままだと接続のたびにパスフレーズの入力を求められて面倒です。これを解決するのが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/configAddKeysToAgent yesで自動登録もできます。
  • エージェント転送(-A)は便利ですが、信頼できるサーバーにだけ使います。

鍵とパスフレーズの作り方はssh-keygenで公開鍵認証を設定する方法、接続設定の集約は~/.ssh/configもあわせて参考になります。

スポンサーリンク

ssh-agentを起動する

まずssh-agentを起動します。eval "$(ssh-agent -s)"と実行すると、エージェントが立ち上がり、接続に必要な環境変数(SSH_AUTH_SOCKなど)が現在のシェルに設定されます。

ssh-agent の起動
# 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_PIDSSH_AUTH_SOCKの環境変数が設定されました。この2つがあることで、sshssh-addがエージェントと通信できるようになります。evalを付けるのは、ssh-agent自身は「環境変数を設定するためのコマンド文字列」を出力するだけで、それを現在のシェルに反映させるために評価(eval)が必要だからです。なお、macOSや多くのLinuxデスクトップではログイン時に自動でエージェントが起動しているため、この起動手順自体が不要なこともあります。

ssh-addで鍵を登録する(パスフレーズは1回だけ)

エージェントに秘密鍵を預けるのがssh-addです。ここでパスフレーズを1回だけ入力すれば、以降はエージェントが復号済みの鍵を保持し、接続時のパスフレーズ入力が省略されます。

ssh-add で鍵を登録
# 鍵を登録(パスフレーズを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)
登録は1回・以降は省略(実機で実証)

実機で確認しました。パスフレーズ付きの鍵を用意し、まず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 -lThe agent has no identities.(登録が空になった)ことを確認しました。共用の端末では、作業が終わったらssh-add -Dで鍵を消しておくと安全です。また-tで有効期限を指定して登録すると(例: -t 3600で1時間)、その時間が過ぎると自動で鍵が失効し、次回はまたパスフレーズが必要になります。セキュリティを重視するなら、この時間制限つき登録が便利です。

自動登録(AddKeysToAgent)

毎回ssh-addを打つのも手間なら、~/.ssh/configAddKeysToAgent yesを書いておく方法があります。すると、初めてその鍵で接続したときに自動でエージェントに登録され、以降は省略されます。

configで自動登録
# ~/.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 yesssh-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を書くのが安全です。多段接続の代替としては、ProxyJumpssh -J 踏み台 目的地)のほうが安全とされ、近年はこちらが推奨されます。

主なコマンド一覧

ssh-agentssh-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で有効期限をつけて登録します。

よくある質問

Qssh-agentは何のためのものですか?
Aパスフレーズ付きの秘密鍵を、復号した状態でメモリに預かっておく常駐プログラムです。これにより、接続のたびにパスフレーズを入力する手間が省けます。最初にssh-addで1回入力すれば、以降そのセッションの間は再入力なしで接続できます。パスフレーズによる安全性を保ちつつ、快適さを両立できます。
Q接続のたびにパスフレーズを聞かれて面倒です。
Assh-agentを起動(eval "$(ssh-agent -s)")し、ssh-add ~/.ssh/id_ed25519で鍵を登録してください。登録時に1回だけパスフレーズを入力すれば、以降は省略されます。~/.ssh/configAddKeysToAgent yesを書けば、初回接続時に自動登録もできます。
Q登録した鍵を確認・削除するには?
Assh-add -lで登録済みの鍵を一覧表示できます。削除は、特定の鍵ならssh-add -d 鍵ファイル、すべてならssh-add -Dです。実機でも、-Dで全削除すると一覧が空になることを確認しています。共用PCで席を外すときは-Dで消すか、-t 秒数で有効期限をつけて登録すると安全です。
Qエージェント転送(-A)は使っても大丈夫ですか?
A自分が管理する・信頼できるサーバーにだけ使ってください。-Aを有効にすると、接続先サーバーの管理者があなたのエージェントを一時的に利用できてしまう可能性があります。共用サーバーや信頼できないホストでは避け、多段接続には、より安全なProxyJumpssh -J 踏み台 目的地)の利用も検討してください。
Qターミナルを閉じたら、また登録が必要ですか?
Aはい。ssh-agentは基本的にセッション単位で動くため、閉じると登録が失われることがあります。ただし、macOSや多くのLinuxデスクトップではログイン時にエージェントが自動起動し、鍵も保持される設定が一般的です。~/.ssh/configAddKeysToAgent yesや、macOSのキーチェーン連携を使うと、再登録の手間を減らせます。

まとめ

  • ssh-agentは復号済みの鍵を預かり、パスフレーズ入力を省略します。
  • 起動はeval "$(ssh-agent -s)"、登録はssh-add 鍵(パスフレーズは1回)。
  • 確認はssh-add -l、削除は-d/-D、期限つきは-t
  • ~/.ssh/configAddKeysToAgent yesで自動登録できます。
  • エージェント転送(-A)は信頼できるサーバーにだけ。多段はProxyJumpも。

ssh-agentは、「パスフレーズで安全性を確保しつつ、入力の手間はなくす」ための仕組みです。鍵にパスフレーズを設定したうえでエージェントを使えば、安全性と快適さを両立できます。~/.ssh/configとあわせて設定し、ストレスのないSSH環境を整えましょう。