ssh-agentコマンドで秘密鍵を管理する方法|ssh-addとForwardAgentで多段SSH接続を自動化する設計

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, セキュリティ > ssh-agentコマンドで秘密鍵を管理する方法|ssh-addとForwardAgentで多段SSH接続を自動化する設計
「サーバーにSSHで入るたびにパスフレーズを入力している。cronや自動化スクリプトでSSHが詰まる」
「踏み台サーバー経由で内部ホストに入りたいが、内部サーバーに秘密鍵を置くのはセキュリティ的に不安」

ssh-agentは、ログイン時に一度だけパスフレーズを入力すれば、同一シェルセッション中のSSH接続に認証を代行してくれるデーモンです。さらにForwardAgentを設定すると、踏み台サーバー越しの多段接続でも自分のPCに置いた秘密鍵をそのまま使える設計が実現できます。内部サーバーに秘密鍵をコピーする必要がなくなり、鍵の管理が一元化されます。

この記事では、ssh-agentの起動方法、ssh-addによる鍵登録の手順、ForwardAgentを使った多段SSH接続の設計、そして効かない時のトラブルシュートまでを、RHEL 9.4 / Ubuntu 24.04 LTSの実機出力とともに解説します。

この記事のポイント

・ssh-agentはUnixソケット経由で鍵を保持し、SSH認証を代行するデーモン
・ssh-addで秘密鍵を登録すると以降の接続でパスフレーズ入力が不要になる
・ForwardAgentで踏み台経由の多段接続でもPC上の鍵が使えるようになる
・ForwardAgentは信頼できるサーバーにのみ設定し、無制限の委譲は避ける


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

ssh-agentとは何か|鍵を保持して認証を代行する仕組み

通常のSSH公開鍵認証では、接続のたびに秘密鍵をディスクから読み込み、パスフレーズで復号して使います。ssh-agentは、起動時に秘密鍵をメモリ上に保持し、SSHクライアントからの認証要求を代行するデーモンです。

動作の流れはシンプルです。

・ssh-agentが起動するとUnixドメインソケット(/tmp/ssh-XXXX/agent.PID)を作成する
SSH_AUTH_SOCK環境変数にそのソケットパスが設定される
・以降のSSHコマンドはSSH_AUTH_SOCKを見てエージェントと通信し、認証を行う

この設計から2つのことが言えます。まず、ssh-agentは環境変数を引き継いだプロセスからのみ有効です。別のターミナルウィンドウを開いても、SSH_AUTH_SOCKを設定しない限りそのターミナルからはエージェントに届きません。次に、プロセスが終了するとメモリ上の鍵も消えるので、ログアウト後も鍵が残り続けるリスクはありません。

ssh-agentを起動してssh-addで鍵を登録する基本手順

1. ssh-agentを起動する

ターミナルで以下を実行します。evalで囲むのは、出力された環境変数の設定を現在のシェルに反映させるためです。

$ eval "$(ssh-agent -s)" Agent pid 14238

Agent pid 14238のように表示されれば、エージェントが起動し環境変数も設定済みです。確認するには以下のように実行します。

$ echo $SSH_AUTH_SOCK /tmp/ssh-A1bCdE2/agent.14238 $ echo $SSH_AGENT_PID 14238

2. ssh-addで秘密鍵を登録する

鍵を登録するにはssh-addに秘密鍵のパスを渡します。パスフレーズが設定されている鍵は、ここで一度だけ入力します。

$ ssh-add ~/.ssh/id_ed25519 Enter passphrase for /home/taro/.ssh/id_ed25519: Identity added: /home/taro/.ssh/id_ed25519 (taro@myserver)

引数なし(ssh-addだけ)で実行すると、デフォルトの鍵ファイル(~/.ssh/id_rsa~/.ssh/id_ed25519など)を順に登録しようとします。

有効期限を設けたい場合は-tオプションで秒数を指定します。

# 8時間(28800秒)で自動削除 $ ssh-add -t 28800 ~/.ssh/id_ed25519 Identity added: /home/taro/.ssh/id_ed25519 (taro@myserver) Lifetime set to 28800 seconds

3. 鍵の登録状態を確認・管理する

ssh-add -lでエージェントに登録済みの鍵のフィンガープリントを一覧表示できます。

$ ssh-add -l 256 SHA256:xXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX taro@myserver (ED25519)

よく使う鍵管理コマンドをまとめます。

ssh-add -l:登録済み鍵のフィンガープリント一覧を表示
ssh-add -L:登録済み鍵の公開鍵全体を表示(authorized_keys確認に便利)
ssh-add -d ~/.ssh/id_ed25519:特定の鍵をエージェントから削除
ssh-add -D:全鍵を一括削除
ssh-add -x:エージェントをパスワードでロック(席を外す時)

ForwardAgentで踏み台サーバー越しの多段SSH接続を設計する

「踏み台サーバーから内部サーバーに入る際に、内部サーバーへの鍵を踏み台に置きたくない」という状況でForwardAgentが活きます。

通常、踏み台から内部サーバーに接続するには踏み台上に秘密鍵が必要です。しかしForwardAgentを使うと、PCのエージェントが踏み台を通じて内部サーバーの認証に使われるため、踏み台に秘密鍵を置かずに済みます。

1. ~/.ssh/configにForwardAgentを設定する

自分のPCの~/.ssh/configに以下のように書きます。

# 踏み台サーバー(ForwardAgentを有効に) Host bastion HostName 203.0.113.10 User taro IdentityFile ~/.ssh/id_ed25519 ForwardAgent yes # 内部サーバー(踏み台経由でアクセス) Host internal-web HostName 192.168.1.20 User taro ProxyJump bastion

