使用 Amazon S3 伺服器存取日誌來識別請求 - Amazon Simple Storage Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Amazon S3 伺服器存取日誌來識別請求

您可以使用 Amazon S3 伺服器存取日誌來識別 Amazon S3 請求。

注意
  • 若要識別 Amazon S3 請求,我們建議您使用 AWS CloudTrail 資料事件而非 Amazon S3 伺服器存取日誌。 CloudTrail 數據事件更容易設置並包含更多信息。如需詳細資訊,請參閱使用識別 Amazon S3 請求 CloudTrail

  • 根據您收到的存取要求數量,分析記錄可能需要比使用資 CloudTrail 料事件更多的資源或時間。

使用 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 位置,您必須URI為將日誌交付到的儲存貯體提供 S3。其中URI必須包含下列格式的值區名稱和前置詞:s3://amzn-s3-demo-bucket1-logs/prefix/

  1. https://console.aws.amazon.com/athena/ 中開啟 Athena 主控台。

  2. 在查詢編輯器中,執行類似如下的命令。將 s3_access_logs_db 取代為您要為資料庫指定的名稱。

    CREATE DATABASE s3_access_logs_db
    注意

    這是在同一個數據庫中創建數據庫的最佳實踐 AWS 區域 作為您的 S3 存儲桶。

  3. 在查詢編輯器中,執行類似如下的命令,在您於步驟 2 建立的資料庫中建立資料表結構描述。將 s3_access_logs_db.mybucket_logs 取代為您要為資料表指定的名稱。STRINGBIGINT 資料類型值為存取日誌屬性。您可以在 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/'
  4. 在導覽窗格的 Database (資料庫) 下,選擇您的資料庫。

  5. Tables (表格) 底下,選擇資料表名稱旁的 Preview table (預覽資料表)

    Results (結果) 窗格中,應出現伺服器存取日誌的資料,例如 bucketownerbucketrequestdatetime 等。這表示您成功建立 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');
注意

若要減少您保留日誌的時間,您可針對伺服器存取日誌儲存貯體建立 S3 生命週期組態。建立生命週期組態規則,以定期移除日誌檔。這麼做可降低 Athena 分析每個查詢時的資料量。如需詳細資訊,請參閱在值區上設定生命週期組態

使用 Amazon S3 存取日誌來識別簽章第 2 版請求

Amazon S3 將停止支援簽章第 2 版 (已淘汰)。之後,Amazon S3 將不再接受使用簽章第 2 版的請求,所有請求都必須使用簽章第 4 版來簽署。您可以使用 Amazon S3 存取日誌來識別簽章第 2 版請求。

注意

若要識別簽章版本 2 請求,我們建議您使用 AWS CloudTrail 資料事件而非 Amazon S3 伺服器存取日誌。 CloudTrail 資料事件比伺服器存取記錄更容易設定,而且包含更多資訊。如需詳細資訊,請參閱使用識別 Amazon S3 簽名版本 2 請求 CloudTrail

範例 — 顯示傳送簽章第 2 版流量的所有請求者
SELECT requester, sigv, Count(sigv) as sigcount FROM s3_access_logs_db.mybucket_logs GROUP BY requester, sigv;

使用 Amazon S3 存取日誌來識別物件存取請求

您可以在 Amazon S3 伺服器存取日誌上使用查詢,以識別 Amazon S3 物件存取請求,包括 GETPUTDELETE 等操作,並探索有關這些請求的詳細資訊。

以下 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 查詢顯示如何識別 S3 儲存貯體的所有請求,這些請求需要存取控制清單 (ACL) 才能進行授權。您可以使用此資訊將這些ACL權限移轉至適當的儲存貯體政策並停用ACLs。建立這些值區政策之後,您可以停ACLs用這些值區。如需停用的詳細資訊ACLs,請參閱停用的先決條件 ACLs

範例 — 識別需要授權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 地址或申請者的 PutObjectGetObject 呼叫的結果,以及識別對您儲存貯體的任何匿名請求。

  • 此查詢只會擷取啟用日誌之後的資訊。

  • 如果您正在使用 AWS CloudTrail 日誌,請參閱使用識別 S3 物件的存取 CloudTrail