使用識別 Amazon S3 請求 CloudTrail - Amazon Simple Storage Service

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

使用識別 Amazon S3 請求 CloudTrail

在 Amazon S3 中,您可以使用 AWS CloudTrail 事件日誌識別請求。 AWS CloudTrail 這是識別 Amazon S3 請求的偏好方式,但如果您使用 Amazon S3 伺服器存取日誌,請參閱使用 Amazon S3 伺服器存取日誌來識別請求

在日誌中識別對 Amazon S3 發出的 CloudTrail 請求

設定將事件傳遞 CloudTrail 到儲存貯體之後,您應該開始看到物件移至 Amazon S3 主控台上的目的地儲存貯體。格式如下所示:

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

記錄的事件 CloudTrail 會以壓縮的gzippedJSON物件形式存放在 S3 儲存貯體中。為了有效地找到請求,您應該使用 Amazon Athena 等服務來索引和查詢 CloudTrail 日誌。

如需 CloudTrail 和 Athena 的詳細資訊,請參Amazon Athena 使用者指南中的使用分割投影在 Athena 中建立 AWS CloudTrail 日誌表格

使用識別 Amazon S3 簽名版本 2 請求 CloudTrail

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

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

如需詳細資訊,請參閱公告: AWS CloudTrail 針對 Amazon S3,在中新增了用於增強安全稽核的新欄位 AWS re:Post。

注意

CloudTrail Amazon S3 的事件將簽名版本包含在請求詳細資料中的金鑰名稱下的 'additionalEventData. 若要在 Amazon S3 中針對物件 (例如GETPUT和請求) 發出的DELETE請求尋找簽名版本,您必須啟用 CloudTrail 資料事件。(此功能預設為關閉。)

AWS CloudTrail 是識別簽名版本 2 請求的首選方法。如果您使用 Amazon S3 伺服器存取日誌,請參閱 使用 Amazon S3 存取日誌來識別簽章第 2 版請求

識別 Amazon S3 簽章第 2 版請求的 Athena 查詢範例

範例 — 選取所有簽章第 2 版事件,並僅列印 EventTimeS3_ActionRequest_ParametersRegionSourceIPUserAgent

在下面的 Athena 查詢中,替換 s3 雲路 _ 事件資料庫雲路 _ 資料表 與您的 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;
範例 — 選取傳送簽章第 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 版資料

如果您要查詢的資料量很多,您可以建立分割資料表來降低 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

使用識別 S3 物件的存取 CloudTrail

您可以使用 AWS CloudTrail 事件日誌來識別資料事件 (例如GetObject、和) 的 Amazon S3 物件存取請求 DeleteObjectPutObject,並探索有關這些請求的其他資訊。

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

識別 Amazon S3 物件存取請求的 Athena 查詢範例

在下列 Athena 查詢範例中,請取代 s3 雲路 _ 事件資料庫雲路 _ 資料表 使用您的 Athena 詳細信息,並根據需要修改日期範圍。

範例 — 選取具有 PUT 物件存取請求的所有事件,並僅列印 EventTimeEventSourceSourceIPUserAgentBucketNameobjectUserARN
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'
範例 — 選取具有 GET 物件存取請求的所有事件,並僅列印 EventTimeEventSourceSourceIPUserAgentBucketNameobjectUserARN
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'
範例 — 選取特定期間儲存貯體的所有匿名申請事件,並僅列印 EventTimeEventNameEventSourceSourceIPUserAgentBucketNameUserARNAccountID
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'
範例 — 識別需要授權ACL的所有請求

以下 Amazon Athena 查詢範例顯示如何識別 S3 儲存貯體的所有請求,這些請求需要存取控制清單 (ACL) 才能進行授權。如果請求ACL需要授權,則中的aclRequiredadditionalEventDataYes。如果沒有ACLs被要求,aclRequired則不存在。您可以使用此資訊將這些ACL權限移轉至適當的儲存貯體政策。建立這些值區政策之後,您可以停ACLs用這些值區。如需停用的詳細資訊ACLs,請參閱停用的先決條件 ACLs

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

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

如果您使用 Amazon S3 伺服器存取日誌,請參閱 使用 Amazon S3 存取日誌來識別物件存取請求