Identifizieren von Amazon-S3-Anfragen mit CloudTrail - Amazon Simple Storage Service

Identifizieren von Amazon-S3-Anfragen mit CloudTrail

In Amazon S3 können Sie Anfragen mithilfe eines AWS CloudTrail-Ereignisprotokolls identifizieren. AWS CloudTrail ist die bevorzugte Methode zur Identifizierung von Amazon-S3-Anfragen, aber wenn Sie Amazon-S3-Serverzugriffs-Protokolle verwenden, siehe Verwenden von Amazon-S3-Serverzugriffsprotokollen zur Identifizierung von Anforderungen.

Identifizieren von Anfragen an Amazon S3 in einem CloudTrail-Protokoll

Nachdem CloudTrail zum Senden von Ereignissen an einen Bucket eingerichtet wurde, sollten Sie an der Amazon-S3-Konsole beobachten können, wie Objekte in den Ziel-Bucket gelangen. Diese sind folgendermaßen formatiert:

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

Von CloudTrail protokollierte Ereignisse werden in komprimierten gzipped JSON-Objekten in Ihrem S3-Bucket gespeichert. Um Anfragen effizient zu finden, sollten Sie einen Service wie Amazon Athena verwenden, um die CloudTrail-Protokolle zu indizieren und abzufragen.

Weitere Informationen über CloudTrail und Athena finden Sie unter Erstellen der Tabelle für AWS CloudTrail Protokolle in Athena mithilfe der Partitionsprojektion im Amazon-Athena-Benutzerhandbuch.

Identifizieren von Anforderungen von Amazon S3 Signature Version 2 mit CloudTrail

Sie können ein CloudTrail-Ereignisprotokoll verwenden, um zu ermitteln, mit welcher API Signature Version eine Anforderung in Amazon S3 signiert wurde. Diese Funktion ist wichtig, weil die Unterstützung für Signature Version 2 deaktiviert wird (veraltet). Danach akzeptiert Amazon S3 keine Anforderungen mit Signature Version 2 mehr, alle Anforderungen müssen also mit Signature Version 4 signiert werden.

Wir empfehlen dringend, CloudTrail zu verwenden, um gegebenenfalls Workflows zu ermitteln, die mit Signature Version 2 signieren. Korrigieren Sie diese Workflows, indem Sie die betreffenden Bibliotheken und den Code so aktualisieren, dass mittels Signature Version 4 signiert wird. Dadurch können Beeinträchtigungen der geschäftlichen Prozesse werden.

Weitere Informationen finden Sie unter Ankündigung: AWS CloudTrail für Amazon S3 fügt neue Felder für verbesserte Sicherheitsüberprüfung hinzu in AWS re:Post.

Anmerkung

CloudTrail-Ereignisse für Amazon S3 enthalten die Signature Version in den Anforderungsdetails unter dem Schlüsselnamen von additionalEventData. Um die Signature Version von Anforderungen zu ermitteln, die an Objekte in Amazon S3 gerichtet wurden (z. B. GET, PUT und DELETE) müssen Sie CloudTrail-Datenereignisse aktivieren. (Diese Option ist standardmäßig deaktiviert.)

AWS CloudTrail ist die bevorzugte Methode zur Identifizierung von Signature Version 2-Anforderungn. Wenn Sie Zugriffsprotokolle von Amazon S3 Server verwenden, lesen Sie Identifizieren von Signature-Version-2-Anforderungen mittels Amazon-S3-Zugriffsprotokollen.

Athena-Abfragebeispiele zum Identifizieren von Anforderungen zur Amazon S3 Signature Version 2

Beispiel – Wählen Sie alle Signature-Version-2-Ereignisse aus und drucken Sie nur EventTime, S3_Action, Request_Parameters, Region, SourceIP und UserAgent

Ersetzen Sie in der folgenden Athena-Abfrage s3_cloudtrail_events_db.cloudtrail_table durch Ihre Athena-Details und erhöhen oder entfernen Sie das Limit nach Bedarf.

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;
Beispiel – Alle Anforderer auswählen, die Signature Version 2-Datenverkehr senden

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

Partitionieren von Signature Version 2-Daten

Wenn Sie über eine große Datenmenge verfügen, die abgefragt werden muss, können Sie Kosten und Laufzeit für Athena reduzieren, indem Sie eine partitionierte Tabelle erstellen.

