実は簡単!セキュリティ初心者のためのSSL入門

  • 2022.08.29
  • web
実は簡単!セキュリティ初心者のためのSSL入門

セキュリティに対して全くの初心者なのですが、SSLと真面目に向き合わないといけなくなったのでまとめます。

ちなみに今回、「食べる!SSL!」という本を参考にしながら勉強したのですが、情報量が絞ってあって私のようなセキュリティ初心者におすすめです。

 

CIA – セキュリティの基礎的な考え

まず、SSLを学ぶ前にセキュリティに対する共通の考え方を知っておく必要があります。

具体的には、機密性(confidentiality)完全性(integrity)可用性(availability)の3つの要素で、頭文字を取ってCIAと呼ばれる概念です。

この3つに対して詳しく見ていきましょう。

1. 機密性(confidentiality)

情報が意図した相手以外に漏れていないかを示します。

途中の通信経路でデータを覗くことが出来る場合は、機密性が保持されているとは言いません。

考えるべきポイントを例に例えてみます。例えば、アリスからボブに手紙を渡す場合があったとして、ボブの顔を知っていて対面で渡せば確実に渡すことが出来ますが、ネットワークでメッセージを送る場合は、送信者にボブと表示されていてもそれが本当にボブなのか、なりすました第3者なのかわかりません。

これを防ぐには、エンドポイント認証を実施し、双方が意図した相手か確認出来ている状態にすることで機密性を保つことが出来ます。

2. 完全性(integrity)

情報が誰にも改ざんされていないことを示します。

機密性が保たれていたとしても送信者が送ったものが途中で改ざんされるかもしれません。

送信者が送った情報が誰にも改ざんされずに受信者に届くことで、完全性が保たれている状態となります。

3. 可用性(availability)

使用したい時に使える状態のことを示します。

サーバーに過剰な負荷をかけてダウンされるDoS攻撃などを防ぎ、メッセージを送りたい時に送れる状態を作っておくことで可用性が保たれていることになります。

STRIDE – 情報への攻撃

情報伝達を脅かす脅威モデルの考え方として、Microsoft社のSTRIDEというものがあります。

STRIDEは6つの脅威の頭文字をとったものです。

1. なりすまし(Spoofing)

誰かのふりをして、不正に情報に関与することを指します。

2. データの改ざん(Tampering)

データの書き換えや破壊を指します。

3. 否認(Repudiation)

自分がした振る舞いについて認めず否認をすることです。

4. 情報漏えい(Information Disclosure)

見せることを意図していない相手に情報が漏れてしまうことです。

5. サービス不能(Denial of Service)

サービス不能(DoS)攻撃とは、大量のリクエストやデータを送信し、使用できない状態にすることです。

6. 権限の昇格(Elevation of Privilege)

本来アクセス権限のないユーザーにアクセス権が与えらてしまうことです。

SSL通信とは?

セキュリティに対する基本的な考え方や脅威となるモデルを理解したところで、SSL通信とは何かについて考えてみます。

どうしてSSLが必要か?

例えばショッピングサイトで商品を購入する場合、自分が使っているPCからショッピングサイトにたどり着くまでに無数のコンピューター、通信経路を経由します。

セキュリティは一箇所に施せば良いものではなく、そこにいたるまでの通信路が穴だらけであれば、情報は適切に伝えられることはないでしょう。

その前提を踏まえた上で、守る対象を「通信」に限定して考えてみましょう。

前提知識として知っておく必要がありますが、多くの通信のプロトコルは、平文でのやりとりです。

そのため、通信路へ「盗聴」、「改ざん」、「なりすまし」、「否認」といった攻撃が出来てしまいます。そのため、情報を安全に伝達するには、この4つの脅威を防ぐ必要があります。

暗号化技術 – 共通鍵暗号方式と公開鍵暗号方式

「盗聴」の対策として、「暗号化」というセキュリティ技術を使うことで、通信経路上では「2者の間でしか読めないデータ」でやりとりすることが出来ます。

