S3サーバーアクセスログの形式を実際のログを見ながら確認してみた

2022.05.17

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

アノテーション テクニカルサポートの小川です。

単純に気になったので、S3サーバーアクセスログの形式を、実際のログの中身と一緒に確認してみました。
今回確認したのは、PutObjectの成功時とエラー時のログです。
なお、GetObjectのログも確認しましたが、ほとんど内容が変わらなかったので割愛しました。

対象のS3バケットの設定

特定のIPアドレス以外からのアクションを拒否する、以下のバケットポリシーを設定しています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::test-blog-12345/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "xx.xx.xx.xx/32"
                }
            }
        }
    ]
}

S3 サーバーアクセスログ

ログの形式は以下に記載されています。

Amazon S3 サーバーアクセスログの形式

また、ログのいくつかの箇所は「xxx」で隠しています。

PutObject

成功時

S3のコンソールから、test.txtというファイルをアップロードしました。
ファイルの内容は「test」という文字列だけです。

特定のIPアドレスからのアクセスのため、拒否されていません。
ログにはフィールド名が記載されておらず、大量のログファイルが作成されるため、分析するにはAthenaが必須だと感じました。

フィールド名
Bucket Owner xxx
Bucket test-blog-12345
Time [15/May/2022:02:43:58 +0000]
Remote IP xxx
Requester arn:aws:sts::xxx:assumed-role/xxx/xxx
Request ID T7F06Dxxx
Operation REST.PUT.OBJECT
Key test.txt
Request-URI "PUT /test.txt HTTP/1.1"
HTTP status 200
Error Code -
Bytes Sent -
Object Size 4
Total Time 32
Turn-Around Time 14
Referer "https://s3.console.aws.amazon.com/s3/upload/test-blog-12345?region=ap-northeast-1"
User-Agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"
Version Id -
Host Id GZWg3nxxx
Signature Version SigV4
Cipher Suite ECDHE-RSA-AES128-GCM-SHA256
Authentication Type QueryString
Host Header test-blog-12345.s3.ap-northeast-1.amazonaws.com
TLS version TLSv1.2
Access Point ARN (Amazon Resource Name) -

エラー時

CloudShellからAWS CLIを利用し、空のファイルをs3api put-objectでアップロードしました。
特定IPアドレスからのリクエストでないため、アクセスが拒否されます。

フィールド名
Bucket Owner xxx
Bucket test-blog-12345
Time [15/May/2022:02:46:31 +0000]
Remote IP xxx
Requester arn:aws:sts::xxx:assumed-role/xxx/xxx
Request ID C9VCT7xxx
Operation REST.PUT.OBJECT
Key test2.txt
Request-URI "PUT /test2.txt HTTP/1.1"*
HTTP status 403
Error Code AccessDenied
Bytes Sent 243
Object Size 0
Total Time 38
Turn-Around Time -
Referer "-"
User-Agent "aws-cli/2.6.3 Python/3.9.11 Linux/4.14.275-207.503.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/s3api.put-object"
Version Id -
Host Id jfovOJxxx
Signature Version SigV4
Cipher Suite ECDHE-RSA-AES128-GCM-SHA256
Authentication Type AuthHeader
Host Header test-blog-12345.s3.ap-northeast-1.amazonaws.com
TLS version TLSv1.2
Access Point ARN (Amazon Resource Name) -

さいごに

個人的に、ドキュメントでログの形式説明と一緒に実際のログを確認することでイメージがしやすくなるので、今回のブログを作成してみました。

ちなみに、CloudTrailデータイベントログでも確認しています。

同じような方のお役に立てば幸いです。

参考資料

Amazon S3 サーバーアクセスログの形式

Athena を使用して Amazon S3 サーバーのアクセスログを分析するにはどうすればよいですか?

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、さまざまな背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。