Utilizzo di CloudTrail per identificare le richieste di Amazon S3 - Amazon Simple Storage Service

Utilizzo di CloudTrail per identificare le richieste di Amazon S3

In Amazon S3, è possibile identificare le richieste utilizzando un log di eventi AWS CloudTrail. AWS CloudTrail è il modo più indicato per identificare le richieste Amazon S3, ma se si utilizzano i log di accesso al server Amazon S3, consultare Utilizzo dei log degli accessi Amazon S3 per identificare le richieste.

Identificazione delle richieste effettuate ad Amazon S3 in un log CloudTrail

Gli eventi registrati da CloudTrail vengono archiviati in un oggetto JSON in formato GZipped compresso nel bucket S3. Per individuare in modo efficiente le richieste, è consigliabile usare un servizio come Amazon Athena per indicizzare ed eseguire query nei log CloudTrail. Per ulteriori informazioni su CloudTrail e Athena, consulta Esecuzione di query sui log di AWS CloudTrail nella Guida per l'utente di Amazon Athena.

Utilizzo di Athena con i log CloudTrail

Una volta configurato CloudTrail per distribuire gli eventi in un bucket, si dovrebbe visualizzare il passaggio degli oggetti al bucket di destinazione sulla console Amazon S3. Questi sono formattati come riportato di seguito:

s3://myawsexamplebucket1/AWSLogs/111122223333/CloudTrail/Region/yyyy/mm/dd

Esempio - Utilizzare Athena per eseguire query sui log di eventi CloudTrail per richieste specifiche

Individuare i log di eventi CloudTrail:

s3://myawsexamplebucket1/AWSLogs/111122223333/CloudTrail/us-east-2/2019/04/14

Con i log di eventi CloudTrail, è ora possibile creare una tabella e un database Athena per eseguire query nel modo seguente:

  1. Aprire la console Athena all'indirizzo https://console.aws.amazon.com/athena/.

  2. Modifica la Regione AWS in modo che sia la stessa del bucket S3 di destinazione CloudTrail.

  3. Nella finestra di query creare un database Athena per gli eventi CloudTrail.

    CREATE DATABASE s3_cloudtrail_events_db
  4. Usare la query seguente per creare una tabella per tutti gli eventi CloudTrail nel bucket. Modifica il nome del bucket CloudTrail_myawsexamplebucket1 con il nome del tuo bucket. Fornisci anche AWS_account_ID CloudTrail usato nel bucket.

    CREATE EXTERNAL TABLE s3_cloudtrail_events_db.cloudtrail_myawsexamplebucket1_table( 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 ) ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://myawsexamplebucket1/AWSLogs/111122223333/';
  5. Testare Athena per assicurarsi che la query funzioni.

    SELECT * FROM s3_cloudtrail_events_db.cloudtrail_myawsexamplebucket1_table WHERE eventsource='s3.amazonaws.com' LIMIT 2;

Identificazione delle richieste di Amazon S3 Signature versione 2 utilizzando CloudTrail

Puoi utilizzare un log di eventi CloudTrail per identificare la versione della firma dell'API utilizzata per firmare una richiesta in Amazon S3. Questa possibilità è importante perché il supporto di Signature Version 2 sta per essere disattivato perché obsoleto. Dopo, Amazon S3 non accetterà più le richieste che usano Signature Version 2 e tutte le richieste dovranno usare la firma Signature Version 4.

Consigliamo vivamente di usare CloudTrail per stabilire se qualcuno dei flussi di lavoro usa la firma Signature Version 2. Nel caso, correggili aggiornando le librerie e il codice in modo che utilizzino invece Signature Version 4 per evitare qualsiasi impatto sul business.

Per ulteriori informazioni, consulta Avviso: AWS CloudTrail per Amazon S3 aggiunge nuovi campi per audit di sicurezza migliorato nei forum di discussione AWS.

Nota

Gli eventi CloudTrail per Amazon S3 includono la versione della firma nei dettagli della richiesta sotto il nome della chiave di 'additionalEventData'. Per individuare la versione della firma nelle richieste effettuate per gli oggetti in Amazon S3 come GET, PUT e DELETE, è necessario abilitare gli eventi di dati CloudTrail, disattivati per impostazione predefinita.