現在使用されている暗号化ルールは大きく分けて2種類あります。

共通鍵暗号方式

一つめは共通鍵暗号化方式です。「共通鍵」と呼ばれる特定のデータを取り決めます。

アリスはこの共通鍵を使用し、情報を暗号化したデータに変換して、ボブに送ります。ボブは、アリスから受け取ったデータを同じ共通鍵で復号化して読みます。

この方法は、暗号化と復号化自体は単純ですが、もし、アリスがボブ以外の人とデータの共有をしたい場合は、ボブの共通鍵では復号出来ないように別の共通鍵を使ってやりとりをする必要があります。

共通鍵暗号方式の欠点としては、データのやりとりをする相手の数分共通鍵が必要となってしまうということが挙げられます。

公開鍵暗号方式

そこで、この難点を補うべく登場したのが「公開鍵暗号方式」です。

一つの鍵を共有する共通鍵暗号方式と異なり、暗号化する鍵と復号する鍵が異なるというのが特徴です。ボブはアリスとあらかじめ暗号化アルゴリズムを決めておきます。そしてアリスは、暗号化する鍵を公開しています。これを公開鍵と言います。

ボブはアリスが公開している鍵で情報を暗号化して、アリスに渡します。アリスは、公開していたのとは別の鍵、秘密鍵と呼ばれる鍵で受け取ったデータを復号化してボブからの情報を取得します。

この方式であれば、n人でデータをやりとりしようとしたとき、共通鍵暗号方式より少ない数の鍵で済みます。しかし、暗号化と復号化の鍵が違うというアルゴリズムは計算するのに時間がかかるアルゴリズムになってしまいます。

共通鍵暗号方式と公開鍵暗号方式のメリット・デメリット

共通鍵暗号方式と公開鍵暗号方式のメリット・デメリットをまとめると以下のようになります。

メリット デメリット
共通鍵暗号方式 暗号化と復号化の処理が高速 通信する相手の数だけ鍵が必要
鍵の配送時に盗聴される可能性がある
公開鍵暗号方式 鍵の管理と配布が簡単 暗号化と復号化の処理に時間がかかる

 

ハイブリッド暗号方式

共通鍵暗号方式と公開鍵暗号方式の2つを組み合わせたハイブリッド暗号方式というものがあります。共通鍵暗号方式の難点であった、最初にどう鍵を交換するかという部分を、公開鍵暗号方式を用いて実施します。

メッセージは共通鍵で暗号化し、共通鍵は相手の公開鍵で暗号化します。そして、その2つを同時に送ります。

公開鍵で暗号化されたものは鍵だけなので、復号化の時間が少なく済ますし、そうして取り出した共通鍵でメッセージの方を復号化するので、こちらも復号化時間が少なくて済みます。

SSLプロトコルは、このハイブリッド暗号方式を採用しています。

SSLの機能3つ

1. ハイブリッド暗号方式による情報の内容の暗号化

共通鍵を公開鍵で配送し、その共通鍵でデータを暗号化してデータを保護。

2. MAC関数による改ざん検知

データとMAC値を比較し、改ざんされていないことを保証します。

MAC関数と呼ばれる関数を用いて計算して出されたMAC値という値をデータと合わせて送信します。

受信側はデータを同じMAC関数を用いてMAC関数を出し、送られてきたMAC値と比較して等しければ改ざんされていないと見なします。

3. デジタル署名による通信相手の認証

相手が本当に通信したい相手であることを保証します。

公開鍵の逆で秘密鍵でデータを暗号化し、相手は公開鍵で復号します。秘密鍵は送り主しか持っていませんので、送り主の公開鍵で復号出来るデータを作成出来るのは送り主のみになります。

これにより、「なりすまし」や「否認防止」の対策が出来ます。

SSL通信の仕組み・範囲

公開鍵暗号方式で共通鍵を交換するのをハンドシェイク、共通鍵暗号方式で通信するのがデータ転送です。

それぞれのフェーズの中身を見ていきましょう。

ハンドシェークフェーズ

