- リモートサーバーでGitHub操作を行うとき、秘密鍵を置くのはセキュリティ的に不安…
そんな時に便利なのがSSHエージェントフォワーディングです。
これを利用すれば、リモートサーバーにいながらローカルマシンにある秘密鍵を使って Git 操作ができるようになります。
つまり、リモートサーバー常に秘密鍵がなくとも、あたかもリモートサーバー上に秘密鍵があるように振る舞うことができるというわけです。
SSHエージェントフォワーディングの仕組み
サーバーに入った状態で、ローカルマシンにある秘密鍵が使えるようになります。
上の図でもわかるとおりサーバーには秘密鍵を置きません。
ここでリモートサーバーに接続する時に-A
オプションをつけると、SSHエージェントフォワーディングとして接続されます。
これにより、リモートサーバーからローカルマシンのSSHエージェントにアクセスできるようになるのです。
つまり、秘密鍵の実態はローカルマシンにありながら、リモートサーバーからもローカルマシンの秘密鍵が使える状態になるわけです。
特徴としては以下の通り。
- 秘密鍵をリモートサーバーに置かない
秘密鍵はローカルマシンに保持されたまま - 安全なアクセス権限の管理
リモートサーバーではSSHエージェントを経由して認証が行われるので、直接秘密鍵を扱わない
これにより、リモートサーバーに秘密鍵をおくことなく、GitHubへの認証も通すことができます。
SSHエージェントフォワーディングの手順
SSHエージェントフォワーディングの具体的な手順をご紹介します。
- ローカルマシンのSSHエージェントに鍵を登録
- エージェントフォワーディングで接続
- 動作確認
順番に解説します。
ローカルマシンでSSHエージェントを起動し、鍵を追加
まず、ローカルマシンでSSHエージェントを起動します。
# SSHエージェントを起動
eval "$(ssh-agent -s)"
SSHエージェントに秘密鍵を登録しましょう。
# 秘密鍵をエージェントに追加
ssh-add ~/.ssh/id_rsa
これでローカルマシンのSSHエージェントに秘密鍵が登録されました。
エージェントフォワーディングを使ってサーバーに接続
-A
オプションをつけて、エージェントフォワーディングでサーバーに接続します。
ssh -A username@remote-server
これでリモートサーバーからローカルマシンのSSHエージェントに通信できるようになります。
リモートサーバー上でGit操作を行う
あとはサーバー上で通常通りのGit操作を行えます。
GitHubとの疎通確認をしてみましょう。
ssh -T git@github.com
# Hi ********! You've successfully authenticated, but GitHub does not provide shell access.
接続にあたってはローカルのSSH秘密鍵が利用されるので、リモートサーバーに秘密鍵を保存しなくても正常に動きます。
よくある疑問とその答え
エージェント転送の確認
次のコマンドでSSHエージェントが正常に転送されているか確認します。
echo $SSH_AUTH_SOCK
# 何も返ってこない
転送されていなければ何も返ってきませんので、SSH接続の時に-A
オプションを忘れていないかを確認してください。
もしパスが返ってくればエージェント転送が有効です。
続いて、ローカル側で次のコマンドを実行してみましょう。
ssh-add -l
# The agent has no identities.
The agent has no identities.
と返ってきた場合には、SSHエージェントに鍵が登録されていません。
次のコマンドでSSHエージェントに鍵を登録しましょう。
ssh-add ~/.ssh/id_rsa
再度ssh-addコマンドを実行します。
ssh-add -l
# 256 SHA256:************* ******@gmail.com (ED25519)
これで鍵が登録されたことがわかりました。
ssh -A
としてログインすれば、GitHubへのアクセスができるようになっているはずです。
エージェントフォワーディングの永続化方法
毎回、自動的に-A
オプションをつける方法があります。
SSH設定ファイル(~/.ssh/config
)にForwardAgent yes
を設定しましょう。
Host remote-server
HostName example.com
User username
ForwardAgent yes
このようにForwardAgent yes
とするとエージェントフォワーディングを自動化できますが、エージェント転送を常に有効にすることはセキュリティリスクがあります。
例えば、中間者攻撃により悪意のあるサーバーがSSHエージェントを悪用する可能性があります。
セキュリティを十分に考慮して利用してください。
基本的には、必要なタイミングで-A
オプションをつけましょう。
まとめ
ここまでSSHエージェントフォワーディングを使った秘密鍵管理の方法をお伝えしてきました。
手順は以下の通りです。
- SSHエージェントに鍵を登録
-A
オプションをつけてSSH接続
便利な方法ですが、中間者攻撃を受けてしまった場合の問題などもあったりするそうです。
セキュリティ対策はしつつの使用が望ましいかと思います。
コメント