

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

# 使用 Amazon S3 伺服器存取日誌來識別請求
<a name="using-s3-access-logs-to-identify-requests"></a>

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

**注意**  
若要識別 Amazon S3 請求，建議您使用 AWS CloudTrail 資料事件，而不是 Amazon S3 伺服器存取日誌。CloudTrail 資料事件更容易設定且包含更多資訊。如需詳細資訊，請參閱[使用 CloudTrail 來識別 Amazon S3 請求](cloudtrail-request-identification.md)。
根據您取得的存取請求數量多寡而定，分析日誌需要的資源或時間可能比使用 CloudTrail 資料事件更多。

**Topics**
+ [使用 Amazon Athena 查詢請求的存取日誌](#querying-s3-access-logs-for-requests)
+ [使用 Amazon S3 存取日誌來識別簽章第 2 版請求](#using-s3-access-logs-to-identify-sigv2-requests)
+ [使用 Amazon S3 存取日誌來識別物件存取請求](#using-s3-access-logs-to-identify-objects-access)

## 使用 Amazon Athena 查詢請求的存取日誌
<a name="querying-s3-access-logs-for-requests"></a>

您可以使用 Amazon Athena 搭配 Amazon S3 存取日誌來識別 Amazon S3 請求。

Amazon S3 會將伺服器存取日誌當作物件存放於 S3 儲存貯體中。使用可以在 Amazon S3 中分析日誌的工具通常比較容易。Athena 支援分析 S3 物件，還可用來查詢 Amazon S3 存取日誌。

**Example**  
以下範例示範如何在 Amazon Athena 中查詢 Amazon S3 伺服器存取日誌。請將下列範例中使用的 `user input placeholders` 取代為您自己的資訊。  
若要在 Athena 查詢中指定 Amazon S3 位置，您必須提供交付日誌所在的儲存貯體的 S3 URI。此 URI 必須包含下列格式的儲存貯體名稱和字首：`s3://amzn-s3-demo-bucket1-logs/prefix/`

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

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

   ```
   CREATE DATABASE s3_access_logs_db
   ```
**注意**  
最佳實務是在與 S3 儲存貯體 AWS 區域 相同的 中建立資料庫。

1. 在查詢編輯器中，執行類似如下的命令，在您於步驟 2 建立的資料庫中建立資料表結構描述。將 `s3_access_logs_db.mybucket_logs` 取代為您要為資料表指定的名稱。`STRING` 及 `BIGINT` 資料類型值為存取日誌屬性。您可以在 Athena 中查詢這些屬性。在 `LOCATION` 的部分，輸入稍早記下的 S3 儲存貯體和字首路徑。

------
#### [ Date-based partitioning ]

   ```
   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,
    `sourceregion` STRING)
    PARTITIONED BY (
      `timestamp` 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://bucket-name/prefix-name/account-id/region/source-bucket-name/'
    TBLPROPERTIES (
     'projection.enabled'='true', 
     'projection.timestamp.format'='yyyy/MM/dd', 
     'projection.timestamp.interval'='1', 
     'projection.timestamp.interval.unit'='DAYS', 
     'projection.timestamp.range'='2024/01/01,NOW', 
     'projection.timestamp.type'='date', 
     'storage.location.template'='s3://bucket-name/prefix-name/account-id/region/source-bucket-name/${timestamp}')
   ```

------
#### [ Non-date-based partitioning ]

   ```
   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,
     `sourceregion` 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/'
   ```

------

1. 在導覽窗格的 **Database (資料庫)** 下，選擇您的資料庫。

1. 在 **Tables (表格)** 底下，選擇資料表名稱旁的 **Preview table (預覽資料表)**。

   在 **Results (結果)** 窗格中，應出現伺服器存取日誌的資料，例如 `bucketowner`、`bucket`、`requestdatetime` 等。這表示您成功建立 Athena 資料表。您現在可以查詢 Amazon S3 伺服器存取日誌。

**Example — 顯示刪除物件的人與時間 (時間戳記、IP 位址和 IAM 使用者)**  

```
SELECT requestdatetime, remoteip, requester, key 
FROM s3_access_logs_db.mybucket_logs 
WHERE key = 'images/picture.jpg' AND operation like '%DELETE%';
```

**Example — 顯示 IAM 使用者執行的所有操作**  

```
SELECT * 
FROM s3_access_logs_db.mybucket_logs 
WHERE requester='arn:aws:iam::123456789123:user/user_name';
```

**Example — 顯示特定期間內針對某物件執行的所有操作**  

```
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');
```

**Example — 顯示特定時段有多少資料已傳輸至特定 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');
```

**Example - 尋找特定期間內 HTTP 5xx 錯誤的請求 ID**  

```
SELECT requestdatetime, key, httpstatus, errorcode, requestid, hostid 
FROM s3_access_logs_db.mybucket_logs
WHERE httpstatus like '5%' AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'
```

**注意**  
若要減少您保留日誌的時間，您可針對伺服器存取日誌儲存貯體建立 S3 生命週期組態。建立生命週期組態規則，以定期移除日誌檔。這麼做可降低 Athena 分析每個查詢時的資料量。如需詳細資訊，請參閱[設定儲存貯體的 S3 生命週期組態](how-to-set-lifecycle-configuration-intro.md)。

## 使用 Amazon S3 存取日誌來識別簽章第 2 版請求
<a name="using-s3-access-logs-to-identify-sigv2-requests"></a>

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

**注意**  
若要識別 Signature 第 2 版請求，我們建議您使用 AWS CloudTrail 資料事件，而不是 Amazon S3 伺服器存取日誌。CloudTrail 資料事件更容易設定，且包含的資訊比伺服器存取日誌更多。如需詳細資訊，請參閱[使用 CloudTrail 識別 Amazon S3 簽章第 2 版請求](cloudtrail-request-identification.md#cloudtrail-identification-sigv2-requests)。

**Example — 顯示傳送簽章第 2 版流量的所有請求者**  

```
SELECT requester, sigv, Count(sigv) as sigcount 
FROM s3_access_logs_db.mybucket_logs
GROUP BY requester, sigv;
```

## 使用 Amazon S3 存取日誌來識別物件存取請求
<a name="using-s3-access-logs-to-identify-objects-access"></a>

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

以下 Amazon Athena 查詢範例示範如何從伺服器存取日誌取得 Amazon S3 的所有 `PUT` 物件請求。

**Example — 顯示在特定期間內傳送 `PUT` 物件請求的所有申請者。**  

```
SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
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` 物件請求。

**Example — 顯示在特定期間內傳送 `GET` 物件請求的所有申請者。**  

```
SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
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 儲存貯體的所有匿名請求。

**Example — 顯示在特定時段期間向儲存貯體提出請求的所有匿名申請者。**  

```
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 許可遷移至適當的儲存貯體政策，並停用 ACL。在建立了這些儲存貯體政策之後，您可以針對這些儲存貯體停用 ACL。如需停用 ACL 的詳細資訊，請參閱 [停用 ACL 的先決條件](object-ownership-migrating-acls-prerequisites.md)。

**Example — 識別需要 ACL 進行授權的所有請求**  

```
SELECT bucket_name, requester, key, operation, aclrequired, requestdatetime
FROM s3_access_logs_db.mybucket_logs
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 物件的存取](cloudtrail-request-identification.md#cloudtrail-identification-object-access)。