

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

# 使用 CloudTrail 來識別 Amazon S3 請求
<a name="cloudtrail-request-identification"></a>

在 Amazon S3 中，您可以使用 AWS CloudTrail 事件日誌來識別請求。 AWS CloudTrail 是識別 Amazon S3 請求的偏好方式，但如果您使用的是 Amazon S3 伺服器存取日誌，請參閱 [使用 Amazon S3 伺服器存取日誌來識別請求](using-s3-access-logs-to-identify-requests.md)。

**Topics**
+ [在 CloudTrail 日誌中識別對 Amazon S3 提出的請求](#identify-S3-requests-using-in-CTlog)
+ [使用 CloudTrail 識別 Amazon S3 簽章第 2 版請求](#cloudtrail-identification-sigv2-requests)
+ [使用 CloudTrail 來識別對 S3 物件的存取](#cloudtrail-identification-object-access)

## 在 CloudTrail 日誌中識別對 Amazon S3 提出的請求
<a name="identify-S3-requests-using-in-CTlog"></a>

將 CloudTrail 設定為將事件交付至儲存貯體後，您在 Amazon S3 主控台上應該會開始看到物件出現在目的地儲存貯體。格式如下所示：

`s3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/Region/yyyy/mm/dd` 

CloudTrail 記錄的事件會壓縮為 gzipped JSON 物件存放在 S3 儲存貯體中。為有效率地尋找請求，您應該使用 Amazon Athena 之類的服務，對 CloudTrail 日誌編製索引並進行查詢。

如需 CloudTrail 和 Athena 的詳細資訊，請參閱《*Amazon Athena * [Athena 使用者指南》中的使用分割區投影在 Athena 中建立 AWS CloudTrail 日誌的資料表](https://docs.aws.amazon.com/athena/latest/ug/cloudtrail-logs.html#create-cloudtrail-table-partition-projection)。

## 使用 CloudTrail 識別 Amazon S3 簽章第 2 版請求
<a name="cloudtrail-identification-sigv2-requests"></a>

您可以使用 CloudTrail 事件日誌，識別用於在 Amazon S3 中簽署請求的 API 簽章版本。此功能相當重要，因為對 Signature 第 2 版的支援即將結束 (已淘汰)。之後，Amazon S3 將不再接受使用簽章第 2 版的請求，所有請求都必須使用*簽章第 4 版*來簽署。

我們「強烈」**建議您使用 CloudTrail 來協助判斷是否有任何工作流程是使用簽章第 2 版簽署。透過將程式庫和程式碼升級為改用 Signature 第 4 版來修補這些工作流程，避免對您的業務造成影響。

如需詳細資訊，請參閱[公告： AWS CloudTrail 適用於 Amazon S3 新增新欄位以進行增強型安全稽核](https://forums.aws.amazon.com/ann.jspa?annID=6551) AWS re:Post。

**注意**  
Amazon S3 的 CloudTrail 事件在請求詳細資訊中的金鑰名稱 `additionalEventData` 之下包含簽章版本。若要在對 Amazon S3 中物件提出的請求 (例如 `GET`、`PUT` 和 `DELETE` 請求) 上尋找簽章版本，您必須啟用 CloudTrail 資料事件。(此功能預設為關閉。)

AWS CloudTrail 是識別 Signature 第 2 版請求的偏好方法。如果您使用 Amazon S3 伺服器存取日誌，請參閱 [使用 Amazon S3 存取日誌來識別簽章第 2 版請求](using-s3-access-logs-to-identify-requests.md#using-s3-access-logs-to-identify-sigv2-requests)。

**Topics**
+ [識別 Amazon S3 簽章第 2 版請求的 Athena 查詢範例](#ct-examples-identify-sigv2-requests)
+ [分割 Signature 第 2 版資料](#partitioning-sigv2-data)

### 識別 Amazon S3 簽章第 2 版請求的 Athena 查詢範例
<a name="ct-examples-identify-sigv2-requests"></a>

**Example — 選取所有簽章第 2 版事件，並僅列印 `EventTime`、`S3_Action`、`Request_Parameters`、`Region`、`SourceIP` 和 `UserAgent`**  
在下列 Athena 查詢中，會將 *`s3_cloudtrail_events_db.cloudtrail_table`* 取代為 Athena 詳細資訊，並視需要提高或移除限制。  

```
SELECT EventTime, EventName as S3_Action, requestParameters as Request_Parameters, awsregion as AWS_Region, sourceipaddress as Source_IP, useragent as User_Agent
FROM s3_cloudtrail_events_db.cloudtrail_table
WHERE eventsource='s3.amazonaws.com'
AND json_extract_scalar(additionalEventData, '$.SignatureVersion')='SigV2'
LIMIT 10;
```

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

```
SELECT useridentity.arn, Count(requestid) as RequestCount
FROM s3_cloudtrail_events_db.cloudtrail_table
WHERE eventsource='s3.amazonaws.com'
    and json_extract_scalar(additionalEventData, '$.SignatureVersion')='SigV2'
Group by useridentity.arn
```

### 分割 Signature 第 2 版資料
<a name="partitioning-sigv2-data"></a>

如果您要查詢的資料量很多，您可以建立分割資料表來降低 Athena 的成本與執行時間。

做法為建立含分割區的新資料表，如下所示。

```
   CREATE EXTERNAL TABLE s3_cloudtrail_events_db.cloudtrail_table_partitioned(
        eventversion STRING,
        userIdentity STRUCT<
            type:STRING,
            principalid:STRING,
            arn:STRING,
            accountid:STRING,
            invokedby:STRING,
            accesskeyid:STRING,
            userName:STRING,
         sessioncontext:STRUCT<
                    attributes:STRUCT< 
                    mfaauthenticated:STRING,
                    creationdate:STRING>,
                    sessionIssuer:STRUCT<
                    type:STRING,
                    principalId:STRING,
                    arn:STRING,
                    accountId:STRING,
                    userName:STRING>
                >
             >,
        eventTime STRING,
        eventSource STRING,
        eventName STRING,
        awsRegion STRING,
        sourceIpAddress STRING,
        userAgent STRING,
        errorCode STRING,
        errorMessage STRING,
        requestParameters STRING,
        responseElements STRING,
        additionalEventData STRING,
        requestId STRING,
        eventId STRING,
        resources ARRAY<STRUCT<ARN:STRING,accountId: STRING,type:STRING>>, 
        eventType STRING,
        apiVersion STRING,
        readOnly STRING,
        recipientAccountId STRING,
        serviceEventDetails STRING,
        sharedEventID STRING,
        vpcEndpointId STRING
    )   
    PARTITIONED BY (region string, year string, month string, day string)
    ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
    STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/';
```

接著，請個別建立分割區。您無法從未建立的日期取得結果。

```
ALTER TABLE s3_cloudtrail_events_db.cloudtrail_table_partitioned ADD
    PARTITION (region= 'us-east-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/us-east-1/2019/02/19/'
    PARTITION (region= 'us-west-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/us-west-1/2019/02/19/'
    PARTITION (region= 'us-west-2', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/us-west-2/2019/02/19/'
    PARTITION (region= 'ap-southeast-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/ap-southeast-1/2019/02/19/'
    PARTITION (region= 'ap-southeast-2', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/ap-southeast-2/2019/02/19/'
    PARTITION (region= 'ap-northeast-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/ap-northeast-1/2019/02/19/'
    PARTITION (region= 'eu-west-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/eu-west-1/2019/02/19/'
    PARTITION (region= 'sa-east-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/sa-east-1/2019/02/19/';
```

您就可以根據這些分割區來提出請求，而不須載入整個儲存貯體。

```
SELECT useridentity.arn,
Count(requestid) AS RequestCount
FROM s3_cloudtrail_events_db.cloudtrail_table_partitioned
WHERE eventsource='s3.amazonaws.com'
AND json_extract_scalar(additionalEventData, '$.SignatureVersion')='SigV2'
AND region='us-east-1'
AND year='2019'
AND month='02'
AND day='19'
Group by useridentity.arn
```

## 使用 CloudTrail 來識別對 S3 物件的存取
<a name="cloudtrail-identification-object-access"></a>

您可以使用 AWS CloudTrail 事件日誌來識別 `GetObject`、 `DeleteObject`和 等資料事件的 Amazon S3 物件存取請求`PutObject`，並探索這些請求的其他資訊。

**注意**  
如果您使用 記錄資料活動 AWS CloudTrail，則 Amazon S3 `DeleteObjects`資料事件的事件記錄會同時包含該操作中刪除的每個物件`DeleteObjects`的事件和`DeleteObject`事件。您可以從事件記錄中排除已刪除物件的其他可見性。如需詳細資訊，請參閱《AWS CloudTrail 使用者指南》**中的[篩選資料事件的AWS CLI 範例](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/filtering-data-events.html#filtering-data-events-deleteobjects)。

下列範例顯示如何從 AWS CloudTrail 事件日誌取得 Amazon S3 的所有`PUT`物件請求。

**Topics**
+ [識別 Amazon S3 物件存取請求的 Athena 查詢範例](#ct-examples-identify-object-access-requests)

### 識別 Amazon S3 物件存取請求的 Athena 查詢範例
<a name="ct-examples-identify-object-access-requests"></a>

在下列 Athena 查詢範例中，會將 *`s3_cloudtrail_events_db.cloudtrail_table`* 取代為 Athena 詳細資訊，並視需要修改日期範圍。

**Example — 選取具有 `PUT` 物件存取請求的所有事件，並僅列印 `EventTime`、`EventSource`、`SourceIP`、`UserAgent`、`BucketName`、`object` 和 `UserARN`**  

```
SELECT
  eventTime, 
  eventName, 
  eventSource, 
  sourceIpAddress, 
  userAgent, 
  json_extract_scalar(requestParameters, '$.bucketName') as bucketName, 
  json_extract_scalar(requestParameters, '$.key') as object,
  userIdentity.arn as userArn
FROM
  s3_cloudtrail_events_db.cloudtrail_table
WHERE
  eventName = 'PutObject'
  AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
```

**Example — 選取具有 `GET` 物件存取請求的所有事件，並僅列印 `EventTime`、`EventSource`、`SourceIP`、`UserAgent`、`BucketName`、`object` 和 `UserARN`**  

```
SELECT
  eventTime, 
  eventName, 
  eventSource, 
  sourceIpAddress, 
  userAgent, 
  json_extract_scalar(requestParameters, '$.bucketName') as bucketName, 
  json_extract_scalar(requestParameters, '$.key') as object,
  userIdentity.arn as userArn
FROM
  s3_cloudtrail_events_db.cloudtrail_table
WHERE
  eventName = 'GetObject'
  AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
```

**Example — 選取特定期間儲存貯體的所有匿名申請事件，並僅列印 `EventTime`、`EventName`、`EventSource`、`SourceIP`、`UserAgent`、`BucketName`、`UserARN` 和 `AccountID`**  

```
SELECT
  eventTime, 
  eventName, 
  eventSource, 
  sourceIpAddress, 
  userAgent, 
  json_extract_scalar(requestParameters, '$.bucketName') as bucketName, 
  userIdentity.arn as userArn,
  userIdentity.accountId
FROM
  s3_cloudtrail_events_db.cloudtrail_table
WHERE
  userIdentity.accountId = 'anonymous'
  AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
```

**Example — 識別需要 ACL 進行授權的所有請求**  
 下列 Amazon Athena 查詢範例示範如何識別對 S3 儲存貯體提出且需要存取控制清單 (ACL) 進行授權的所有請求。如果請求需要 ACL 進行授權，則 `additionalEventData` 中的 `aclRequired` 值為 `Yes`。如果不需要 ACL，則 `aclRequired` 不存在。您可以使用此資訊，將這些 ACL 許可遷移至適當的儲存貯體政策。在建立了這些儲存貯體政策之後，您可以針對這些儲存貯體停用 ACL。如需停用 ACL 的詳細資訊，請參閱 [停用 ACL 的先決條件](object-ownership-migrating-acls-prerequisites.md)。  

```
SELECT
  eventTime, 
  eventName, 
  eventSource, 
  sourceIpAddress, 
  userAgent, 
  userIdentity.arn as userArn,
  json_extract_scalar(requestParameters, '$.bucketName') as bucketName,
  json_extract_scalar(requestParameters, '$.key') as object,
  json_extract_scalar(additionalEventData, '$.aclRequired') as aclRequired
FROM 
  s3_cloudtrail_events_db.cloudtrail_table
WHERE
  json_extract_scalar(additionalEventData, '$.aclRequired') = 'Yes'
  AND eventTime BETWEEN '2022-05-10T00:00:00Z' and '2022-08-10T00:00:00Z'
```

**注意**  
對安全監控時而言，這些查詢範例也可能相當實用。您可以檢閱來自意外或未授權 IP 位址或申請者的 `PutObject` 或 `GetObject` 呼叫的結果，以及識別對您儲存貯體的任何匿名請求。
 此查詢只會擷取啟用日誌之後的資訊。

如果您使用 Amazon S3 伺服器存取日誌，請參閱 [使用 Amazon S3 存取日誌來識別物件存取請求](using-s3-access-logs-to-identify-requests.md#using-s3-access-logs-to-identify-objects-access)。