本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用識別 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,在中新增了用於增強安全稽核的新欄位
注意
CloudTrail Amazon S3 的事件將簽名版本包含在請求詳細資料中的金鑰名稱下的 'additionalEventData
. 若要在 Amazon S3 中針對物件 (例如GET
、PUT
和請求) 發出的DELETE
請求尋找簽名版本,您必須啟用 CloudTrail 資料事件。(此功能預設為關閉。)
AWS CloudTrail 是識別簽名版本 2 請求的首選方法。如果您使用 Amazon S3 伺服器存取日誌,請參閱 使用 Amazon S3 存取日誌來識別簽章第 2 版請求。
識別 Amazon S3 簽章第 2 版請求的 Athena 查詢範例
範例 — 選取所有簽章第 2 版事件,並僅列印 EventTime
、S3_Action
、Request_Parameters
、Region
、SourceIP
和 UserAgent
在下列 Athena 查詢中,會將
取代為 Athena 詳細資訊,並視需要提高或移除限制。s3_cloudtrail_events_db.cloudtrail_table
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 物件存取請求 DeleteObject
PutObject
,並探索有關這些請求的其他資訊。
下列範例顯示如何從 AWS CloudTrail 事PUT
件日誌取得 Amazon S3 的所有物件請求。
識別 Amazon S3 物件存取請求的 Athena 查詢範例
在下列 Athena 查詢範例中,會將
取代為 Athena 詳細資訊,並視需要修改日期範圍。s3_cloudtrail_events_db.cloudtrail_table
範例 — 選取具有 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
'
範例 — 選取具有 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
'
範例 — 選取特定期間儲存貯體的所有匿名申請事件,並僅列印 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
'
範例 — 識別需要 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 地址或申請者的
PutObject
或GetObject
呼叫的結果,以及識別對您儲存貯體的任何匿名請求。 -
此查詢只會擷取啟用日誌之後的資訊。
如果您使用 Amazon S3 伺服器存取日誌,請參閱 使用 Amazon S3 存取日誌來識別物件存取請求。