「踏み台サーバー経由で内部ホストに入りたいが、内部サーバーに秘密鍵を置くのはセキュリティ的に不安」
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は信頼できるサーバーにのみ設定し、無制限の委譲は避ける
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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
# 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 -lがThe agent has no identities.またはCould not open a connection to your authentication agent.と返す場合は以下を確認します。・
~/.ssh/configのForwardAgent yesの記述が踏み台のHostブロックにあるか(内部サーバー側ではなく踏み台側に書く)・PCで
ssh-add -lを実行し、鍵が登録済みか確認する・踏み台の
/etc/ssh/sshd_configでAllowAgentForwarding 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の設計とサーバー管理を体系的に学びたい方へ
ssh-agentやForwardAgentを使いこなすには、公開鍵認証の仕組みからsshd_configの設計まで体系的に理解することが重要です。断片的なコマンドを覚えるより、サーバー管理の全体像を把握することで、トラブル発生時に迷わず対処できるようになります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、「Linuxサーバー構築入門マニュアル(図解60P)」を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:ip netnsコマンドでLinuxのネットワーク名前空間を操作する方法|仮想NIC・ルーティング分離の実践手順
- この記事の属するカテゴリ:Linuxtips・セキュリティへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます