HPKP レポートを使用した公開鍵ピニングのロールアウト

サイトで SSL を使用することは、ユーザーのセキュリティとプライバシーを保護する重要な方法です。 しかし、SSL を有効にするだけでは終わりではありません。Cookie の Secure 属性を設定する、HTTP Strict Transport Security を有効にする、コンテンツ セキュリティ ポリシーを使用してサイトの権限をロックするなど、サイトのセキュリティをさらに強化する方法はたくさんあります。ただこれら強力な機能のデプロイには 難しい場合があるかもしれませんより厳密な SSL 方式を展開しやすいように、Chrome 46 には HPKP レポートという機能が搭載されています。

これらの頭字語は、すべてどういう意味ですか?

現在、ウェブ上のセキュリティは SSL 証明書に依拠しています。SSL 証明書とは、ウェブサイトが誰であるかを証明する暗号署名です。ブラウザから https://developers.google.com などの URL にリクエストを送信すると、サーバーから SSL 証明書が提供されます。証明書が有効な場合、ブラウザはリクエストの処理を許可し、アドレスバーにウェブサイトの URL を緑色の南京錠とともに表示します。

有効な証明書とは何ですか?証明書が有効と見なされるには、認証局(CA)または CA によって署名された別の証明書(中間 CA)によって署名されている必要があります。ブラウザとオペレーティング システムには、証明書の発行先として信頼されている数百の CA のリストが付属しています。問題は、デフォルトでは、これらの CA がどのウェブサイトに対しても証明書を発行できることです。いずれかが不正使用されたり不正行為が起きたりすると ウェブ全体に壊滅的な被害をもたらす可能性があります

HTTP 公開鍵のピンニング(HPKP)を入力します。この標準を使用すると、ウェブサイトは HTTP ヘッダーを送信して、SSL 証明書チェーンの一部を記憶(「固定」)するようブラウザに指示できます。その後、ブラウザは以前に受け取った PIN と一致しない後続の接続を拒否します。HPKP ヘッダーの例を次に示します。

Public-Key-Pins:  
       pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
       max-age=259200

このヘッダーでは、2 つの証明書ハッシュをピンとして指定します。1 つはサイトの証明書チェーン内の証明書のハッシュで、もう 1 つはバックアップピン(証明書のローテーションが必要な場合にサイトで使用できる証明書のハッシュ)です。また、ヘッダーには max-age 値も含まれます。その秒数が経過すると、ブラウザは PIN を無視します。

HPKP の詳細については、仕様または Chrome デベロッパー Chris Palmer のブログ投稿をご覧ください。

今すぐ HPKP をオンにしたほうがよいですか?

必ずしもそうとは限りません。HPKP をデプロイする際にミスが起きやすく、誤ってサイトを DoS してしまうことがあります。サイトを 1 つの証明書セットに固定し、その後新しい証明書をデプロイする必要がある場合、PIN を見たユーザーは、(ヘッダーの max-age 値に基づいて)PIN の有効期限が切れるまでサイトにアクセスできません。

正確に評価するのは難しいため、現在 HPKP は注目度が高くセキュリティを重視する少数のサイトで主に使用されています。HPKP をオンにする場合は、非常に短い max-age 値から始めて、問題がなければ徐々に増やします。

HPKP レポートの概要とメリット

Chrome 46 でリリースされる HPKP レポートは、HPKP のロールアウト時に構成ミスを検出するために使用できる機能です。

まず、Public-Key-Pins ヘッダーの代わりに Public-Key-Pins-Report-Only ヘッダーを送信します。

Public-Key-Pins-Report-Only: 
       max-age=2592000;  
       pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
report-uri="https://example.net/pkp-report"

サイトからこのようなヘッダーが送信されると、Chrome は現在の接続がピンと一致しているかどうかを確認し、一致しない場合は report-uri にレポートを送信します。Chrome は、Report-Only ヘッダー内のピンに基づいてリクエストをブロックすることはありません。したがって、この方法は HPKP を安全に試すことができ、サイトに DoS をかけることなく、ユーザーに問題を引き起こすかどうかを確認できます。

Report-Only ヘッダーは、それを受け取ったリクエストにのみ適用されます。ブラウザでは、実際のピンと同じようにレポート専用ピンは記憶されません。これにより、ユーザーのブラウザに不正な値がキャッシュされることを気にすることなく、構成をテストできます。また、段階的に(たとえば、1 つのリソースだけに)ロールアウトして、サーバーにレポートがあふれるのを防ぐことができます。

実際の Public-Key-Pins ヘッダーをロールアウトして PIN の適用を開始するときに、そのヘッダーに report-uri 値を含めることもできます。これにより、問題が発生した場合でも引き続きレポートを取得できます。

HPKP 違反レポートには何が含まれますか?

HPKP 違反レポートは、構成した report-uri に HTTP POST リクエストで送信される JSON メッセージです。フィールドのリストはspecに記載されていますが、ここではそのうちの 2 つ(served-certificate-chainvalidated-certificate-chain)について紹介します。served-certificate-chain は、リクエストに対する SSL 接続を設定したときに Chrome が受け取った証明書です。一方、validated-certificate-chain は、Chrome がサーバーの証明書を検証する際に再構築したチェーンです。これは驚くほどですが、served-certificate-chain とは異なる場合があります。クライアントによって証明書の検証方法も異なり、これが HPKP の構成ミスの一般的な原因となっています。予期しないレポートを受け取った場合は、必ずこのフィールドを確認してください。

最後のポイント

HPKP レポートをデプロイする場合、Chrome はレポート送信リクエストを含むすべてのリクエストに対して検証を固定します。サイトに HPKP をデプロイしている場合は 固定していない別のドメインに HPKP レポートを送信することをおすすめしますそうしないと、サイトで PIN に関する違反が発生すると同じドメインに報告が送信され、PIN に関する違反でも報告されません。そのため、レポートは送信されません。

別のドメインがない場合は、代わりに、違反レポートを処理する report-uri.io などのサービスをお試しください。