ssh-agentを利用すると、リモートサーバに秘密鍵をコピーしなくてもローカル環境の秘密鍵の情報を利用できます。
今回はリモートサーバからGitHubにSSH接続する環境を構築する例をもとにssh-agentの利用方法について紹介します。
目次
リモートサーバからGitHubへSSH接続できる環境を構築する方法
GitHubへSSH接続できる環境がローカルに用意されているとします。
このとき、ローカル環境のキーペアを利用してリモートサーバ上でGitHubへSSH接続する方法について考えてみます。
ssh-agentを利用しない場合
GitHubへSSH接続する際に利用している秘密鍵をリモートサーバへコピーすれば、リモートサーバでもGitHubへSSH接続できます。
ただし秘密鍵を別環境にコピーするのはセキュリティ的に好ましくありません。
ssh-agentを利用する場合
ssh-agentとは秘密鍵を直接渡すことなく秘密鍵の情報を共有できる機能です。
ssh-agentを利用することでリモートサーバにローカル環境の秘密鍵をコピーしなくてもローカル環境と同様にGitHubへSSH接続ができます。
ssh-agentを利用することで秘密鍵をコピーする作業が不要になります。
ssh-agentの利用手順
リモートサーバからGitHubへSSH接続する環境を構築する例をもとにssh-agentの利用手順について紹介します。
前提: ローカル環境からGitHubへSSH接続ができている
GitHubに公開鍵、ローカル環境に秘密鍵が登録されており、以下のような.ssh/config
をもとにローカル環境からGitHubへSSH接続ができる状態になっているとします。
.ssh/config
Host github.com
User git
Hostname github.com
IdentityFile ~/.ssh/id_rsa
### 正常にGitHubにSSH接続できるためレスポンスが返ってくる状態
$ ssh -T github.com
Hi nishina555! You've successfully authenticated, but GitHub does not provide shell access.
ssh-agentに秘密鍵の情報を登録する
ssh-agentに秘密鍵の情報を登録する手順は以下の通りです。
### ssh-agentの起動
$ eval `ssh-agent`
### ssh-agentに秘密鍵の情報を登録
$ ssh-add ~/.ssh/id_rsa
or
$ ssh-add -K ~/.ssh/id_rsa
# -K: ユーザのキーチェーン(Macでいうキーチェーンストア)にも登録する。これによりターミナルを起動するたびに毎回ssh-addしなくて済むようになる
### 登録情報の確認。文字列が返ってくればOK
$ ssh-add -l
1234 SHA256:xxxxxxxxxxxxx.local (RSA)
### 登録した秘密鍵の情報を削除したい場合
$ ssh-add -D
All identities removed.
ssh-agentを有効にした状態でリモートサーバへSSH接続する
ssh-agentを有効化した状態でリモートサーバへSSH接続することで、リモートサーバにssh-agentを引き継げます。
SSH接続でssh-agentを有効化するには以下の2つの方法があります。
- SSH接続の設定にForwardAgentオプションを追加する
- sshコマンドに-Aオプションを追加する
以下ではそれぞれの方法について紹介します。
SSH接続の設定にForwardAgentオプションを追加する
リモートサーバに関するSSH接続設定にForwardAgent yes
を追加することでssh-agentが有効になります。
.ssh/config
host example_remote_host
user hoge
hostname xxx.xxx.xxx.xxx
ForwardAgent yes
[local]
### ssh-agentに登録されている秘密鍵の情報
$ ssh-add -l
1234 SHA256:xxxxxxxxxxxxx.local (RSA)
### リモートサーバへSSH接続する
$ ssh example_remote_host
[example_remote_host]
### リモートサーバにもssh-agentの情報が引き継がれている
$ ssh-add -l
1234 SHA256:xxxxxxxxxxxxx.local (RSA)
sshコマンドに-Aオプションを追加する
-A
オプションを追加するとssh-agentが有効になります。
[local]
### ssh-agentに登録されている秘密鍵の情報
$ ssh-add -l
1234 SHA256:xxxxxxxxxxxxx.local (RSA)
### リモートサーバへSSH接続する
$ ssh -A hoge@xxx.xxx.xxx.xxx
[example_remote_host]
### リモートサーバにもssh-agentの情報が引き継がれている
$ ssh-add -l
1234 SHA256:xxxxxxxxxxxxx.local (RSA)
リモートサーバ上でGitHubへSSH接続してみる
リモートサーバ上で.ssh/config
を作成し、ローカル環境と同様にGitHubへSSH接続できるか確認してみます。
.ssh/config
Host github.com
User git
Hostname github.com
### リモートサーバ上に秘密鍵をコピーしなくても、ローカルと同様のレスポンスがGitHubから返ってくる
$ ssh -T github.com
Hi nishina555! You've successfully authenticated, but GitHub does not provide shell access.
参考: ssh-agentも場合によってはセキュリティリスクがあるので利用する際は注意する
複数人がroot権限を持っているサーバ上でssh-agentを有効にすると秘密鍵の情報を誰でも利用できる状態になるので注意が必要です。今回の例であれば自分(nishina555)以外の人がnishina555になりすましてリモートサーバからGitHubへpushができてしまいます。
リモートサーバから特定のGitHubリポジトリに接続をしたいのであれば、リモートサーバ上でssh-keygen
を実行してキーペアを作成し、リポジトリのデプロイキーに公開鍵を登録するという方法もあります。
要件に応じて適した方法を選択してください。
まとめ
- ssh-agentを利用するとリモート環境でローカル環境の秘密鍵の情報を利用できる
- 『eval `ssh-agent`』でssh-agentを起動し『ssh-add』で秘密鍵の情報を登録する
- ssh-agentを利用するにはsshコマンドに『-A』を追加、もしくはSSH接続設定に『ForwardAgent yes』を追加
- 不用意なssh-agentの有効化はセキュリティリスクになりかねないので使用する際は注意する
Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!