[UPDATE] Amazon CloudFrontでクライアントのTLSバージョンを確認できるCloudFront-Viewer-TLSヘッダが利用可能になりました

Amazon CloudFrontでビューアが利用しているTLSバージョンと暗号スイートを参照できるCloudFront-Viewer-TLSヘッダが利用可能になりました。Origin request policyで設定する点に注意しましょう。
2022.05.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

清水です。本日お届けするアップデート情報はこちら!AWSのCDNサービスであるAmazon CluodFrontでクライアントのTLSバージョンと暗号スイートを確認できるCloudFront-Viewer-TLSヘッダが利用可能になりました。2022/05/23付でポストされたアップデート情報になります。

これまでもCloudFrontではディストリビューション単位でSecurity policyとしてビューア(クライアント)とCloudFront間の最小のTLSプロトコルと暗号スイートを指定することが可能でした。またアクセスログでビューアがリクエスト時に利用したTLSプロトコルと暗号スイートを確認することも可能です。今回これらに加え、リクエスト時のヘッダでTLSプロトコルバージョンと暗号スイートの確認ができるようになったわけです。リクエストに対してリアルタイムにTLSバージョンや暗号スイートを確認して処理が行えますね。オリジン側でヘッダの内容を参照するほか、CloudFront FunctionsやLambda@EdgeでCloudFront-Viewer-TLSヘッダを参照して指定のTLSバージョン未満であればアクセスを制限する、といったことが可能になります。

本エントリではこのCloudFront-Viewer-TLSヘッダの設定ならびにオリジンサーバでの確認をしてみたのでまとめてみます。

CloudFront-Viewer-TLSヘッダを確認してみた

それでは実際にCloudFrontでCloudFront-Viewer-TLSヘッダをオリジンに転送するように設定し、このヘッダ内容を確認してみます。

Origin request policyの作成

まずはOrigin request policyを作成します。CloudFrontのマネジメントコンソール、[Create origin request policy]ボタンから進みます。Origin request settingsのHeadersの項目で、All viewer headers and the following CloudFront headersを選択、続くAdd headerの項目ではCloudFront-Viewer-Addressを選択します。

Distributionの作成

Origin request policyの作成が作成できたら、続いてこちらを使用するCloudFront Distributionを作成していきます。作成時、Cache key and origin requestsの項目ではLegacy cache settingsではなくCache policy and origin request policyを選択します。使用するポリシーは先ほど作成したOrigin request policyで作成したポリシー(今回は「Custom-CloudFrontViewerTLSHeader」という名称)を選択します。今回は動作検証のため、Cache policyは「CachingDisabled」としました。

今回、オリジンはEC2インスタンスで、Public IPv4 DNSを使って指定しています。オリジンへの通信はHTTPのみ(HTTPS未使用)です。

CloudFront側ではCNAMEを指定、証明書を設定してHTTPSアクセス可能としています。Security policyについてはTLSバージョンなどの確認のためTLSv1.1_2016を選択しています。

オリジンとなるEC2インスタンス上ではApache + PHPの環境を準備、以下のindex.phpのコードを配置してヘッダの内容を出力するようにします。

index.php

<?php

foreach (getallheaders() as $name => $value) {
    echo "<p>";
    echo "$name: $value\n";
    echo "</p>";
}

?>

CloudFront-Viewer-TLSヘッダの確認

それでは実際にCloudFrontに設定したドメイン名(cfvtls.example.net)にアクセスしてみます。まずはChromeブラウザでのアクセスです。以下のように、CloudFront-Viewer-TLS: TLSv1.3:TLS_AES_128_GCM_SHA256CloudFront-Viewer-TLSヘッダが確認できますね。

続いてcurlコマンドでTLSのバージョンを指定して確認してみましょう。--tls-maxオプションで許容できる最大のTLSバージョンを指定しています。

まずはTLSバージョンを指定しない状態です。CloudFront-Viewer-TLS: TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256というヘッダの内容が確認できますね。この検証した環境のcurlコマンドでは利用できる最大のTLSバージョンは1.2ということになります。

% curl https://cfvtls.example.net/
<p>Host: cfvtls.example.net
</p><p>User-Agent: curl/7.64.1
</p><p>X-Amz-Cf-Id: qdnJxxxxxxxxxxxxxxxxxxxxxxxxqzlBQ9v_e-DJ-mGLHPW-T8JXJQ==
</p><p>Connection: Keep-Alive
</p><p>Via: 2.0 0706xxxxxxxxxxxxxxxx2676497fddf2.cloudfront.net (CloudFront)
</p><p>X-Forwarded-For: xxx.xxx.xxx.xxx
</p><p>Accept: */*
</p><p>CloudFront-Viewer-TLS: TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256
</p>

--tls-max 1.2を指定しても同様の結果となります。(--tls-max 1.3オプションではサポート外である旨、警告がありました。)

% curl --tls-max 1.2 https://cfvtls.example.net/
<p>Host: cfvtls.example.net
</p><p>User-Agent: curl/7.64.1
</p><p>X-Amz-Cf-Id: wfUWxxxxxxxxxxxxxxxxxxxxxxxx-QQeoS0N0mWfxi8OL1YX883zrA==
</p><p>Connection: Keep-Alive
</p><p>Via: 2.0 823exxxxxxxxxxxxxxxx23cb55639cd2.cloudfront.net (CloudFront)
</p><p>X-Forwarded-For: xxx.xxx.xxx.xxx
</p><p>Accept: */*
</p><p>CloudFront-Viewer-TLS: TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256
</p>

--tls-max 1.1を指定してみました。CloudFront-Viewer-TLSヘッダでTLSv1.1:ECDHE-RSA-AES128-SHAという内容が確認できますね。

% curl --tls-max 1.1 https://cfvtls.example.net/
<p>Host: cfvtls.example.net
</p><p>User-Agent: curl/7.64.1
</p><p>X-Amz-Cf-Id: isjZxxxxxxxxxxxxxxxxxxxxxxxxiCH5j89HXkhwz2_9QBq_9YGwqA==
</p><p>Connection: Keep-Alive
</p><p>Via: 2.0 532cxxxxxxxxxxxxxxxx6bbd88ba55e2.cloudfront.net (CloudFront)
</p><p>X-Forwarded-For: xxx.xxx.xxx.xxx
</p><p>Accept: */*
</p><p>CloudFront-Viewer-TLS: TLSv1.1:ECDHE-RSA-AES128-SHA
</p>

まとめ

AWSのCDNサービスAmazon CloudFrontで新たに追加されたCloudFront-Viewer-TLSヘッダを確認してみました。今回はオリジン側でヘッダ情報を参照するかたちでしたが、CloudFront FunctionsやLambda@EdgeでCloudFront-Viewer-TLSヘッダを参照し、指定のTLSバージョン以下であればアクセスを制限する、といった使い方が案内されています。これまではSecurity policyで設定を行い、指定したTLSバージョン未満などの場合は接続に失敗してしまうかたちだったのが、例えばアクセスを制限しながらTLSバージョンのアップデートを促すなどより柔軟な対応ができそうですね。

なお、最近CloudFrontに追加されている他のヘッダと同様(例えばCloudFront-Viewer-Addressヘッダなど)、Legacy cache settingsでは利用できずOrigin request poilcyとして設定する必要がある点に留意しておきましょう。