ssh-agentを利用して、安全にSSH認証を行う
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コマンドで鍵の名前を指定する必要も有りません。sshコマンドで指定するのは、ログインするホスト名ですね。
ssh-agentを誤解されているように思います。
ssh-agentが使える状況ならば、sshコマンドは特にオプションを指定しなくてもssh-agentを使ってログインします。
-A オプションは、通常ローカルのsshコマンドからしか使えないssh-agentをリモートサーバ上でのsshコマンドからも使えるようにする“ssh-agent転送”を有効にする為の物です。
必要ありません。むしろセキュリティ的な面から見ると設定してはいけません。
ForwardAgent yes
は-A オプションと同じくssh-agent転送を有効にする為の設定です。リモートサーバからGitHubにSSH接続する場合、リモートサーバ上のsshコマンドがssh-agentを利用出来れば十分なので、GitHubまでssh-agentを転送する必要は有りません。
不必要にGitHubへssh-agentを転送する事は、GitHub上のユーザが不正にssh-agentを利用できるようにするだけなので、行うべきではありません。