🙌

ssh-agentを利用して、安全にSSH認証を行う

2020/09/24に公開1

SSH認証、皆さんどのような手順で行ってますか?

ローカルで作業する分にはいいものの、
クラウド上にサーバーを立てて、そこからgitに接続...

などの場面で、まさか秘密鍵をサーバーに置くなんて危険な真似はしてないですよね?
(これ死亡フラグです。)

そんな危険度100%のあなたに是非お伝えしたいのが、ssh-agent

すっごく簡単に説明すると、彼は、ユーザーと常に一緒に行動してくれて、
必要な時に「はいっ」と秘密鍵を渡してくれる、ハイパーセキュリティボーイなのです。

今日はそんなssh-agentの使い方をまとめてみたいと思います。
(Macでの使用を想定しております。ご了承下さい。)

1. ローカルで鍵の作成

まずは通常のssh認証と同じようにローカルで秘密鍵の作成を行っていきます。
ここは特に問題ないと思うので省略。

(不明な方はこのリンクが参考になります。)

2. ssh-agentに鍵の登録

ここからです。
鍵を作成したら、ssh-add [鍵の場所]
で、ssh-agentさんに鍵を渡します。

ただ、この記述方法だと毎回ターミナルを起動するたびに登録がリセットされてしまう為、

ssh-add -K [鍵の場所]

としてあげましょう。

こうすることで、Macのキーチェーンストア(鍵の保管庫)に鍵が登録され、次回以降も自動で呼び出されるようになります。

3 登録された鍵の確認

ssh-add -l 

と打ち込むことで、今ssh-agentさんが認識している鍵の一覧を表示できます。

こんな感じですね! 
一番後ろに鍵の名前が書かれているので、ここに登録した覚えのある秘密鍵が表示されていればOKです。

今回は、EC2インスタンスのログイン鍵と、gitへの鍵を2つ登録してあります。

4 sshでログイン

では登録した鍵を使ってログインしてみましょう。
手順は簡単。
.sshディレクトリに移動して、

ssh -A [鍵の名前]

と打ち込めばオッケーです。
今回はEC2サーバーへとログインしてみました。

では、これで通常のログインと何が違うのでしょうか。

5 ログイン先から別サーバーにログイン

ここが今回の肝です!
今、ローカルに鍵が2つ(EC2とgit)、ログイン先のサーバーには鍵が0個存在しています。
つまり、通常だとこのログインしたサーバーから別サーバー(今回はgit)へのログインは出来ないですよね。

...ところが、出来るんです。
ssh-agent様のお陰で。

EC2にログインした際に、 -A というオプションを付けました。
これが「ssh-agentを用いてログインしますよ」と言った意味合いで、
つまりは、今EC2にログインしたユーザーと共に、ssh-agentさんもEC2にログインしているのです。
そして、ssh-agentさんは秘密鍵を持っているのでしたよね...?

と言うことは、サーバー → git へと接続をしたい際、

ユーザー:「ssh-agentさん、gitの鍵貸して」
ssh-agent: 「はいっ」
ユーザー: 「ローカルの秘密鍵を使って、サーバー上からgitにログインっと...!」

と言った具合にログインが可能になるのです。
素晴らしい。

ただこのログインには1つだけ設定が必要で、
サーバー上の .ssh フォルダ配下のconfig内に
ForwardAgent yes(ssh-agentを有効にしますよ)
と言った設定をしてあげないといけません。
(ホームディレクトリから、cd .sshで移動 → vi config で編集)

今回はサーバーからgitへのログインを想定しているので、

Host github
  HostName github.com
  User git
  ForwardAgent yes

こんな感じで書いてあげた上で、

ssh -T github

と言った具合にログインしてあげれば大丈夫でしょう。

ログインに成功すると、

と言った具合にGithubが歓迎して迎え入れてくれます。

最後に

あなたもssh-agentを用いて、安全なsshライフをお過ごし下さい。

Discussion

いわもと こういちいわもと こういち

必要な時に「はいっ」と秘密鍵を渡してくれる、ハイパーセキュリティボーイなのです。

これはあまりいい例えでは無いですね。「秘密鍵を渡してくれる」ではなくて「代わりに鍵を開けてくれる」の方がいいでしょう。
ssh-agentは秘密鍵を渡さないので、不正にssh-agentが利用されても秘密鍵自体は盗まれないというのが重要です。

.sshディレクトリに移動して、
ssh -A [鍵の名前]
と打ち込めばオッケーです。

.sshディレクトリに移動する必要は有りません。
またsshコマンドで鍵の名前を指定する必要も有りません。sshコマンドで指定するのは、ログインするホスト名ですね。

EC2にログインした際に、 -A というオプションを付けました。
これが「ssh-agentを用いてログインしますよ」と言った意味合いで、

ssh-agentを誤解されているように思います。
ssh-agentが使える状況ならば、sshコマンドは特にオプションを指定しなくてもssh-agentを使ってログインします。
-A オプションは、通常ローカルのsshコマンドからしか使えないssh-agentをリモートサーバ上でのsshコマンドからも使えるようにする“ssh-agent転送”を有効にする為の物です。

サーバー上の .ssh フォルダ配下のconfig内に
ForwardAgent yes(ssh-agentを有効にしますよ)
と言った設定をしてあげないといけません。

必要ありません。むしろセキュリティ的な面から見ると設定してはいけません。

ForwardAgent yesは-A オプションと同じくssh-agent転送を有効にする為の設定です。
リモートサーバからGitHubにSSH接続する場合、リモートサーバ上のsshコマンドがssh-agentを利用出来れば十分なので、GitHubまでssh-agentを転送する必要は有りません。
不必要にGitHubへssh-agentを転送する事は、GitHub上のユーザが不正にssh-agentを利用できるようにするだけなので、行うべきではありません。