S3へのアクセスにEndpointが利用されているかS3サーバーアクセスログより確認してみた

S3へのアクセスにVPC Endpointが利用されているかS3サーバーアクセスログより確認してみたいと思います。 インターネットゲートウェイ経由、VPC Endpoint経由でロギングされるアクセス元IPを確認しました。
2020.02.17

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

S3へのアクセスにVPC Endpointが利用されているかS3サーバーアクセスログより確認してみたいと思います。VPC Endpointが利用されていれば、ロギングされるアクセス元IPが変化すると思いますので、インターネットゲートウェイ経由、VPC Endpoint経由で確認してみました。

やってみた

インターネットゲートウェイ経由

まずはインターネットゲートウェイ経由ということで、VPC Endpoint作成前にS3へアクセスし、S3サーバーアクセスログを確認してみたいと思います。ここでは、ログ出力を有効にしたデータ保存用のバケットtestdata2020と、ログ出力先バケットtestlog2020を用意しました。

% aws s3 ls | grep '.*test.*2020'
2020-02-08 12:16:29 testdata2020
2020-02-08 12:16:29 testlog2020

アクセス元は以下のEC2となります。プライベートIPは10.0.1.179で、パブリックIPは52.192.12.142となります。

アクセス元EC2にて、適当なファイル(test.txt)を作成しておき、以下コマンドでデータ保存バケットにアクセスしました。

[ec2-user@ip-10-0-1-179 ~]$ date;aws s3 cp test.txt s3://testdata2020;aws s3 ls s3://testdata2020;date
2020年  2月  8日 土曜日 03:56:41 UTC
upload: ./test.txt to s3://testdata2020/test.txt
2020-02-08 03:56:43          5 test.txt
2020年  2月  8日 土曜日 03:56:44 UTC

S3サーバーアクセスログを確認します。ここでは、Athenaを利用し確認してみたいと思います。AthenaでS3サーバーアクセスログを解析する際は以下が参考になります。

Athenaで作成したテーブルに対し、Request-URIkeyを検索条件にした以下のクエリを実行しました。

SELECT bucket,requestdatetime,remoteip,key,requesturi_operation,httpstatus
FROM s3_access_logs_db.mybucket_logs
where requesturi_operation = 'PUT'
AND key = 'test.txt'
ORDER BY requestdatetime DESC

クエリの実行結果です。

"bucket","requestdatetime","remoteip","key","requesturi_operation","httpstatus"
"testdata2020","08/Feb/2020:03:56:42 +0000","52.192.12.142","test.txt","PUT","200"

S3サーバアクセスログのremoteipフィールドに、EC2のパブリックIP(52.192.12.142)が出力されました。

なお、S3サーバアクセスログの出力はベストエフォートになりますので、クエリ結果が出力されない場合はしばらく時間をおいて再度実行してみてください。詳細については以下をご確認ください。

VPC Endpoint経由

VPC Endpointを作成しました、S3のEndpointはGatewayとなりますのでルーティングも設定されています。

VPC Endpoint

ルートテーブル

データ保存バケットにアクセスしてみます。

[ec2-user@ip-10-0-1-179 ~]$ date;aws s3 rm s3://testdata2020/test.txt;aws s3 ls s3://testdata2020;date
2020年  2月  8日 土曜日 10:44:19 UTC
delete: s3://testdata2020/test.txt
2020年  2月  8日 土曜日 10:44:21 UTC

さきほど同様、Athenaで確認します。今回はファイル削除を行ったので、requesturi_operationを変更しています。

SELECT bucket,requestdatetime,remoteip,key,requesturi_operation,httpstatus
FROM s3_access_logs_db.mybucket_logs
where requesturi_operation = 'DELETE'
AND key = 'test.txt'
ORDER BY requestdatetime DESC

クエリの実行結果です。

"bucket","requestdatetime","remoteip","key","requesturi_operation","httpstatus"
"testdata2020","08/Feb/2020:10:44:20 +0000","10.0.1.179","test.txt","DELETE","204"

S3サーバアクセスログのremoteipフィールドに、EC2のプライベートIP(10.0.1.179)が出力されました。

おまけ

CloudTrailからもアクセス元IPが確認できそうなので、上記確認を終えた後、データ保存用バケットを削除し、CloudTrailの出力イベントを確認してみました。

[ec2-user@ip-10-0-1-179 ~]$ date;aws s3 rb s3://testdata2020;date
2020年  2月  8日 土曜日 13:03:47 UTC
remove_bucket: testdata2020
2020年  2月  8日 土曜日 13:03:49 UTC

CloudTrailへは通常、API呼び出しから15分以内に出力されると思います。以下、バケット削除のログです。

ログの詳細は以下となります。

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAVWTKLCOCEJGM3AJXF:i-0ccfa4af412d1955c",
        "arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/test-bastion-role/i-0ccfa4af412d1955c",
        "accountId": "XXXXXXXXXXXX",
        "accessKeyId": "ASIAVWTKLCOCANH6L575",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "2020-02-08T12:54:02Z"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAVWTKLCOCEJGM3AJXF",
                "arn": "arn:aws:iam::XXXXXXXXXXXX:role/test-bastion-role",
                "accountId": "XXXXXXXXXXXX",
                "userName": "test-bastion-role"
            }
        }
    },
    "eventTime": "2020-02-08T13:03:48Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "DeleteBucket",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "10.0.1.179",
    "userAgent": "[aws-cli/1.16.102 Python/2.7.16 Linux/4.14.152-127.182.amzn2.x86_64 botocore/1.12.92]",
    "requestParameters": {
        "host": [
            "testdata2020.s3.ap-northeast-1.amazonaws.com"
        ],
        "bucketName": "testdata2020"
    },
    "responseElements": null,
    "additionalEventData": {
        "SignatureVersion": "SigV4",
        "CipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "AuthenticationMethod": "AuthHeader",
        "vpcEndpointId": "vpce-0126d8067633b9fc0"
    },
    "requestID": "C999CDB6A92BC4D3",
    "eventID": "ef9e6e39-6a3d-438a-80e6-b2a8c0da1fa8",
    "eventType": "AwsApiCall",
    "recipientAccountId": "XXXXXXXXXXXX",
    "vpcEndpointId": "vpce-0126d8067633b9fc0"
}

アクセス元IPにEC2のプライベートIP(10.0.1.179)が出力され、利用されたVPC Endpointも確認できました。

なお、設定を行えばS3オブジェクトのPutやDeleteといった操作もCloudTrailから確認することができます。オブジェクトレベルの記録を有効にする場合は、以下が参考になります。

さいごに

S3へのアクセスがインターネットゲートウェイ経由の場合、アクセス元はパブリックIPが記録され、VPC Endpoint経由ではプライベートIPが記録されました。CloudTrailではVPC EndpointのIDも確認できました。S3へのアクセスにVPC Endpointが利用されているか確認する際の参考になれば幸いです。

参考