ssh-agentでサーバにローカルの秘密鍵の情報をコピーする方法

インフラ

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-agentを有効化する方法
  • 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のまとめ
  • ssh-agentを利用するとリモート環境でローカル環境の秘密鍵の情報を利用できる
  • 『eval `ssh-agent`』でssh-agentを起動し『ssh-add』で秘密鍵の情報を登録する
  • ssh-agentを利用するにはsshコマンドに『-A』を追加、もしくはSSH接続設定に『ForwardAgent yes』を追加
  • 不用意なssh-agentの有効化はセキュリティリスクになりかねないので使用する際は注意する

Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!