AWS CloudTrail è il metodo preferito per identificare le richieste di Signature Version 2. Se utilizzi i log di accesso del server Amazon S3, consulta Identificazione delle richieste di Signature versione 2 tramite i log di accesso Amazon S3.

Esempi di query Athena per l'identificazione di richieste Amazon S3 Signature versione 2

Esempio - Selezionare tutti gli eventi di Signature versione 2 e stampare solo EventTime, S3 Action, Request_Parameters, Region, SourceIP e UserAgent

Nella query Athena seguente sostituire <s3_cloudtrail_events_db.cloudtrail_myawsexamplebucket1_table> con i propri dettagli di Athena e aumentare o rimuovere il limite in base alle necessità.

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_myawsexamplebucket1_table WHERE eventsource='s3.amazonaws.com' AND json_extract_scalar(additionalEventData, '$.SignatureVersion')='SigV2' LIMIT 10;
Esempio - Selezionare tutti i richiedenti che inviano traffico di tipo Signature versione 2

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

Partizionamento dei dati di Signature versione 2

Se è necessario eseguire query su una grande quantità di dati, è possibile ridurre i costi e il runtime di Athena creando una tabella partizionata.

Per farlo, creare una nuova tabella con partizioni nel modo seguente.

CREATE EXTERNAL TABLE s3_cloudtrail_events_db.cloudtrail_myawsexamplebucket1_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 'com.amazon.emr.hive.serde.CloudTrailSerde' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://myawsexamplebucket1/AWSLogs/111122223333/';

Quindi creare le partizioni individualmente. Non è possibile ottenere risultati da date che non sono state create.

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

È quindi possibile effettuare la richiesta sulla base di queste partizioni e non è necessario caricare l'intero bucket.

SELECT useridentity.arn, Count(requestid) AS RequestCount FROM s3_cloudtrail_events_db.cloudtrail_myawsexamplebucket1_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

Identificazione dell'accesso agli oggetti S3 tramite CloudTrail

È possibile utilizzare il log di eventi AWS CloudTrail per identificare le richieste di accesso agli oggetti Amazon S3 per eventi di dati come GetObject, DeleteObject, PutObject e scoprire ulteriori informazioni su tali richieste.

Il seguente esempio illustra come ottenere tutte le richieste di oggetti per Amazon S3 dal log di eventi AWS CloudTrail.

Esempi di query Athena per l'identificazione di richieste di accesso agli oggetti Amazon S3

Negli esempi di query Athena seguenti sostituisci <s3_cloudtrail_events_db.cloudtrail_myawsexamplebucket1_table> con i dettagli Athena e modifica l'intervallo della data in base alle necessità.

Esempio - Seleziona tutti gli eventi che hanno richieste di accesso agli oggetti PUT e stampa solo EventTime, EventSource, SourceIP, UserAgent, BucketName, Object e 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_myawsexamplebucket_table WHERE eventName = 'PutObject' AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
Esempio - Seleziona tutti gli eventi che hanno richieste di accesso agli oggetti GET e stampa solo EventTime, EventSource, SourceIP, UserAgent, BucketName, Object e 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_myawsexamplebucket_table WHERE eventName = 'GetObject' AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
Esempio - Seleziona tutti gli eventi del richiedente anonimo a un bucket in un periodo specifico e stampa solo EventTime, EventName, EventSource, SourceIP, UserAgent, BucketName, UserARN e 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_myawsexamplebucket_table WHERE userIdentity.accountId = 'anonymous' AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
Nota
  • Questi esempi di query possono essere utili anche per il monitoraggio della sicurezza. Puoi rivedere i risultati per chiamate PutObject o GetObject da indirizzi IP/richiedenti imprevisti o non autorizzati e per l'identificazione di eventuali richieste anonime ai bucket.

  • La query recupera solo le informazioni a partire dall'orario in cui è stata abilitata la registrazione.

Se utilizzi i log di accesso al server Amazon S3, consulta Identificazione delle richieste di accesso agli oggetti tramite i log di accesso Amazon S3.