この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
清水です。本日お届けするアップデート情報はこちら!AWSのCDNサービスであるAmazon CluodFrontでクライアントのTLSバージョンと暗号スイートを確認できるCloudFront-Viewer-TLSヘッダが利用可能になりました。2022/05/23付でポストされたアップデート情報になります。
- Amazon CloudFront now provides TLS version and cipher suite in CloudFront-Viewer-TLS-header
- Amazon CloudFront が、CloudFront-Viewer-TLS-header で TLS バージョンと暗号スイートの提供を開始
これまでも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_SHA256
とCloudFront-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として設定する必要がある点に留意しておきましょう。