ウェブログラム ~学習するな実践せよ~

作成日: 2018-11-19

【SSHの仕組み】を図解で簡単に解説してみる

さて今回は「SSHの仕組み」について図解で解説をして行こうと思います。

SSHはAWSやローカル開発環境などを使う場合には、ほぼ必須と言っていいほど必要な技術です。 なんとなくサーバに接続できたけど、「SSHってなに?」、「公開鍵ってなに?」と良くわからない事だらけだと思います。

この辺の仕組みを理解して、どうやってサーバに接続しようとしているのかを叩き込んでいきましょう。

SSHの仕組みをざっくり解説

最初にざっくりと仕組みを説明します。

PC側とサーバ側があったとして説明します。 PC側からサーバ側に接続したいとします。

PC側で秘密鍵と公開鍵を作成します。この時秘密鍵は絶対に他のサーバや人に渡してはダメです。 接続したいサーバに公開鍵を送ります。

そして、PC側からSSH接続を試してみると、自分が作成した公開鍵がサーバ側にあるので、 自分の持っている秘密鍵とペアということになり、接続が成功します。

ざっくりとこんな感じですが、もっと詳しく見ていきましょう。

SSH接続の登場人物

「SSH」での登場人物を紹介します

  • 秘密鍵
  • 公開鍵
  • 乱数
  • ハッシュ値

よく耳にする単語が出てきましたが、これらがSSHで使用する技術です。 それでは解説していきましょう。

SSH接続の流れ

SSHで接続する流れは以下です。

  1. 自分のPCで「秘密鍵」、「公開鍵」を作成する
  2. 接続したいサーバに作成した「公開鍵」を置く
  3. PC側からサーバにSSH接続したいと伝える
  4. サーバ側は置いた「乱数」を用意して「公開鍵」で「乱数」から「ハッシュ値」を生成する
  5. さらにサーバ側で「先程の乱数」と「公開鍵」を使って暗号を作って、暗号をPC側に送る
  6. 暗号を受けったPC側は「秘密鍵」を使って、暗号を複合して「乱数」を取り出す
  7. さらにPC側は取り出した「乱数」からハッシュ値を生成
  8. PC側で生成した「ハッシュ地」をサーバ側へ送る
  9. サーバ側はPC側から受け取った「ハッシュ値」とサーバ側で生成した「ハッシュ値」を比較する
  10. ハッシュ値を比較して一致していれば、SSH接続が完了する

といった流れです。結構たいへんですよね。 これらの細かい内容は「裏でこういうことをしているんだ」という認識で良いと思います。

秘密鍵と公開鍵

中核の技術ですね。

SSH接続をするには2つのペアの「鍵」を作る必要があります。 PC側とサーバ側があったとして、2つの鍵を作るのはPC側です。

秘密鍵は絶対に自分のPC以外には移してはいけません。※これは覚えておいてください。 移して良いのは公開鍵のみです。

さっきから「鍵」と読んでいるものは、ただのファイルです。 ファイル中身をみてみると、公開鍵も秘密鍵も意味不明な文字列が並んでいるだけです。これが鍵の正体です。

公開鍵で何ができるのか

公開鍵で出来るのは、暗号化です。 例えば、サーバと通信するときの「やりとりの内容」を暗号化してくれます。 一度、公開鍵で暗号化したものについては、「秘密鍵」でしか復号化(元に戻す)できません。

なので、秘密鍵を誰かにあげたりしたらダメなんです。

この公開鍵は接続したいサーバに送ります。 これで、自分のPC側には「秘密鍵」、サーバ側には「公開鍵」がある状態になります。

乱数と公開鍵で暗号作成

サーバが側には今「公開鍵」がある状態ですね。 PC側から接続要求が来たとき、「本当にそのPCは接続してよいPCなのか」というのを確認するため、 サーバ側に送られている「公開鍵」を使って認証を行います。

サーバ側では公開鍵+乱数を使って暗号を作成します。 この乱数はサーバ側で勝手に作成されます。

公開鍵+乱数で作成された暗号は、接続要求をしてきたPC側に送ります。 また、この時サーバ側では乱数をハッシュ化して置いておきます。←後に認証で使います。

秘密鍵での複合

さて、サーバ側からPC側へ「暗号」が送られてきました。 この暗号はPC側の秘密鍵でしか複合できません。

PC側には秘密鍵があるので、その秘密鍵を使って複合を行います。 複合されると「サーバ側で作成された乱数」が取り出せます。

乱数からハッシュ値を生成して、サーバ側に「ハッシュ値」を送ってあげます。

サーバ側では「既に生成したハッシュ値」と「PC側から送付されたハッシュ値」がある状態です。 この2つを比較して、一致していれば「接続要求をしているPCは正しい接続元」となります。

これで、見事「SSH接続」が完了します。

まとめ

SSHは裏で結構大変なことをしているのが分かったかと思います。 ですが、実際に利用するときは「秘密鍵」、「公開鍵」くらい分かっておけば何ら問題はありません。

実際に自分でSSH接続の設定をしてみると、理解しやすくなるかと思います。 このSSHはAWSやローカル開発環境などでは、ほぼ必須の知識なのでぜひ覚えて、設定方法などもマスターできるようになりましょう。

また、別の記事でSSHの接続設定についても解説しますので、お楽しみに。

作成日: 2018-11-19