全S3バケットのオブジェクトログを一発で出力するツールを作りました

S3で署名v2のリクエストが無効になるので調査が必要です。まずはS3のログを出力したいので一括で出力設定が行えるツール ObjectLogging4AllBuckets を作りました。

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

大栗です。

もう少しでS3のリクエストで署名バージョン2が使用できなくなります。その調査は大変です。まずはS3バケットでデータイベントのログを出力して、署名v2のアクセスがどこからか確認しなければなりませんがバケット数が多いと面倒です。ということで一発で全バケットのオブジェクトレベルのログを出力設定するツールを作りました。

maroon1st/ObjectLogging4AllBuckets

S3の署名v2が廃止される件についてはこちらを御覧ください。

【超重要】対応しないと使えなくなるかも?!今、全S3ユーザがチェックすべき署名バージョン2の廃止について

ObjectLogging4AllBuckets

ObjectLogging4AllBucketsは指定した名称でS3バケットを作成して、その他のS3バケットについてCloudTrailのデータイベントを有効にしてオブジェクトレベルのログを出力します。

動作確認環境

以下の環境で確認をしています。

  • OS : Amazon Linux 2
  • Bash : GNU bash, version 4.2.46(2)-release (x86_64-koji-linux-gnu)
  • aws-cli : version 1.16.102

ライセンス

ライセンスは Apache License Version 2.0 です。

使い方

以下のようにコマンドを実行します。

$ ObjectLogging4AllBuckets.sh -r <region> -t <trail name> -b <S3 bucket name> [-p <prefix>]
  • -r : ログ収集先のS3バケットとCloudTrailを作成するリージョンです。(e.g. ap-northeast-1 )
  • -t : 作成するCloudTrailの名称です。
  • -b : 作成するS3バケットの名称です。重複した名称は使用できないためワールドワイドで一意な名称を指定して下さい。
  • -p : S3バケットにログを出力するパスのPrefixです。指定しなくても良いです。

実行例

$ ./ObjectLogging4AllBuckets.sh -r ap-northeast-1 -t S3Trail -b BUCKETNAME
Check S3 Bucket: BUCKETNAME
Create S3 Bucket: BUCKETNAME
{
    "Location": "http://BUCKETNAME.s3.amazonaws.com/"
}
Setting Policy: BUCKETNAME
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSCloudTrailAclCheck20150319",
      "Effect": "Allow",
      "Principal": {"Service": "cloudtrail.amazonaws.com"},
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::BUCKETNAME"
    },
    {
      "Sid": "AWSCloudTrailWrite20150319",
      "Effect": "Allow",
      "Principal": {"Service": "cloudtrail.amazonaws.com"},
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::BUCKETNAME/AWSLogs/123456789012/*",
      "Condition": {"StringEquals": {"s3:x-amz-acl": "bucket-owner-full-control"}}
    }
  ]
}
Put Bucket Policy: BUCKETNAME
Create Trail: S3Trail
{
    "IncludeGlobalServiceEvents": true,
    "IsOrganizationTrail": false,
    "Name": "S3Trail",
    "S3KeyPrefix": "",
    "TrailARN": "arn:aws:cloudtrail:ap-northeast-1:123456789012:trail/S3Trail",
    "LogFileValidationEnabled": false,
    "IsMultiRegionTrail": true,
    "S3BucketName": "BUCKETNAME"
}
Start Logging: S3Trail
Put Event Selectors: S3Trail
{
    "EventSelectors": [
        {
            "IncludeManagementEvents": false,
            "DataResources": [
                {
                    "Values": [
                        "arn:aws:s3:::bucket1/",
                        "arn:aws:s3:::bucket2/",
                             ・
                             ・
                             ・
                        "arn:aws:s3:::bucket99/",
                        "arn:aws:s3:::bucket100/"
                    ],
                    "Type": "AWS::S3::Object"
                }
            ],
            "ReadWriteType": "All"
        }
    ],
    "TrailARN": "arn:aws:cloudtrail:ap-northeast-1:123456789012:trail/S3Trail"
}
end

実行すると、以下のようにCloudTrailのデータイベントで全S3バケット(ツール内で作成した物を除く)が並びます。

S3もバケットの中に各リージョンのログが出力されます。

さいごに

S3のログはCloudWatch Logs出力して集計することも可能ですが、CloudWatch Logsは比較的ログの料金がかかってしまいます。アクセス量が多い場合にはS3にログを出力してAthenaで分析するのが良いと思われます。