概要
タイトルの通りです。
以下の内容はすべて筆者の理解です。間違い等あればご指摘ください。
SSH Agent とは、 SSH する際にユーザの秘密鍵をよしなに管理してくれる存在です。たとえば、 SSH Agent にパスフレーズ付きの秘密鍵を登録すると、 SSH 接続ごとにパスフレーズを求められるといったことがなくなります。 SSH Agent 自体に関する詳細な説明は、別のページ 1 を参照してください。
本記事では、この SSH Agent のフォワーディング機能を利用し、秘密鍵ひとつで便利に多段 SSH する手段を説明します。
想定する環境
色々な開発をしていると、多段 SSH を行う場面にちょいちょい遭遇します。ここで多段 SSH とは、自分のパソコン A からホスト B に SSH し、そこからさらにホスト C に対して SSH するようなことを指します。コマンドにすると、以下のようになるかと思います。
# hostA ===SSH==> hostB ===SSH==> hostC
user1@hostA$ ssh user2@hostB
user2@hostB$ ssh user3@hostC
user3@hostC$ 目的の作業
使う場面は
- インターネットに公開されていないホストに対して、踏み台サーバを経由してアクセスする場合
- SSH 先のホストで、 SSH 公開鍵認証を利用して GitHub にアクセスする場合
などがあると思います。
そのような場合に、ここでいう hostB
に新しい秘密鍵を置くことなく、自分のパソコンの秘密鍵を使って hostC
にアクセスする というのが、今回の目的です。これを実現するために エージェントのフォワーディング という機能を利用します。
なお、既に自分のパソコン (hostA
) の公開鍵が hostB
と hostC
のそれぞれに設置されているものとします。
手順
1. 自分のパソコンで SSH Agent を起動する
実際に秘密鍵を管理してくれる存在である、 SSH Agent を起動します。
Mac の場合は、自動で起動されるためスキップして構いません。
# Linux
user1@hostA$ eval "$(ssh-agent)"
2. 鍵を登録する
SSH Agent に対して、管理してもらう秘密鍵を登録します。
user1@hostA$ ssh-add 秘密鍵ファイル # ~/.ssh/id_rsa など
ファイル名を省略すると、自動で ~/.ssh/id_rsa
, ~/.ssh/id_dsa
, ~/.ssh/id_ecdsa
, ~/.ssh/id_ed25519
が登録されます。 2
Mac の場合は、以下のようにすると mac OS のキーチェインに保存されて、次回以降自動で登録してくれます。
user1@hostA$ ssh-add -K 秘密鍵ファイル
ssh-add -l
を実行してフィンガープリントが表示されたら、正常に登録できています。
# 出力例
$ ssh-add -l
256 SHA256:abcdefghijklmnopqrstuvwxyz0123456789abcdefg user1@hostA (ED25519)
3. hostB
に SSH する
中継役となる hostB
に SSH を行います。
user1@hostA$ ssh -A user2@hostB
この -A
オプションによって、登録された秘密鍵を hostB
で使うことができるようになります (フォワーディングされる)。ここでも、 ssh-add -l
を実行することで、 hostB
で鍵を使えるようになっているか確認することができます。
4. hostC
に SSH する
ssh -A
で hostB
に接続したら、あとは hostC
に SSH して目的の作業を行うだけです。
user2@hostB$ ssh user3@hostC
# ... ログイン時のメッセージとか ...
user3@hostC$ # 目的の作業
GitHub へのアクセスが目的なら、自由にアクセスできるようになっているはずです。 3
user2@hostB$ ssh git@github.com
PTY allocation request failed on channel 0
Hi ユーザ名! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
本来はこのステップで hostB
に新しく秘密鍵を作る必要がありましたが、SSH Agent をフォワーディングしているおかげで hostA
(自分のパソコン) の秘密鍵を使って接続することができます。
5. (optional) 自動でフォワーディングする
~/.ssh/config
で以下のように記述すると、そのホストへの SSH では毎回自動でフォワーディングが行われます。オフにしたい場合は、 yes
の部分を no
に変更します。
Host hostB
ForwardAgent yes
また、全ての接続先に対してフォワーディングを行うように設定することもできますが、十分セキュリティに配慮して使う必要があります。
Host *
ForwardAgent yes
手順は以上です。
まとめ
SSH Agent とそのフォワーディング機能を使うことで、 SSH する先々で秘密鍵を作る必要がなくなります。ただ、使い方によってはセキュリティ的な懸念が生まれると見ることもできますので、充分注意しましょう。4
-
ssh-agent - How to configure, forwarding, protocol. や 【SSH】ssh-agent の使い方 ↩
-
バージョンによります。 ↩
-
もちろん秘密鍵に対応する公開鍵が GitHub に登録されている必要があります。 ↩
-
何か事故が起こった場合、この記事の筆者は責任を負いません。 ↩