暗号方式
暗号通信は、データを暗号化してやりとりします。
暗号化される前のデータを平文、暗号後を暗号文と言います。
基本的なやりとりは、平文を暗号化して受信者に送信→受信者側で復号することで平文に戻すします。
共通鍵暗号方式
特徴
事前に共通の鍵を発行しておき、受信者・送信者が共有する方法。
秘密に共通鍵を受信者と共有するかの問題(鍵の配送問題)があるが、DH法を使うことで解決できる。
DH法
ハイブリット暗号方式の暗号アルゴリズム
離散対数問題が困難であることを根拠に安全性を担保。
セッション鍵の情報を送らない方法。
鍵の管理
鍵の数は、通信相手ごとに作って管理する必要がある。
管理する鍵の数はn(n-1)/2で求められる。
共通鍵暗号方式は、管理する鍵の数が多くなりやすく、安全に共通鍵を共有する仕組みが必要である一方、処理が早いのが特徴です。
共通鍵を用いた暗号の方式
- 共通鍵を用いてどのように暗号化するか
- 暗号化するアルゴリズム
によって、さらに細かく分けられる。
ブロック暗号
ある特定の大きさのかたまり(ブロック)ごとに共通鍵で暗号化。
代表的な暗号化アルゴリズムは、AESやCamelia。
鍵自体の長さ(鍵長)も選べ、鍵長が長い方がセキュリティ強度が高い。
ブロック暗号は、さらに暗号モードが色々ある。
「暗号ブロックをどうやって暗号化するか」を決めるのが暗号モードです。アルゴリズムとは別です。
暗号モード | 方法 |
ECBモード | 単純に暗号ブロックごとに暗号化する。平文の推測可能なので、非推奨。 |
CBCモード | 初期ベクトル(ランダムな情報)と平文のブロックをXORで混ぜて、暗号化する。 |
CFBモード | 1つ前の暗号ブロックを暗号化したものと平文ブロックをXORで混ぜて、暗号化する |
OFBモード | 初期ベクトルを暗号化し、その初期ベクトルと平文ブロックを暗号化する |
CTRモード | 初期ベクトルの代わりに、ノンスと呼ばれるランダムな値と1ずつ増加していく連番を組み合わせたカウンタを生成し、平文ブロックとXOR。 |
ストリーム暗号
ブロック暗号のように、1ブロックを作るのではなく、1ビットずつ次々に暗号化する方法。
代表的な暗号化アルゴリズムは、RC4やKCipher-2。
リアルタイムで処理するシステムなど、すぐに暗号化しないといけない場合は、ストリーム暗号を選ぶことが多い。
公開鍵暗号方式
公開鍵暗号方式とは、秘密鍵と公開鍵の鍵ペアを生成して暗号化する方式。
公開鍵、秘密鍵の関係は以下の通り。
- 公開鍵を使って暗号化すれば、秘密鍵で復号できる
- 秘密鍵で暗号化すれば、公開鍵で復号できる
公開鍵が盗まれても秘密鍵が盗まれない限り復号できません。
共通鍵暗号方式に比べて、処理は遅い。
管理する鍵の数
管理する鍵の数は2nで求める。
公開鍵暗号方式は、秘密鍵・公開鍵のペアがあれば、通信相手が増えても鍵の数は変わらない。
公開鍵の認証
公開鍵で暗号化し、受信者側で秘密鍵を使って復号する場合、公開鍵が本当に正式な相手の公開鍵であるかわからないと、通信相手になりすました攻撃者が用意した偽の公開鍵を使って送信者が暗号化してしまう危険性がある。
(この場合、暗号文を攻撃者側で復号できるので簡単にデータを盗まれてしまう)
そのため、公開鍵が正当な相手のものであることを証明する公開鍵証明書が必要。
RSA
RSAとは、代表的な公開鍵暗号方式の暗号方式のこと。
桁数の大きい整数を素因数分解するのが困難である特性を利用した方式。
ハイブリット暗号方式
共通鍵、公開鍵暗号方式の長所を併せ持つ暗号方式。
ハイブリット暗号方式の流れは次の通り。
- セッション鍵(乱数)を使って平文を暗号化
- 暗号化に使ったセッション鍵を公開鍵で暗号化
- 1・2を受信者に送る
- 2を秘密鍵で復号し、セッション鍵を取り出す
- 4で取り出したセッション鍵で1を復号する
ハッシュ関数
ハッシュ関数とは、ハッシュ値を計算するための計算方法。
あるデータにハッシュ関数をかけると、そのデータ専用のハッシュ値が生成される。
どんな大きさのデータでもハッシュ値は一定の決まった長さの文字列になるよ。
ハッシュ値が同じであれば、データが同じであると言える。
ハッシュ関数の種類
ハッシュ関数にはいろんな種類がある。
代表的なハッシュ関数は、MD5やSHA-2,SHA-3などがある。
SHA-2,3については、出力するビット数を選べる。
代表的なのは256ビットを出力するSHA-256
ハッシュ関数の特性
- 衝突発生困難性:入力値が違うのにハッシュ値が同じになる可能性が極めて低い
- 第二現像困難性:特定のハッシュ値と同じハッシュ値を持つ入力値(データ)を作るのは困難。
- 一方性:ハッシュ値から元の入力値を探索するのは困難。
認証(エンティティ認証)
- エンティティ認証:人やものを認証する
- メッセージ認証:メッセージ内容が正しいのかを認証する
ベーシック認証
ベーシック認証とは、ユーザIDとパスワードを平文で送信して認証する。
平文でIDやパスワードを送るので、盗聴に弱い。
対策としては、通信を暗号化するSSL/TLSを利用する。
チャレンジ&レスポンス認証
チャレンジ&レスポンス認証とは、パスワードの情報をネットワークで流さずに認証する方法。
認証の流れ
- クライアントからIDが認証サーバに送られる
- 認証サーバはチャレンジコードと呼ばれる乱数を生成し、クライアントに送る
- クライアントは、チャレンジコードとパスワードをハッシュ関数にかけて、ハッシュ値にする(これがレスポンス)
- 認証サーバ側でも3と同様にハッシュ値を計算
- 3で計算したレスポンスをクライアントが認証サーバに送信
- 認証サーバは5で送られたレスポンスと、4で計算したハッシュ値を比較。一致していたら認証完了
チャレンジ&レスポンス認証にはいくつかの方式があります
1、S/Key方式
チャレンジ&レスポンス認証の1つで、S/Key方式で認証する方法。
S/Keyはワンタイムパスワードを生成する方法の1つ。
- クライアントからIDが認証サーバに送られる
- 認証サーバは、シード(乱数)を生成し、シードとシーケンス番号(ハッシュ関数をかける回数)をチャレンジコードとして、クライアントに送る
- クライアントは、パスワードとシードをハッシュ関数にかける。ハッシュ関数にかける回数はシーケンス番号-1回(これがワンタイムパスワードになる)
- 認証サーバ側でも3と同様にワンタイムパスワードを計算
- 3で計算したワンタイムパスワードをクライアントが認証サーバに送信
- 認証サーバは5で送られたワンタイムパスワードに最後の1回をハッシュ関数で計算したワンタイムパスワードと、4で計算したワンタイムパスワードを比較。一致していたら認証完了
認証サーバで設定したシーケンス番号は、認証を行うごとに1ずつ減るため、シーケンス番号が0になると認証できなくなる。
2、時刻同期方式
時刻同期方式も、S/Keyと同様にワンタイムパスワードを利用して認証するが、ワンタイムパスワード生成方法が異なる。
時刻同期方式はトークンを使って認証する。
生体認証
指紋や静脈、顔などの生体情報に基づいて認証を行う。
本人拒否率、他人受入率がトレードオフになるので、バランスを取ることが必要
リスクベース認証
普段と違うIPアドレスやブラウザ、回線などからアクセスされた場合、追加で認証を行う。
FIDO認証
パスワードを利用せずに認証する方法。
パスワードの管理が不要になる。
シングルサインオン(SSO)
シングルサインオンは、一度の認証で複数のサーバやアプリケーションにログインする仕組み
リバースプロキシ方式
リバプロは、インターネットから内部ネットワークに接続される通信を代理するサーバ。
リバースプロキシに対して認証要求され、認証OKだったら、内部のサーバたちにOK連絡をする。
これにより、クライアントは内部サーバ1つ1つに認証要求する手間が省ける
ケルベロス認証方式
ケルベロス認証とは、認証を行うASと認証後にサーバにアクセスするためのチケットを発行するTGSを使って認証する方法。
SAML認証方式
インターネット上で異なるWEBサービス間で認証をするための方法。
認証を行うIdP、サービスを提供するSPで構成される。
クライアントはSPにサービス要求をすると、IdPへリダイレクトさせる。
IdPで認証が成功すればアサーションを生成し、クライアントにレスポンス。
クライアントはアサーションをSPに提示し、サービスを提供される。
ケルベロス認証は、レルムと呼ばれる認証範囲内にあるサーバしか認証できないよ。
これに対し、SAMLは異なるWEBサービス(SP)であっても、IdPと信頼関係があれば認証できるよ。
認証(メッセージ認証)
MAC(メッセージ認証符号)
メッセージの完全性を保証する。
メッセージと共通の共通鍵を使って生成する。
代表的なMACはHMAC。
送りたいメッセージとMAC値を受信側に送ります。
MAC値は、受信者と共有している秘密の情報とメッセージをハッシュ関数にかけることで生成される値です。
MACは共通の秘密鍵を使うため、作成者を判断できませんが、正規の相手と通信できていること、改ざんされていないことは確認できます。
ディジタル署名
ディジタル署名は、メッセージのハンコのこと。ハンコには押印した人の名前が刻まれるため、署名者を特定することができる。
ディジタル署名は、メッセージをハッシュ関数にかけたハッシュ値を送信者の秘密鍵で暗号化することで作成される。
秘密鍵で作るのだから、ディジタル署名を作成できるのは送信者本人だけだと特定できるよ
メッセージとディジタル署名を受信者に送信し、受信者は公開鍵で復号することで、完全性を担保できます。
ディジタル証明書
ディジタル証明書は、公開鍵の正当性を保証する証明書。
ディジタル証明書は公開鍵証明書、サーバ証明書などと表現されることもあります。
ディジタル証明書の中に、公開鍵の情報と正当性を保証する情報が含まれいる。
例えば、所有者名や有効期間の情報が記載されているよ
サーバ証明書
サーバ証明書とは、ディジタル証明書のうち、サーバの公開鍵を渡す時に、その公開鍵を証明するものを指す。
DV証明書
ドメインの所有を保証。無料で誰でも発行できる。
https通信をする場合、サーバ証明書がないとできないので、簡単に発行できるように作られた証明書。
OV証明書
ドメインの所有と、企業の実在性を保証。
CNの部分にワイルドカード設定ができるので、サブドメイン違いのサーバも1枚の証明書を利用可能。
EV証明書
ドメインの所有と、企業の実在性、業務実態を保証。
サブドメイン間で使いまわせない。
PKI
公開鍵と秘密鍵の対応関係を保証する仕組みのこと。
誰が作ったかもわからないディジタル証明書を信じることはできないので、信頼できる発行元が発行した証明書である必要があるよ。
- サーバ管理者は、信頼できる第3者機関である認証局(CA)に公開鍵と申請情報を送る
- 認証局は、サーバの公開鍵に認証局のディジタル署名をつけたディジタル証明書を発行し、サーバに返す
- サーバ管理者はディジタル証明書をサーバに格納する
- クライアントがサーバに接続要求した際、サーバはサーバのディジタル証明書(サーバ証明書)をクライアントに渡す
- クライアントはディジタル証明書が本物であることを確認するために、証明書発行元が正規の認証局であることを確認する
ディジタル証明書の発行元が正規の認証局であるかを確認する流れは以下の通り。
- サーバ証明書に署名されている認証局のディジタル署名が正しいのかを確認するために、認証局の公開鍵を取得したい。
- 認証局は階層構造になっており、下層の認証局のディジタル署名は、通常上位の認証局に作られたディジタル証明書の中に入っている。
- どんどん上位にたどると、最終的にルート認証局に辿り着く
- ルート認証局の公開鍵はルート認証局自身が署名したルート証明書に入っているため、ルート認証局の公開鍵を取り出す
- 「認証局の公開鍵を取り出して、署名を確認する」を繰り返すことでお、サーバ証明書を発行した認証局のディジタル署名の検証が完了。
TCP/UDP・IP
IP
インターネットプロトコルのこと。
ネットワーク層でパケット通信のやりとりに使う。
IPでは、「IPアドレスを使って通信すること」や「データ作成の順番」などのルールをつくって通信する。(プロトコル=ルール)
ただし、IPは確実にデータを相手に送るためのルールを考慮できていない。
そのため、TCPやUDPといったトランスポート層のプロトコルを併用するのが一般的。
TCP
3wayハンドシェークを行い、コネクションを確立することで、データを確実に相手に届ける。
TCPを利用してデータを送るには、TCPヘッダをデータにつける必要がある。
TCPヘッダには、シーケンス番号や送信元・宛先ポート番号、確認応答番号などの情報が含まれる。
TCPはデータを送る時、一気には送れないので小さく分割してデータを送る。
この時、シーケンス番号で「今何番目のデータが送られてきた?」を確認しながら通信することで、元のデータを復元する。
UPD
UDPはリアルタイムで即時にデータを相手に届ける時に使うプロトコル。
データの分割やコネクションの確立などは行わないので、DNSなどのデータが小さくリアルタイム性が求められるデータのやり取りに利用される。
認可
OAuth2.0
リソースオーナーの許可に基づき、サービスのアクセス権を別のサーバにわたせるプロトコル。
OAuth2.0は、権限を与えているので、認証ではなく認可である。
検知
検知システム
IPS
侵入防止システム。
脅威を含む通信を防御できる。
IDS
侵入を検知するシステム。
脅威を含む通信があったら、管理者に通知するが、防御はしない。
IDS・IPSは設置方法によって、ホスト型とネットワーク型に分けられる。
サーバ1台につき1つつけるホスト型と、ネットワークに1つ配置するネットワーク型。
ネットワーク型は、通信経路中に設置するインラインモードと、ミラーポートを使って自分宛通信以外も監視できるプロミスキャスモードがある。
検知方式
- アノマリ型:正常な通信と比較して、変な通信であるか検知。(アン・ノーマリ)
- シグネチャ型:攻撃パターンを登録し、そのパターンに合致する場合に検知
誤検知
- フォールスネガティブ:攻撃通信を許可してしまう。攻撃を受けてしまうため、フォールスネガティブは最も減らしたい誤検知
- フォールスポジティブ:正しい通信を攻撃だと判断して拒否する。フォールスポジティブは誤検知しても攻撃を受けるわけではないので、フォールスネガティブよりはまし。