💡

AWS S3にHTTP(非暗号化)通信しているログを確認する方法

2025/04/05に公開

背景

Amazon S3は、データの保存と取得を行うクラウドサービスです。
AWS公式のSDKやCLIを利用している場合、通信は暗号化されたHTTPSが使用されます。よりセキュアにするために、S3のバケットポリシーでaws:SecureTransport 条件キーを用い、HTTPS リクエストのみにアクセスを制限すると良いでしょう。

バケットポリシー例
{
    "Version": "2012-10-17",
    "Statement": [{
        "Sid": "RestrictToTLSRequestsOnly",
        "Action": "s3:*",
        "Effect": "Deny",
        "Resource": [
            "arn:aws:s3:::amzn-s3-demo-bucket",
            "arn:aws:s3:::amzn-s3-demo-bucket/*"
        ],
        "Condition": {
            "Bool": {
                "aws:SecureTransport": "false"
            }
        },
        "Principal": "*"
    }]
}

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-HTTP-HTTPS

設定をする際に、現在、非暗号化通信が行われているかどうかを確認したいケースがあります。本記事では、AWS S3で非暗号化通信を確認する方法について解説します。


2つの確認方法

① S3サーバーアクセスログで確認する方法

Amazon S3のサーバーアクセスログには、S3バケットへのリクエストに関する詳細情報が記録されます。このログを分析することで、HTTP通信(非暗号化)が発生しているかどうかを確認できます。

手順:

  1. サーバーアクセスログを有効化する
    • AWSコンソールまたはCLIを使用して対象バケットのアクセスログを有効にします。
  2. ログフォーマットの確認
    • サーバーアクセスログには、「TLS のバージョン」というフィールドがあります。このフィールドが「-」の場合、TLSが使用されていない(HTTP通信)ことを示しています。
  3. ログ分析
    • ログファイル内で「TLS のバージョン」フィールドを検索し、「-」の値があるか確認します。

参考:
TLSのバージョンフィールドの詳細はAWS公式ドキュメントをご参照ください。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/LogFormat.html


② CloudTrail S3データイベントで確認する方法

CloudTrail S3データイベントを利用すると、HTTP通信の証跡をクエリすることが可能です。

手順:

  1. イベントデータストア作成
    • データイベントをクエリするためには、イベントデータストアを作成する必要があります。
  2. ログフォーマットの確認
    • S3データイベントには、tlsDetails.tlsVersionというフィールドがあります。このフィールドがnullの場合、TLSが使用されていない(HTTP通信)ことを示しています。
  3. ログ分析
    • クエリ機能を用いて、イベントデータストア内でtlsDetails.tlsVersionnullのイベント証跡があるか確認します。
② CloudTrail S3データイベントで確認する方法をやってみる

Athenaと比べて、CloudTrailのデータイベントを分析した経験がある方は少ないかもしれません。そこで、今回は実際に分析手順を詳しくご紹介します。
また、今回は管理アカウントでイベントデータストア作成を作成し、メンバーアカウントを含めたAWS Organizations全体のログを分析します。

イベントデータストア作成

管理アカウントで、イベントデータストアを作成します。

今回は、S3データイベントをAWS Organizations全体で取得したいため、

  • データイベントにチェック
  • 組織内のすべてのアカウントについて有効化にチェック
  • S3を選択

して、イベントデータストアを作成します。

ログ分析

管理アカウントで、CloudTrailのクエリページを開きます。

イベントデータストア欄で、先ほど作成したイベントデータストアを選択します。
イベントデータストアIDが表示されるので、SQLのFROM句に入力します。

tlsDetails.tlsversion が NULLのイベント証跡を取得するクエリ
select *
from イベントデータストアID
where tlsDetails.tlsversion IS NULL 
	and sourceIPAddress NOT IN ('config.amazonaws.com', 'ssm.amazonaws.com', 's3.amazonaws.com' , 'cloudtrail.amazonaws.com', 'securitylake.amazonaws.com')

クエリするとtlsDetails.tlsVersionnullのイベント、非暗号化通信をしている証跡が確認できました。


ユースケース

担当者の属性によって使い分けるのが良いと思いました。

担当者がAWS Organizations全体や管理アカウント、CloudTrailを主に扱っている場合は、CloudTrail S3データイベントで確認する方法がAWS環境全体に対して確認できるため便利でした。
一方で既にS3サーバアクセスログが有効になっている場合や、担当者がS3やAthenaを普段利用している・管理している場合はS3サーバアクセスログを分析する方が工数が少ないと思われます。

疑問点や間違いがございましたらコメントいただけますと幸いです。
最後までお読みいただきありがとうございました。

Discussion