Amazon CloudFront のアクセスログを集計して TLS バージョンの使用状況をカウントしてみる

2024.04.21

いわさです。

TLS 1.3 について調べていると、現在では多くのブラウザやクライアントアプリケーションのデフォルト挙動として TLS 1.3 がサポートされていることがわかりました。

現在は TLS 1.2 は非推奨とはなっていませんが、ALB など一部のサービスではセキュリティポリシーとして TLS 1.3 のみを許可するポリシーが用意されています。
私には今後の動向を予想できる能力はないのですが、現在のクライアントのサポート状況からすると TLS 1.3 以上が強制される未来に備えておいたほうが良いと思っています。

前述のとおり多くのクライアントでは TLS 1.3 が自動で使用される状況ですが、一部のレガシーブラウザ、あるいはクライアントアプリケーションの実装によっては TLS 1.2 が使われている場合があります。

そこで、まずは TLS 1.2 のサポートをしない場合にどの程度のクライアントに影響が発生するのかを把握したいところです。

AWS の各サービスはアクセスログを出力が出来ますので、例えば ALB であれば次のように TLS プロトコルバージョンの使用状況を確認することが出来ます。

CloudFront でも確認したい

各サービスでアクセスログを出力し、TLS プロトコルの使用状況を把握できるようにしておくアプローチはとても良いと思いました。
上記ブログは ALB のものですが、このログは各サービスによって違います。
幸い、CloudFront でも TLS プロトコルは出力項目に含まれているようなので、上記記事の応用で確認することが出来そうです。

やってみた

次のように新しいディストリビューションを作成します。
スクリーンショットを取るのを忘れていたのですが、アクセスログを S3 に出力するように構成しています。

ちなみに 2020 年 9 月ごろのアップデートで CloudFront の全てのセキュリティポリシーで TLS 1.3 がサポートされており、自動適用されています。
明示的にサーバーの最大 TLS バージョンを制限することは出来ません。

よって、クライアントが TLS 1.3 をサポートしていれば TLS 1.3 で通信が行われ、クライアントが TLS 1.2 までしかサポートしていなければ TLS 1.2 で通信されます。
念の為sslscanコマンドでも確認してみますと、次のように TLS 1.2 と TLS 1.3 がサポートされています。

% sslscan https://hoge0419.fuga.tak1wa.com/        
Version: 2.1.3
OpenSSL 3.2.1 30 Jan 2024

Connected to 13.225.183.25

Testing SSL server hoge0419.fuga.tak1wa.com on port 443 using SNI name hoge0419.fuga.tak1wa.com

  SSL/TLS Protocols:
SSLv2     disabled
SSLv3     disabled
TLSv1.0   disabled
TLSv1.1   disabled
TLSv1.2   enabled
TLSv1.3   enabled

  TLS Fallback SCSV:
Server supports TLS Fallback SCSV

  TLS renegotiation:
Session renegotiation not supported

  TLS Compression:
OpenSSL version does not support compression
Rebuild with zlib1g-dev package for zlib support

  Heartbleed:
TLSv1.3 not vulnerable to heartbleed
TLSv1.2 not vulnerable to heartbleed

  Supported Server Cipher(s):
Preferred TLSv1.3  128 bits  TLS_AES_128_GCM_SHA256        Curve 25519 DHE 253
Accepted  TLSv1.3  256 bits  TLS_AES_256_GCM_SHA384        Curve 25519 DHE 253
Accepted  TLSv1.3  256 bits  TLS_CHACHA20_POLY1305_SHA256  Curve 25519 DHE 253
Preferred TLSv1.2  128 bits  ECDHE-RSA-AES128-GCM-SHA256   Curve 25519 DHE 253
Accepted  TLSv1.2  256 bits  ECDHE-RSA-AES256-GCM-SHA384   Curve 25519 DHE 253
Accepted  TLSv1.2  256 bits  ECDHE-RSA-CHACHA20-POLY1305   Curve 25519 DHE 253

:

リクエスト送信

そこで今回は、上記ディストリビューションに対して cURL を使って最大 TLS バージョンに TLS 1.2 と TLS 1.3 をそれぞれ指定していくつかリクエストを送信してみます。

TLS 1.3 で 20 回、TLS 1.2 で 5 回程度リクエストを送信しました。

% curl https://hoge0419.fuga.tak1wa.com/ --tls-max 1.3
hoge.html

:

% curl https://hoge0419.fuga.tak1wa.com/ --tls-max 1.3
hoge.html

% curl https://hoge0419.fuga.tak1wa.com/ --tls-max 1.2
hoge.html

:

% curl https://hoge0419.fuga.tak1wa.com/ --tls-max 1.2
hoge.html

ログを確認

CloudFront のアクセスログは S3 に出力されているのでやはり Athena でクエリするのが一番楽かなと思います。
次の記事では CloudFront のアクセスログを Athena で集計していますので、こちらを応用させてもらいます。

CloudFront にはリアルタイムログと標準ログがあるのですが、今回は標準ログを使っています。

あとはssl_protocolフィールドを集計するだけです。
次のように TLS バージョンごとの件数をカウントしてみました。
テスト送信したリクエストもあったので、概ね期待したとおりの結果になっていると思います。

さいごに

本日は Amazon CloudFront のアクセスログを集計して TLS バージョンの使用状況をカウントしてみました。

今回は標準フィールドに含まれている情報だったので難なく集計出来ましたね。
他のサービスでも集計できるか確認する際にはまずはアクセスログの出力フィールドを確認すると良さそうです。
良さそうですが、必ずしも出力フィールドに含まれていない場合や、ログフォーマットがドキュメントで明示されていないサービスがあります。
例えば API Gateway の場合だと次のような情報を出力できるのですが、こちらは SSL/TLS バージョンに関する情報は含まれていないようです。よってこの場合は別の方法を検討する必要がありそうです。