SSHとは?仕組みを図解でわかりやすく解説!
今回は「SSHの仕組み」について図解でわかりやすく解説していきます。
SSHはAWSやローカル開発環境などを使う場合には、ほぼ必須と言っていいほど必要な技術です。
なんとなくサーバに接続できたけど、「SSHとは何か?」、「公開鍵ってなに?」と分からないことが多く出てくると思います。
この辺の仕組みを理解して、どうやって安全にサーバに接続しているのかを見ていきましょう。
SSHとは?仕組みをざっくり解説
最初にざっくりと仕組みを説明します。
「PC側」と「サーバ側」があったとして説明します。 PC側からサーバ側に接続したいとします。
PC側で「秘密鍵」と「公開鍵」というものを作成します(秘密鍵は絶対に他のサーバや人に渡してはダメ)。
続いて、接続したいサーバに公開鍵を送ります。
そして、PC側からSSH接続を試みます。この時に秘密鍵と公開鍵が「対」であれば、認証成功になり、接続が成功します。
PC側の秘密鍵と、サーバ側に置いてある公開鍵がペアであれば接続できるってことですね。
ざっくりとこんな感じですが、もっと詳しく見ていきましょう。
SSH接続の登場人物
「SSH」での登場人物を紹介します
- 秘密鍵
- 公開鍵
- 乱数
- ハッシュ値
耳慣れない単語が出てきましたが、これらがSSHで使用する技術です。 それでは流れを解説していきましょう。
SSH接続の流れ
SSHで接続する流れは以下です。
- 自分のPCで「秘密鍵」、「公開鍵」を作成する
- 接続したいサーバに作成した「公開鍵」を置く
- PC側からサーバにSSH接続したいと伝える
- サーバ側で「乱数」を生成する
- サーバ側で「乱数」と、2の「公開鍵」を使って暗号を作って、暗号をPC側に送る
- 暗号を受けったPC側は「秘密鍵」を使って、暗号を複合して「乱数」を取り出す
- さらにPC側は取り出した「乱数」からハッシュ値を生成しサーバへ送る
- サーバ側で「乱数」からハッシュ値を生成する
- サーバ側は、PC側から受け取った「ハッシュ値」と、サーバ側で生成した「ハッシュ値」を比較する
そして、両方のハッシュ値が一致していれば、SSH接続が完了します。
といった流れです。結構たいへんですよね。 これらの細かい内容は「裏でこういうことをしているんだ」という認識で良いと思います。
秘密鍵と公開鍵
中核の技術ですね。
SSH接続をするには2つのペアの「鍵」を作る必要があります。 PC側とサーバ側があったとして、2つの鍵を作るのはPC側です。
秘密鍵は絶対に自分のPC以外には移してはいけません。※これは覚えておいてください。 移して良いのは公開鍵のみです。
さっきから「鍵」と読んでいるものは、ただのファイルです。 ファイル中身をみてみると、公開鍵も秘密鍵も意味不明な文字列が並んでいるだけです。これが鍵の正体です。
公開鍵で何ができるのか
公開鍵で出来るのは、暗号化です。 例えば、サーバと通信するときの「やりとりの内容」を暗号化してくれます。 一度、公開鍵で暗号化したものについては、「秘密鍵」でしか復号(元に戻す)できません。
なので、秘密鍵を誰かにあげたりしたらダメなんです。
この公開鍵は接続したいサーバに送ります。 これで、自分のPC側には「秘密鍵」、サーバ側には「公開鍵」がある状態になります。
乱数と公開鍵で暗号作成
サーバが側には今「公開鍵」がある状態ですね。 PC側から接続要求が来たとき、「本当にそのPCは接続してよいPCなのか」というのを確認するため、 サーバ側に送られている「公開鍵」を使って認証を行います。
サーバ側では公開鍵+乱数を使って暗号を作成します。 この乱数はサーバ側で勝手に作成されます。
公開鍵+乱数で作成された暗号は、接続要求をしてきたPC側に送ります。 また、この時サーバ側では乱数をハッシュ化して置いておきます。←後に認証で使います。
秘密鍵での複合
さて、サーバ側からPC側へ「暗号」が送られてきました。 この暗号はPC側の秘密鍵でしか複合できません。
PC側には秘密鍵があるので、その秘密鍵を使って複合を行います。 複合されると「サーバ側で作成された乱数」が取り出せます。
乱数からハッシュ値を生成して、サーバ側に「ハッシュ値」を送ってあげます。
サーバ側では「既に生成したハッシュ値」と「PC側から送付されたハッシュ値」がある状態です。 この2つを比較して、一致していれば「接続要求をしているPCは正しい接続元」となります。
これで、見事「SSH接続」が完了します。
まとめ
SSHは裏で結構大変なことをしているのが分かったかと思います。 ですが、実際に利用するときは「秘密鍵」、「公開鍵」くらい分かっておけば何ら問題はありません。
実際に自分でSSH接続の設定をしてみると、理解しやすくなるかと思います。 このSSHはAWSやローカル開発環境などでは、ほぼ必須の知識なのでぜひ覚えて、設定方法などもマスターできるようになりましょう。
また、別の記事でSSHの接続設定についても解説しますので、お楽しみに。