Amazon S3 アクセスログを使用したリクエストの識別
Amazon S3 アクセスログを使用して、Amazon S3 リクエストを識別できます。
注記
-
Amazon S3 リクエストを識別するには、Amazon S3 アクセスログの代わりに AWS CloudTrail データイベントを使用することをお勧めします。CloudTrail データイベントは、設定が容易で、より多くの情報が含まれています。詳細については、「CloudTrail を使用した Amazon S3 リクエストの識別」を参照してください。
-
取得したアクセスリクエスト数に応じて、ログの分析にリソースや時間がさらに必要になる場合があります。
トピック
Amazon Athena を使用したリクエストのアクセスログのクエリ
Amazon Athena を使って、Amazon S3 のアクセスログで、Amazon S3 リクエストを識別できます。
Amazon S3 は、サーバーのアクセスログを S3 バケット内のオブジェクトとして保存します。多くの場合、Amazon S3 のログを分析できるツールを使用する方が簡単です。Athena は S3 オブジェクトの分析をサポートしてしるため、Amazon S3 アクセスログに対してクエリを実行するのに使用できます。
例
次の例は、Amazon Athena で Amazon S3 サーバーアクセスログをクエリする方法を示しています。次の例を実行するには、
をユーザー自身の情報に置き換えます。user input placeholders
注記
Athena クエリで Amazon S3 のロケーションを指定するには、ログの送信先となるバケットの S3 URI を指定する必要があります。この URI には、次の形式でバケット名とプレフィックスを含める必要があります。s3://
amzn-s3-demo-bucket1
-logs/prefix
/
https://console.aws.amazon.com/athena/
で Athena コンソールを開きます。 -
クエリエディタで、次のようなコマンドを実行します。
は、データベースにつける名前に置き換えます。s3_access_logs_db
CREATE DATABASE
s3_access_logs_db
注記
ベストプラクティスとして、データベースは、S3 バケットと同じ AWS リージョンで作成することをお勧めします。
-
クエリエディタで次のようなコマンドを実行して、ステップ 2 で作成したデータベースでテーブルスキーマを作成します。
は、テーブルにつける名前に置き換えます。s3_access_logs_db.mybucket_logs
STRING
およびBIGINT
データ型の値はアクセスログのプロパティです。これらのプロパティは Athena でクエリできます。LOCATION
の場合は、前述のように S3 バケットとプレフィックスパスを入力します。CREATE EXTERNAL TABLE `
s3_access_logs_db.mybucket_logs
`( `bucketowner` STRING, `bucket_name` STRING, `requestdatetime` STRING, `remoteip` STRING, `requester` STRING, `requestid` STRING, `operation` STRING, `key` STRING, `request_uri` STRING, `httpstatus` STRING, `errorcode` STRING, `bytessent` BIGINT, `objectsize` BIGINT, `totaltime` STRING, `turnaroundtime` STRING, `referrer` STRING, `useragent` STRING, `versionid` STRING, `hostid` STRING, `sigv` STRING, `ciphersuite` STRING, `authtype` STRING, `endpoint` STRING, `tlsversion` STRING, `accesspointarn` STRING, `aclrequired` STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'input.regex'='([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://amzn-s3-demo-bucket1-logs/prefix/
' -
ナビゲーションペインにある、[データベース] で、データベースを選択します。
-
[テーブル] で、テーブル名の横にある、[Preview table (テーブルのプレビュー)] を選択します。
[結果] ペインに、サーバーアクセスログのデータ (
bucketowner
、bucket
、requestdatetime
など) が表示されます。これは、Athena テーブルが正常に作成されたことを意味します。これで Amazon S3 サーバーアクセスログのクエリを実行できるようになりました。
例 − 誰がいつオブジェクトを削除したか (タイムスタンプ、IP アドレス、および IAM ユーザー) を表示する
SELECT requestdatetime, remoteip, requester, key FROM
s3_access_logs_db.mybucket_logs
WHERE key = 'images/picture.jpg
' AND operation like '%DELETE%';
例 − IAM ユーザーによって実行されたすべてのオペレーションを表示する
SELECT * FROM
s3_access_logs_db.mybucket_logs
WHERE requester='arn:aws:iam::123456789123
:user/user_name
';
例 − 特定の期間にオブジェクトに対して実行されたすべてのオペレーションを表示する
SELECT * FROM
s3_access_logs_db.mybucket_logs
WHERE Key='prefix/images/picture.jpg
' AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2017-02-18:07:00:00
','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2017-02-18:08:00:00
','yyyy-MM-dd:HH:mm:ss');
例 − 特定の期間、特定の IP アドレスに送信されたデータの量を表示する
SELECT coalesce(SUM(bytessent), 0) AS bytessenttotal FROM
s3_access_logs_db.mybucket_logs
WHERE remoteip='192.0.2.1' AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2022-06-01
','yyyy-MM-dd') AND parse_datetime('2022-07-01
','yyyy-MM-dd');
注記
ログを保持する時間を短縮するために、サーバーアクセスログバケットの Amazon S3 ライフサイクル設定を作成できます。ライフサイクル設定ルールを作成して、定期的にログファイルを削除します。これにより、各クエリで Athena が分析するデータの量が減ります。詳細については、「バケットにライフサイクル設定を設定する」を参照してください。
Amazon S3 アクセスログを使用した Signature Version 2 リクエストの識別
Signature Version 2 の Amazon S3 サポートがオフになります (非推奨)。その後、Amazon S3 は署名バージョン 2 を使用するリクエストを受け入れず、すべてのリクエストに Signature Version 4 署名を使用する必要があります。Amazon S3 アクセスログを使用して、Signature Version 2 アクセスリクエストを識別できます。
注記
Signature Version 2 リクエストを識別するには、Amazon S3 アクセスログの代わりに AWS CloudTrail データイベントを使用することをお勧めします。CloudTrail データイベントは、サーバーアクセスログと比べ、設定が容易で、より多くの情報が含まれています。詳細については、「CloudTrail を使用した Amazon S3 Signature Version 2 リクエストの識別」を参照してください。
例 − 署名バージョン 2 トラフィックを送信しているすべてのリクエスタを表示する
SELECT requester, sigv, Count(sigv) as sigcount FROM
s3_access_logs_db.mybucket_logs
GROUP BY requester, sigv;
Amazon S3 アクセスログを使用したオブジェクトアクセスリクエストの識別
Amazon S3 サーバーアクセスログに対するクエリを使用して、GET
、PUT
、DELETE
などのオペレーションに対する Amazon S3 オブジェクトアクセスリクエストを識別し、それらのリクエストに関する詳細情報を確認することができます。
次の Amazon Athena クエリの例は、サーバーアクセスログから Amazon S3 に対するすべての PUT
オブジェクトリクエストを取得する方法を示しています。
例 − 一定期間内に PUT
オブジェクトリクエストを送信しているすべてのリクエスタを表示する
SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime FROM
s3_access_logs_db
WHERE operation='REST.PUT.OBJECT' AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42
','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42'
,'yyyy-MM-dd:HH:mm:ss')
次の Amazon Athena クエリの例は、サーバーアクセスログから Amazon S3 に対するすべての GET
オブジェクトリクエストを取得する方法を示しています。
例 − 一定期間内に GET
オブジェクトリクエストを送信しているすべてのリクエスタを表示する
SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime FROM
s3_access_logs_db
WHERE operation='REST.GET.OBJECT' AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42
','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42'
,'yyyy-MM-dd:HH:mm:ss')
次の Amazon Athena のクエリの例は、S3 バケットへのすべての匿名リクエストをサーバーアクセスログから取得する方法を示しています。
例 − 特定の期間にバケットにリクエストを行っているすべての匿名リクエスタを表示する
SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime FROM
s3_access_logs_db.mybucket_logs
WHERE requester IS NULL AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42
','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42'
,'yyyy-MM-dd:HH:mm:ss')
次の Amazon Athena のクエリは、承認のためにアクセスコントロールリスト (ACL) が必要な S3 バケットへのすべてのリクエストを特定する方法を示しています。この情報を使用して、これらの ACL 権限を適切なバケットポリシーに移行し、ACL を無効にすることができます。これらのバケットポリシーを作成したら、これらのバケットの ACL を無効にできます。ACL の無効化の詳細については、「ACL を無効にする前提条件。」を参照してください。
例 — 承認に ACL が必要なリクエストをすべて特定する
SELECT bucket_name, requester, key, operation, aclrequired, requestdatetime FROM
s3_access_logs_db
WHERE aclrequired = 'Yes' AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2022-05-10:00:00:00
','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2022-08-10:00:00:00'
,'yyyy-MM-dd:HH:mm:ss')
注記
-
ニーズに合わせられるように、必要に応じてデータ範囲を変更することができます。
-
このクエリの例は、セキュリティのモニタリングにも役立つ場合があります。予期しないまたは不正な IP アドレスやリクエスタからの
PutObject
またはGetObject
コールの結果を確認し、バケットへの匿名リクエストを特定できます。 -
このクエリでは、ログ記録が有効になった時間以降の情報のみ取得されます。
-
AWS CloudTrail ログを使用している場合は、「CloudTrail を使用した S3 オブジェクトへのアクセスの識別」を参照してください。