この設定でssh internal-webと打つだけで、踏み台を経由して内部サーバーへワンコマンドで入れます。

2. 踏み台から内部サーバーへの接続を確認する

まず自分のPCでssh-agentを起動して鍵を登録してから接続します。

# PCでエージェント起動・鍵登録 $ eval "$(ssh-agent -s)" Agent pid 15301 $ ssh-add ~/.ssh/id_ed25519 Identity added: /home/taro/.ssh/id_ed25519 (taro@mypc) # 内部サーバーへ直接接続(踏み台を自動経由) $ ssh internal-web Last login: Sun Aug 31 10:00:00 2026 from 192.168.1.1 [taro@internal-web ~]$ # 内部サーバー側でエージェントが転送されているか確認 [taro@internal-web ~]$ ssh-add -l 256 SHA256:xXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX taro@mypc (ED25519)

内部サーバー側でssh-add -lが成功し、PCの鍵が表示されていれば転送は正常です。

3. ForwardAgentの安全な使い方

ForwardAgentは便利ですが、接続先サーバーのroot権限を持つ人がエージェントのソケットにアクセスできると、なりすましに使われるリスクがあります。安全に使うための基準を以下にまとめます。

・ForwardAgentは自分が管理する信頼できるサーバーにのみ設定する
・不特定多数が管理者権限を持つ可能性があるサーバーには設定しない
・作業が終わったらssh-add -Dでエージェントの鍵を削除する習慣をつける

サーバー側でエージェント転送を禁止したい場合は、/etc/ssh/sshd_configに以下を追記します。

# /etc/ssh/sshd_config AllowAgentForwarding no

設定後はsshdを再起動して反映します。

# RHEL系 # systemctl restart sshd # systemctl status sshd * sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: enabled) Active: active (running) since Sun 2026-08-31 10:15:22 JST; 3s ago # Ubuntu # systemctl restart ssh

ssh-agentをログインシェルに自動起動する設定

毎回手動でeval "$(ssh-agent -s)"を打つのは手間です。~/.bash_profileまたは~/.profileに以下のブロックを追加すると、ログイン時に自動起動できます。

# ~/.bash_profile に追記 if [ -z "$SSH_AUTH_SOCK" ]; then eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519 fi

if [ -z "$SSH_AUTH_SOCK" ]で「エージェントがまだ起動していない場合のみ起動する」条件を付けています。GUIデスクトップ環境(GNOME等)ではssh-agentを自動起動するサポートが組み込まれているケースもあるため、この条件分岐がないと二重起動になります。

なお、~/.bash_profileはログインシェルの初回のみ読まれます。ターミナルエミュレータを新しく開くたびにエージェントが必要な場合は、~/.bashrcに移してもかまいませんが、多重起動に注意してください。

ssh-agentが効かない時のトラブルシュート

1. SSH_AUTH_SOCKが未設定またはソケットが存在しない

$ ssh-add -l Could not open a connection to your authentication agent.

このエラーはSSH_AUTH_SOCKが設定されていないか、ソケットファイルが消えている場合に出ます。

# SSH_AUTH_SOCKの値を確認する $ echo $SSH_AUTH_SOCK (空白なら未設定) # ソケットファイルが実在するか確認する $ ls -la $SSH_AUTH_SOCK (No such file or directoryならエージェントが終了している) # 解決: ssh-agentを再起動する $ eval "$(ssh-agent -s)" Agent pid 16401

2. ForwardAgentが効かない

踏み台から内部サーバーに入った際にssh-add -lThe agent has no identities.またはCould not open a connection to your authentication agent.と返す場合は以下を確認します。

~/.ssh/configForwardAgent yesの記述が踏み台のHostブロックにあるか(内部サーバー側ではなく踏み台側に書く)
・PCでssh-add -lを実行し、鍵が登録済みか確認する
・踏み台の/etc/ssh/sshd_configAllowAgentForwarding yes(デフォルト値)になっているか確認する

ssh -vA bastionで接続デバッグログを出力すると、debug1: Requesting agent forwarding.debug1: Remote: Agent forwarding enabledの文字列が確認できます。

3. 接続先のSSHポートが正常にListenしているか確認する

「SSHで接続できない」という場面では、まず接続先でSSHが正常にListenしているかを確認してください。Linux ポート確認の全コマンドではss・netstat・lsofを使ったポート確認手順を解説しています。

本記事のまとめ

やりたいこと コマンド・設定
ssh-agentを起動して環境変数を設定する eval "$(ssh-agent -s)"
秘密鍵をエージェントに登録する ssh-add ~/.ssh/id_ed25519
有効期限付きで鍵を登録する(8時間) ssh-add -t 28800 ~/.ssh/id_ed25519
登録済み鍵の一覧を確認する ssh-add -l
全鍵をエージェントから削除する ssh-add -D
踏み台でエージェント転送を有効にする ~/.ssh/configのHostブロックにForwardAgent yes
サーバー側でエージェント転送を禁止する /etc/ssh/sshd_configにAllowAgentForwarding no
ssh-agentを正しく使いこなすと、複数のサーバーへの接続がスムーズになるだけでなく、秘密鍵を内部サーバーに置くリスクをなくした設計が実現できます。特にForwardAgentを使った多段SSH接続は、踏み台経由の接続が日常的な環境では必須のスキルです。

SSHの設計とサーバー管理を体系的に学びたい方へ

ssh-agentやForwardAgentを使いこなすには、公開鍵認証の仕組みからsshd_configの設計まで体系的に理解することが重要です。断片的なコマンドを覚えるより、サーバー管理の全体像を把握することで、トラブル発生時に迷わず対処できるようになります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、「Linuxサーバー構築入門マニュアル(図解60P)」を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。