Forward Security (FS) / Perfect Forward Security (PFS)
Forward security (Perfect forward security) は,暗号化された通信データを長期間にわたって解読されないようにするための技術です.暗号通信に使われている秘密情報が漏洩した場合でも,過去に暗号化された通信データの安全性を守ろうとする考え方です.
Forward security は直訳すれば ”前方秘匿性” であり,例え将来暗号鍵を生成するための情報が漏洩したり解読されたとしても,通信の安全性を保証しようとするものです.
具体的には,TLS (SSL) などで使われる鍵交換プロトコルが持つべき性質であり,
- データを暗号化するための鍵から別の鍵を生成しない.
- 暗号鍵の元になる秘密情報は一度だけの使い捨てにする.
ことが要求されます.1 つの鍵が破れたとしても被害が他の鍵で暗号化したデータに及ばないようにできます.
Forward security の必要性
TLS などの暗号通信では,データは共通鍵暗号を使って暗号化されます.このときの鍵 (共通鍵)は,通信当事者間で共有する必要があります.この共通鍵(セッション鍵として毎回異なる鍵)ないし共通鍵を生成するための秘密情報を RSA 暗号のような公開鍵暗号を用いて一方から他方へ暗号化して送信する方法があります.すなわち,相手の公開鍵で共通鍵 (または共通鍵生成情報)を暗号化して送信します.暗号化された鍵を受信した方は,自分の秘密鍵を使いセッション鍵が得られます.このとき利用する公開鍵暗号の秘密鍵と公開鍵の対は,長期間にわたって使われます.この秘密鍵が漏洩した場合,過去の通信データを保持していれば,セッション鍵が復元でき過去の暗号化データを解読できることになります.したがって,TLS
の鍵配送に RSA 暗号を用いる方法は Forward security ではありません.
Forward security を満たしていれば,例え誰かがサーバの秘密鍵を手に入れたとしても,通信情報の記録が過去に遡って解読されることを防ぐことができます.
鍵交換プロトコル
- TLS
Forward security を満たす TLS の鍵交換プロトコルには,
- DHE(Ephemeral Diffie-Hellman 鍵共有)
- ECDHE(楕円曲線 Ephemeral Diffie-Hellman鍵共有)
があります.ここで,"ephemeral" は「束の間の,短期的」と言う意味で,鍵(および鍵生成パラメータ)が毎回変わることを示しています.
これら 2 つの鍵交換方式では,サーバの長期的な秘密鍵を使用するのではなく,Diffie-Hellman (DH) 鍵共有メカニズムを使用してセッション鍵を生成します.このとき,DH 鍵共有メカニズムに使用するパラメータは動的に変更されます.
なお,DH 鍵共有では,通信相手の認証ができないので,ディジタル署名(鍵交換メッセージへの署名)と組合せて利用されます.
- 暗号スイート
DHE または ECDHE を使用する場合,サーバはプリマスタシークレットの導出に使用されるサーバパラメータを動的に生成し,TLS ハンドシェーク時の ServerKeyExchange メッセージでクライアントに送信します.
- DHE_RSA
ServerKeyExchange メッセージにはサーバの RSA 秘密鍵で署名された DH 公開鍵 (DHパラメータ付) が含まれます.
- ECDHE_RSA
ServerKeyExchange メッセージには ECDHE 公開鍵とその楕円曲線パラメータが含まれ,これらはともにサーバの RSA 秘密鍵で署名されます.
- ECDHE_ECDSA
ServerKeyExchange メッセージには ECDHE 公開鍵とその楕円曲線パラメータが含まれ,これらはともにサーバの ECDSA 秘密鍵で署名されます. 全体が楕円曲線暗号系になります.
- 暗号の強度
暗号スイートの選択に当たっては,その強度(安全性)も重要です.
DHE を使う場合,1024 ビットの DH パラメータは現在では安全とは言えません(RSA は,2048ビット以上が主流になりつつあります). ECDHE の場合は,楕円曲線パラメータが 224 ~ 256 ビット以上であれば,現状は問題ないと言えます.
Forward Security を提供する ECDH ベースの鍵交換は,最近では Forward Security を提供しない基本の RSA-2048 鍵交換よりも高速になってきています.RSA-3072 や RSA-4096 のようなより長い RSA 鍵への推移が進むにつれ,ECDHE が性能面で有利になります.
- Forward security の設定
Forward security を実現するには,サーバやクライアントが対応する暗号スイートを実装していることが必要ですが,サーバを適切に設定することも重要です. 暗号スイートを決定するのはサーバであり,最終的にクライアントの優先設定をサーバが強制変更する可能性もあります.
デフォルトの暗号スイートは,クライアントがすべての暗号スイートをサポートしている場合に,サーバによってネゴシエーションにより選択される暗号スイートです. 安全でない暗号スイートは,このデフォルトから削除すべきです.
クライアントがサポートする暗号スイートのリストからサーバが最も好ましいものを選択できるように,サーバの構成情報を次のように設定します.
- ECDHE および DHE をサーバの暗号スイートリストの先頭にする.ECDHE の方が高速であるため,クライアントがサポートする場合は選択されるようにこの順番は重要です.
例えば (TLSv1.2),次のような暗号スイートを先頭にします.
- ECDHE_RSA_AES128_GCM_SHA256
- DHE_RSA_AES256_GCM_SHA384