サイトに SSL を使用することは、ユーザーのセキュリティとプライバシーを保護するための重要な方法です。ただし、SSL を有効にすれば安心というわけではありません。Cookie に Secure 属性を設定する、HTTP Strict Transport Security を有効にする、Content Security Policy を使用してサイトの権限をロックダウンするなど、サイトのセキュリティをさらに強化するための多くの方法があります。ただし、これらの強力な機能をデプロイするのは難しい場合があります。より厳格な SSL を導入できるように、Chrome 46 には HPKP レポートという機能が搭載されています。
これらの頭字語はそれぞれ何を意味しますか?
現在のウェブのセキュリティは、SSL 証明書に依存しています。SSL 証明書は、ウェブサイトが自称するウェブサイトであることを証明する暗号署名です。ブラウザが https://developers.google.com などの URL にリクエストを送信すると、サーバーは SSL 証明書を提供します。証明書が有効な場合、ブラウザはリクエストを続行し、アドレスバーに緑色の南京錠付きのウェブサイト URL を表示します。
有効な証明書とは証明書が有効と見なされるには、認証局(CA)または CA によって署名された別の証明書(中間 CA)によって署名されている必要があります。ブラウザとオペレーティング システムには、証明書の発行が信頼できる数百の CA のリストが付属しています。ただし、デフォルトでは、これらの CA のいずれも任意のウェブサイトの証明書を発行できます。いずれかが不正使用されたり、誤動作したりすると、ウェブ全体に壊滅的な影響を与える可能性があります。
HTTP Public Key Pinning(HPKP)を入力します。この標準により、ウェブサイトは SSL 証明書チェーンの一部を記憶(または「固定」)するようブラウザに指示する HTTP ヘッダーを送信できます。ブラウザは、以前に受け取ったピンと一致しない後続の接続を拒否します。HPKP ヘッダーの例を次に示します。
Public-Key-Pins:
pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";
pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";
max-age=259200
このヘッダーでは、2 つの証明書ハッシュをピンとして指定します。1 つはサイトの証明書チェーン内の証明書のハッシュで、もう 1 つはバックアップ PIN です。これは、証明書のローテーションが必要な場合にサイトが使用できる証明書のハッシュです。ヘッダーには max-age
値も含まれます。その秒数が経過すると、ブラウザはピンを忘れます。
HPKP の詳細については、仕様または Chrome デベロッパーの Chris Palmer による優れたブログ投稿をご覧ください。
HPKP を今すぐ有効にすべきですか?
必ずしもそうとは限りません。HPKP をデプロイする際に、誤ってサイトを DoS 攻撃してしまうことは非常に簡単です。サイトを 1 つの証明書セットに固定してから新しい証明書をデプロイする必要がある場合、固定を見たユーザーは、固定が期限切れになるまで(ヘッダーの max-age
値に基づく)サイトにアクセスできなくなります。
正しく設定するのが難しいため、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 ヘッダーのピンに基づいてリクエストをブロックすることはありません。そのため、サイトへの DoS 攻撃のリスクを負うことなく、HPKP を試してユーザーに問題が発生するかどうかを確認できます。
Report-Only ヘッダーは、受信したリクエストにのみ適用されます。ブラウザは、実際のピンとは異なり、報告専用のピンを記憶しません。これにより、ユーザーのブラウザに不正な値をキャッシュに保存する心配をすることなく構成をテストできます。また、(1 つのリソースのみなど)段階的にロールアウトして、サーバーにレポートが殺到するのを防ぐことができます。
実際の Public-Key-Pins
ヘッダーをロールアウトしてピンの適用を開始するときに、そのヘッダーに report-uri 値を含めることもできます。これにより、問題が発生した場合も引き続きレポートを受け取ることができます。
HPKP 違反レポートに含める内容
HPKP 違反レポートは、構成済みの report-uri
に HTTP POST リクエストで送信される JSON メッセージです。フィールドのリストは仕様で確認できますが、ここでは served-certificate-chain
と validated-certificate-chain
の 2 つを紹介します。served-certificate-chain
は、リクエストの SSL 接続を設定するときに Chrome が受け取った証明書とまったく同じです。一方、validated-certificate-chain
は、Chrome がサーバー証明書の検証時に再構築したチェーンです。これは、served-certificate-chain
とは異なる場合があります。クライアントによって証明書の検証方法が異なるため、これが HPKP の構成ミスの一般的な原因となる可能性があります。予期しない報告が届いた場合は、必ずこのフィールドを確認してください。
最後の注意事項
HPKP レポートをデプロイする場合は、Chrome がレポート送信リクエストを含むすべてのリクエストに対してピンの検証を行うことに注意してください。そのため、サイトに HPKP をデプロイしている場合は、固定していない別のドメインに HPKP レポートを送信することをおすすめします。そうしないと、サイトのピンに関する違反が同じドメインへの報告をトリガーし、ピンに関する違反も失敗するため、報告は届きません。
別のドメインがない場合は、report-uri.io などのサービスを使用することもできます。このサービスは違反報告を処理します。