【Amazon S3を利用しているすべての人が安心して2019/06/24を迎えるために】CloudTrailとAthenaを用いたS3の署名バージョンの確認方法

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。

何度か記事が上がっていますが、大事なことなので私からも警鐘を鳴らしたいと思います。

廃止予定のS3署名バージョン2API利用をCloudWatchEventで検出してみた

署名バージョン4専用のS3エンドポイントを古いCLIで試してみた

上の記事をすでに見ている人はご存知の内容になりますが、 2019/6/24 以降、署名バージョン 2を用いたS3へのアクセスは受け付けらないことになります。
これにより、署名バージョン 2を用いている場合、S3へファイルのアップロードやダウンロードも含めすべての操作ができないということになります。

Amazon S3 における AWS 署名バージョン 2 の廃止

上記に対応が必要なAWS SDKやAWS CLIのバージョン等の記載もあるので、 まずはそこに記載されているバージョンを用いているかの確認から行う必要があります。

日本リージョンは現時点では、署名バージョン 2をサポートしているため、署名バージョン 4への対応は必須となります。

署名バージョン2を使っているかを確認する

S3のアクセスログを用いる方法だったり、CloudTrailを用いる方法があります。

S3のアクセスログを用いる方法は下記のエントリを参照ください。

S3のサーバアクセスログで署名バージョンの確認ができるようになりました

今回のエントリではCluoudTrailを用いて署名バージョン2を使っている箇所を特定していきます。

その際に、一点注意が必要です。

ClludTrailを有効にすることで、バケットに対する操作は取得できますが、オブジェクトの操作に対するアクセスのロギングはCloudTrailを有効にするだけでは取得ができない点が注意が必要です。 CloudTrailのオブジェクト単位での取得はこちらを参考に設定を行ってください。

【新機能】CloudTrailでS3オブジェクトレベルのアクセスをロギングする

この方法で取得したアクセスログが以下になります。

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "(省略)",
        "arn": "(省略)",
        "accountId": "(省略)",
        "accessKeyId": "(省略)",
        "userName": "(省略)"
    },
    "eventTime": "2019-02-14T10:38:35Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "PutObject",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "(省略)",
    "userAgent": "[aws-sdk-java/1.9.13 Windows_Server_2012_R2/6.3 Java_HotSpot(TM)_64-Bit_Server_VM/24.80-b11/1.7.0_80]",
    "requestParameters": {
        "bucketName": "(省略)",
        "Host": "(省略)",
        "key": "(省略)"
    },
    "responseElements": null,
    "additionalEventData": {
        "SignatureVersion": "SigV2",
        "CipherSuite": "(省略)",
        "AuthenticationMethod": "(省略)",
        "x-amz-id-2": "(省略)"
    },
    "requestID": "(省略)",
    "eventID": "(省略)",
    "readOnly": (省略),
    "resources": [
        {
            "type": "AWS::S3::Object",
            "ARN": "(省略)"
        },
        {
            "accountId": "(省略)",
            "type": "AWS::S3::Bucket",
            "ARN": "(省略)"
        }
    ],
    "eventType": "AwsApiCall",
    "recipientAccountId": "(省略)"
}

ほとんどマスクしていますが、署名バージョン 2を用いたアクセスであることがわかります。
これは用いたSDKがJavaの1.9.13 であった点からもドキュメントに記載されている通りの内容になります。

さすがに一つ一つCloudTrailのJsonを参照するのは大変なので、Athenaでのクエリで確認してみました。

なお、CloudTrailをAthenaで参照する方法については下記のエントリーを参照してください。

[AWS ]CloudTrailの証跡ログをAthenaを使ってサクッと解析する[このリソース誰が作ったの?]

自分が署名バージョン2の検証用に用いているクエリは下記になります。

SELECT   
         eventtime,
         eventname,
         awsregion,
         useragent,
         sourceIPAddress as sourceIPAddress,
         json_extract_scalar(requestparameters,'$.bucketName') as bucket,
         useridentity.type,
         userIdentity.accessKeyId,
         json_extract_scalar(requestparameters,'$.key') as key, 
         json_extract_scalar(additionalEventData, '$.SignatureVersion') as version
FROM "default"."cloudtrail_logs_eventtrailsf1f684fc" where json_extract_scalar(additionalEventData, '$.SignatureVersion') = 'SigV2'
"eventtime" "2019-03-27T12:27:24Z"
"eventname" "GetObject"
"awsregion" "ap-northeast-1"
"useragent" "[aws-sdk-java/1.9.13 Windows_Server_2012_R2/6.3 Java_HotSpot(TM)_64-Bit_Server_VM/24.80-b11/1.7.0_80]"
"sourceIPAddress" "(省略)"
"bucket" "cm-kajiwara-s3-v2-v4"
"type" "IAMUser"
"accesskeyid" "(省略)"
"key" "05.txt"
"version" "SigV2"

上記のクエリでCloudTrailでロギングされた署名バージョン 2を用いたアクセスがあることを調べることができます。 また、その際に用いられたAPIやアクセスが会ったIPアドレス・IAMユーザーなのかIAM Roleなのかといった情報も確認できるので、実装のどの箇所かといった推測もしやすくなるかと思います。

注意点

S3オブジェクトログの取得により、CloudTrailのイベント課金(100,000 件のイベントあたり 0.1$)と、S3のログ保存コストが発生します。 S3の利用が多いシステムでは、定期的にCloudTrailのログ出力先としたS3バケットのメトリックス情報や、請求速報より発生するコストを確認してご利用ください。

また、S3のV2署名利用の確認のためにS3オブジェクトログを有効化した場合、確認が完了したS3バケットは対象から外す事をおすすめします。

最後に

複数の方法での確認方法V2署名の確認方法は Developers.IO で公開されていますが、今回はCloudTrailとAthenaを用いた方法を取り上げました。

各々が利用しやすい方法を用いて確認をし、必要な対策を行うことで、2019/06/24以降も安心してS3を使いたいものです。