ハンドシェークフェーズは、「暗号化アルゴリズムの合意」、暗号化に使用する「鍵の確立」、「認証」の3つの目的があります。これを大きく4つのステップで実現しています。

ステップ1:使用するアルゴリズムの合意

クライアントが対応しているアルゴリズムのリストを送付し、サーバーはそこから使用出来るアルゴリズムを選択し、クライアントに使用するアルゴリズムを返します。

この時合意するアルゴリズムは、以下のアルゴリズムです。

  • SSLのバージョン
  • サーバー認証アルゴリズム
  • 鍵交換アルゴリズム
  • データ転送で使用するデータ保護用の共通鍵暗号方式アルゴリズム
  • データ転送で使用するデータの完全性を確認するためのMACアルゴリズム
  • 圧縮アルゴリズム

ステップ2:サーバーの認証

サーバーは使用するアルゴリズムの合意と同時に、自信の公開鍵を含む証明書を送付します。

クライアントはサーバーの証明書を確認し、サーバーが「正しい」ものであることを確認します。

ステップ3:データ転送で使用する鍵の確立

クライアントはサーバーと同じ鍵生成関数を使用して、あるランダムな文字列から暗号化鍵とMAC鍵を生成します。

同じ入力と同じ関数から作成されたものは、数学的には必ず同じものになるはずということに基づいて生成し、鍵自体は通信路には乗せません。

クライアントは「あるランダムな文字列」をサーバーの公開鍵で暗号化して、サーバーに送付します。

サーバーは受け取った後、自身の秘密鍵で復号化して、「あるランダムな文字列」のみを取得します。

「あるランダムな文字列」のみを使用して鍵を生成すると、異なるセッションでも常に同じ鍵が作成されてしまいます。それを防ぐため、クライアントとサーバーそれぞれで作成した2つの乱数を鍵生成関数の入力に追加し、暗号化鍵とMAC鍵を作成します。

2つの乱数はステップ1でお互いに送付しておきます。

クライアントで生成した乱数1、サーバーで生成した乱数2、あるランダムな文字列を使用し、クライアントとサーバーで同じ鍵生成関数を用いて、暗号化鍵とMAC鍵を生成してステップ3は終了です。

ステップ4:ハンドシェイクが正しく行われたことの確認

このステップでは、今までやりとりしたメッセージが改ざんされていないこと、暗号化鍵とMAC鍵がお互い同じものが生成されていることを確認します。クライアントとサーバーそれぞれで、ステップ1〜3で送付したメッセージについて、ステップ1で合意したMACアルゴリズムとステップ3の最後で作成したMAC鍵でMAC値を取得します。

そして取得したMAC値をステップ1で合意した暗号化アルゴリズムとステップ3で作成した暗号化鍵で暗号化し、送付します。受け取った側は、暗号化されたデータを自分が生成した暗号化鍵で復号化し、復号出来ることと、復号化して手に入ったMAC値が自分で生成したMAC値と等しいことを確認します。

クライアントとサーバーでお互いにこれらを実施してハンドシェイク終了とします。

データ転送フェーズ

SSLのデータ転送では、ハンドシェイクフェーズで合意したアルゴリズムおよび鍵を使用して、保護されたデータを2台のマシン間で転送します。

SSLが適用される範囲

SSLプロトコルはOSI参照モデルのセッション層(第5層)に位置します。

従ってSSLはそれより下位層は暗号化しませんし、保証もしません。

SSL通信で保証されるもの

SSL通信で保証されるものの一つが、転送中のデータです。SSL通信の仕組みの中の暗号化技術により、「盗聴」されてもデータを読むことは出来ませんし、MAC技術により、「改ざん」されてもそれを検知出来るようにしています。

もう一つは、通信相手が正しいマシンであることを保証していることです。サーバーの公開鍵の証明書を確認することで、「なりすまし」されても偽物だと気付けます。さらにデジタル署名の技術により、本人しか送付出来ない情報のしるしが付き、「否認」が嘘だという証拠になります。

webカテゴリの最新記事