
S3サーバーアクセスログの形式を実際のログを見ながら確認してみた
この記事は公開されてから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 サーバーアクセスログ
ログの形式は以下に記載されています。
また、ログのいくつかの箇所は「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データイベントログでも確認しています。
同じような方のお役に立てば幸いです。
参考資料
Athena を使用して Amazon S3 サーバーのアクセスログを分析するにはどうすればよいですか?
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、さまざまな背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。











