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 al server Amazon S3 per identificare le richieste.

Identificazione delle richieste effettuate ad Amazon S3 in un 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 di Amazon S3. Questi sono formattati come riportato di seguito:

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

Gli eventi registrati da CloudTrail vengono archiviati in oggetti 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 Creazione della tabella per i log AWS CloudTrail in Athena utilizzando la proiezione delle partizioni nella Guida per l'utente di Amazon Athena.

Identificazione delle richieste di Amazon S3 Signature Version 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 la sezione relativa all'annuncio dell'aggiunta in AWS CloudTrail per Amazon S3 di nuovi campi per un audit di sicurezza migliorato in AWS re:Post.

Nota

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

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

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

Esempio : seleziona tutti gli eventi Signature Version 2 e stampa solo EventTime, S3_Action, Request_Parameters, Region, SourceIP e UserAgent

Nella query Athena seguente sostituisci s3_cloudtrail_events_db.cloudtrail_table con i dettagli Athena e aumenta o rimuovi 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_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_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 i tempi di esecuzione 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_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/';

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

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

È 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_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 i log di eventi AWS CloudTrail per identificare le richieste di accesso agli oggetti Amazon S3 per eventi di dati come GetObject, DeleteObject e PutObject e scoprire ulteriori informazioni su tali richieste.

Nota

Se registri i log dell’attività dei dati con AWS CloudTrail, il record per un evento di dati DeleteObjects di Amazon S3 include sia l’evento DeleteObjects sia l’evento DeleteObject per ogni oggetto eliminato come parte dell’operazione. È possibile escludere la visibilità aggiuntiva sugli oggetti eliminati dal record dell’evento. Per ulteriori informazioni, consulta Esempi AWS CLI per filtrare eventi di dati nella Guida per l’utente di AWS CloudTrail.

Il seguente esempio illustra come ottenere tutte le richieste PUT 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_table con i dettagli Athena e modifica l'intervallo della data in base alle necessità.

Esempio : seleziona tutti gli eventi con richieste PUT di accesso agli oggetti 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_table WHERE eventName = 'PutObject' AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
Esempio : seleziona tutti gli eventi con richieste GET di accesso agli oggetti 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_table WHERE eventName = 'GetObject' AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
Esempio : seleziona tutti gli eventi anonimi del richiedente per un bucket in un determinato periodo 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_table WHERE userIdentity.accountId = 'anonymous' AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
Esempio : identifica tutte le richieste che richiedono una ACL per l'autorizzazione

L'esempio di query Amazon Athena seguente mostra come identificare tutte le richieste relative ai bucket S3 che richiedono una lista di controllo degli accessi (ACL) per l'autorizzazione. Se la richiesta richiede una ACL per l'autorizzazione, il valore aclRequired in additionalEventData è Yes. Se non sono richieste ACL, aclRequired non è presente. È possibile utilizzare queste informazioni per eseguire la migrazione delle autorizzazioni ACL alle policy di bucket appropriate. Dopo aver creato queste policy per i bucket, è possibile disabilitare le ACL per questi bucket. Per ulteriori informazioni sulla disabilitazione delle ACL, consulta Prerequisiti per la disabilitazione delle 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'
Nota
  • Questi esempi di query possono essere utili anche per il monitoraggio della sicurezza. Puoi rivedere i risultati per le chiamate PutObject o GetObject da indirizzi IP o 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 degli accessi Amazon S3.