Erstellen Sie zu diesem Zweck folgendermaßen eine neue Tabelle mit Partitionen.

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/';

Erstellen Sie dann die einzelnen Partitionen. Sie können keine Resultate aus noch nicht erstellten Daten ermitteln.

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/';

Anschließend können Sie die Anforderung basierend auf diesen Partitionen erstellen und müssen nicht mehr den gesamten Bucket laden.

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

Identifizieren des Zugriffs auf S3-Objekte mit CloudTrail

Sie können Ihre AWS CloudTrail-Ereignisprotokolle verwenden, um Amazon-S3-Objektzugriffsanforderungen für Datenereignisse wie GetObject, DeleteObject und PutObject zu identifizieren und zusätzliche Informationen zu diesen Anforderungen zu ermitteln.

Anmerkung

Wenn Sie Datenaktivitäten mit AWS CloudTrail protokollieren, umfasst der Ereignisdatensatz für ein Amazon S3-DeleteObjects-Datenereignis sowohl das DeleteObjects-Ereignis als auch ein DeleteObject-Ereignis für jedes Objekt, das im Rahmen dieses Vorgangs gelöscht wurde. Sie können die zusätzliche Sichtbarkeit gelöschter Objekte aus dem Ereignisdatensatz ausschließen. Weitere Informationen finden Sie unter AWS CLIProtokollieren von Datenereignissen für Trails im AWS CloudTrail-Benutzerhandbuch.

Das folgende Beispiel zeigt, wie alle PUT-Objektanforderungen für Amazon S3 aus einem AWS CloudTrail-Ereignisprotokoll abgerufen werden.

Athena-Abfragebeispiele zur Identifizierung von Amazon-S3-Objektzugriffsanfragen

Ersetzen Sie in den folgenden Athena-Beispielabfragen s3_cloudtrail_events_db.cloudtrail_table durch Ihre Athena-Details und ändern Sie den Datumsbereich nach Bedarf.

Beispiel – Wählen Sie alle Ereignisse aus, für die PUT-Objektzugriffsanforderungen vorliegen, und drucken Sie nur EventTime, EventSource, SourceIP, UserAgent, BucketName, object und 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'
Beispiel – Wählen Sie alle Ereignisse aus, für die GET-Objektzugriffsanforderungen vorliegen, und drucken Sie nur EventTime, EventSource, SourceIP, UserAgent, BucketName, object und 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'
Beispiel – Wählen Sie alle anonymen Anforderungsereignisse für einen Bucket in einem bestimmten Zeitraum aus und drucken Sie nur EventTime, EventName, EventSource, SourceIP, UserAgent, BucketName, UserARN und 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'
Beispiel – Identifizieren Sie alle Anforderungen, für die eine ACL zur Autorisierung erforderlich war

Das folgende Amazon-Athena-Abfragebeispiel zeigt, wie alle Anforderungen für Ihre S3-Buckets identifiziert werden, für die eine Zugriffssteuerungsliste (ACL) zur Autorisierung erforderlich war. Wenn für die Anforderung eine ACL zur Autorisierung erforderlich war, lautet der aclRequired-Wert in additionalEventData Yes. Wenn keine ACLs erforderlich waren, ist aclRequired nicht vorhanden. Sie können diese Informationen verwenden, um diese ACL-Berechtigungen zu den entsprechenden Bucket-Richtlinien zu migrieren. Nachdem Sie diese Bucket-Richtlinien erstellt haben, können Sie ACLs für diese Buckets deaktivieren. Weitere Informationen über das Deaktivieren von ACLs finden Sie unter Voraussetzungen für die Deaktivierung von 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'
Anmerkung
  • Diese Abfragebeispiele können auch für die Sicherheitsüberwachung nützlich sein. Sie können die Ergebnisse auf PutObject- oder GetObject-Aufrufe von unerwarteten oder nicht autorisierten IP-Adressen oder Anforderern und zum Identifizieren anonymer Anforderungen an Ihre Buckets prüfen.

  • Diese Abfrage ruft nur Informationen von der Zeit ab, zu der die Protokollierung aktiviert wurde.

Wenn Sie Amazon-S3-Server-Zugriffsprotokolle verwenden, lesen Sie Identifizieren von Objektzugriffsanforderungen mittels Amazon-S3-Zugriffsprotokollen.