使用識別 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://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/Region/yyyy/mm/dd

記錄的事件 CloudTrail 會以壓縮的 gzipped JSON 物件形式存放在 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_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;
範例 — 選取傳送簽章第 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://DOC-EXAMPLE-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://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/us-east-1/2019/02/19/' PARTITION (region= 'us-west-1', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/us-west-1/2019/02/19/' PARTITION (region= 'us-west-2', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/us-west-2/2019/02/19/' PARTITION (region= 'ap-southeast-1', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/ap-southeast-1/2019/02/19/' PARTITION (region= 'ap-southeast-2', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/ap-southeast-2/2019/02/19/' PARTITION (region= 'ap-northeast-1', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/ap-northeast-1/2019/02/19/' PARTITION (region= 'eu-west-1', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/eu-west-1/2019/02/19/' PARTITION (region= 'sa-east-1', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-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_cloudtrail_events_db.cloudtrail_table 取代為 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 進行授權,則 additionalEventData 中的 aclRequired 值為 Yes。如果不需要 ACL,則 aclRequired 不存在。您可以使用此資訊,將這些 ACL 許可遷移至適當的儲存貯體政策。在建立了這些儲存貯體政策之後,您可以針對這些儲存貯體停用 ACL。如需停用 ACL 的詳細資訊,請參閱 停用 ACL 的先決條件

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 存取日誌來識別物件存取請求