Interrogazione dei log AWS CloudTrail - Amazon Athena

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Interrogazione dei log AWS CloudTrail

AWS CloudTrail è un servizio che registra chiamate ed eventi AWS API per gli account Amazon Web Services.

CloudTrail i log includono dettagli su tutte le chiamate API effettuate al tuo account Servizi AWS, inclusa la console. CloudTrail genera file di registro crittografati e li archivia in Amazon S3. Per ulteriori informazioni, consulta la Guida per l'utente AWS CloudTrail.

Nota

Se desideri eseguire query SQL sulle informazioni sugli CloudTrail eventi tra account, regioni e date, prendi in considerazione l'utilizzo CloudTrail di Lake. CloudTrail Lake è un' AWS alternativa alla creazione di percorsi che aggregano le informazioni di un'azienda in un unico archivio di dati sugli eventi ricercabile. Invece di utilizzare lo storage bucket Amazon S3, memorizza gli eventi in un data lake, che consente di effettuare query più ricche e più rapide. È possibile utilizzarlo per creare query SQL che cercano eventi tra organizzazioni, regioni e intervalli di tempo personalizzati. Poiché esegui le query su CloudTrail Lake all'interno della CloudTrail console stessa, l'utilizzo di CloudTrail Lake non richiede Athena. Per ulteriori informazioni, consulta la documentazione di CloudTrail Lake.

L'utilizzo di Athena con CloudTrail i log è un modo efficace per migliorare l'analisi delle attività. Servizio AWS Ad esempio, puoi utilizzare le query per identificare le tendenze e isolare con maggiore precisione le attività in base ad attributi specifici, ad esempio l'indirizzo IP di origine o un utente.

Un'applicazione comune consiste nell'utilizzare CloudTrail i log per analizzare l'attività operativa per motivi di sicurezza e conformità. Per informazioni su un esempio dettagliato, consulta il post sul blog AWS Big Data, Analyze security, compliance and operations activity using AWS CloudTrail and Amazon Athena.

È possibile usare Athena per eseguire query su questi file di log direttamente da Amazon S3, specificando la voce LOCATION dei file di log. Ci sono due modi per farlo:

  • Creando tabelle per i file di CloudTrail log direttamente dalla CloudTrail console.

  • Creando manualmente tabelle per i file di CloudTrail registro nella console Athena.

Informazioni CloudTrail sui log e sulle tabelle Athena

Prima di iniziare a creare tabelle, è necessario acquisire maggiori informazioni su CloudTrail e su come vengono archiviati i dati. Questo può aiutarti a creare le tabelle di cui hai bisogno, indipendentemente dal fatto che tu le crei dalla CloudTrail console o da Athena.

CloudTrail salva i log come file di testo JSON in formato gzip compresso (*.json.gzip). La posizione dei file di registro dipende dalla modalità di configurazione dei percorsi, dalle regioni in cui si effettua la registrazione e da Regione AWS altri fattori.

Per ulteriori informazioni su dove vengono archiviati i log, la struttura JSON e i contenuti dei file di record, consulta i seguenti argomenti nella Guida per l'utente di AWS CloudTrail:

Per raccogliere i log e salvarli su Amazon S3, CloudTrail abilita da. AWS Management Console Per ulteriori informazioni, consulta Creazione di un percorso nella Guida per l'utente di AWS CloudTrail .

Prendi nota del bucket Amazon S3 di destinazione in cui salvi i log. Sostituisci la LOCATION clausola con il percorso della posizione del CloudTrail registro e il set di oggetti con cui lavorare. L'esempio utilizza un LOCATION valore di log per un determinato account, ma è possibile utilizzare il grado di specificità più adatta alla tua applicazione.

Ad esempio:

  • Per analizzare i dati provenienti da più account, puoi eseguire il rollback dell'identificatore LOCATION per selezionare tutti gli AWSLogs con LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/'.

  • Per analizzare i dati provenienti da una data, account e regione specifici, utilizza LOCATION 's3://DOC-EXAMPLE-BUCKET/123456789012/CloudTrail/us-east-1/2016/03/14/'.

Indicando il livello più elevato nella gerarchia degli oggetti hai la massima flessibilità nelle query con Athena.

Utilizzo della CloudTrail console per creare una tabella Athena per i log CloudTrail

È possibile creare una tabella Athena non partizionata per CloudTrail interrogare i log direttamente dalla console. CloudTrail La creazione di una tabella Athena dalla CloudTrail console richiede l'accesso con un ruolo con autorizzazioni sufficienti per creare tabelle in Athena.

Nota

Non è possibile utilizzare la CloudTrail console per creare una tabella Athena per i log degli itinerari organizzativi. Crea invece la tabella manualmente utilizzando la console Athena in modo da poter specificare la posizione di archiviazione corretta. Per ulteriori informazioni sui percorsi dell'organizzazione, consulta Creazione di un percorso per un'organizzazione nella Guida per l'utente di AWS CloudTrail .

Per creare una tabella Athena per un CloudTrail percorso utilizzando la console CloudTrail
  1. Apri la CloudTrail console all'indirizzo https://console.aws.amazon.com/cloudtrail/.

  2. Nel riquadro di navigazione scegliere Event history (Cronologia eventi).

  3. Scegli Crea la tabella Athena.

    Scegli Crea la tabella Athena
  4. Per Storage location (Posizione di archiviazione), utilizza la freccia giù per selezionare il bucket Amazon S3 in cui sono archiviati i file di log per il trail sul quale eseguire le query.

    Nota

    Per trovare il nome del bucket associato a un percorso, scegli Percorsi nel riquadro di CloudTrail navigazione e visualizza la colonna del bucket S3 del percorso. Per visualizzare la posizione del bucket in Amazon S3, scegliere il link per il bucket nella colonna Bucket S3. Questo apre la console Amazon S3 nella posizione del CloudTrail bucket.

  5. Scegliere Create table (Crea tabella). La tabella viene creata con un nome di default che include il nome del bucket Amazon S3.

Creazione di una tabella per CloudTrail i log in Athena utilizzando il partizionamento manuale

È possibile creare manualmente tabelle per i file di CloudTrail registro nella console Athena e quindi eseguire query in Athena.

Per creare una tabella Athena per un CloudTrail percorso utilizzando la console Athena
  1. Copia e incolla la seguente istruzione DDL nell'editor di query Athena.

    CREATE EXTERNAL TABLE cloudtrail_logs ( 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>, ec2RoleDelivery:string, webIdFederationData: STRUCT< federatedProvider: STRING, attributes: map<string,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, eventCategory STRING, tlsDetails struct< tlsVersion:string, cipherSuite:string, clientProvidedHostHeader:string> ) PARTITIONED BY (region string, year string, month string, day string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/Account_ID/CloudTrail/';
    Nota

    Suggeriamo di utilizzare quanto org.apache.hive.hcatalog.data.JsonSerDe mostrato nell'esempio. Sebbene a com.amazon.emr.hive.serde.CloudTrailSerde esista, attualmente non gestisce alcuni dei CloudTrail campi più recenti.

  2. (Facoltativo) Rimuovi tutti i campi non obbligatori per la tabella. Se è necessario leggere solo un determinato set di colonne, la definizione della tabella può escludere le altre colonne.

  3. Modificare s3://DOC-EXAMPLE-BUCKET/AWSLogs/Account_ID/CloudTrail/ affinché punti al bucket Amazon S3 che contiene i dati del log.

  4. Verificare che i campi siano elencati correttamente. Per ulteriori informazioni sull'elenco completo dei campi in un CloudTrail record, vedere il contenuto del CloudTrail record.

    L'CREATE TABLEistruzione di esempio nel passaggio 1 utilizza ilJSON Hive SerDe. Nell'esempio, i campi requestparametersresponseelements, e additionaleventdata sono elencati come tipo STRING nella query, ma sono STRUCT i tipi di dati utilizzati in JSON. Pertanto, per estrarre i dati da questi campi, utilizza le funzioni JSON_EXTRACT. Per ulteriori informazioni, consulta Estrazione di dati JSON dalle stringhe. Per migliorare le prestazioni, l'esempio partiziona i dati per anno Regione AWS, mese e giorno.

  5. Esegui l'istruzione CREATE TABLE nella console Athena.

  6. Utilizzare il comando ALTER TABLE ADD PARTITION per caricare le partizioni in modo da poterle interrogare, come nell'esempio seguente.

    ALTER TABLE table_name ADD PARTITION (region='us-east-1', year='2019', month='02', day='01') LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/Account_ID/CloudTrail/us-east-1/2019/02/01/'

Creazione di una tabella per un percorso a livello di organizzazione utilizzando il partizionamento manuale

Per creare una tabella per i file di CloudTrail registro a livello di organizzazione in Athena, segui la procedura riportata di seguitoCreazione di una tabella per CloudTrail i log in Athena utilizzando il partizionamento manuale, ma apporta le modifiche indicate nella procedura seguente.

Per creare una tabella Athena per i registri a livello di organizzazione CloudTrail
  1. Nell'istruzione CREATE TABLE, modifica la clausola LOCATION per includere l'ID dell'organizzazione, come nell'esempio seguente:

    LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/organization_id/Account_ID/CloudTrail/'
  2. Nella clausola PARTITIONED BY, aggiungi una voce per l'ID account sotto forma di stringa, come nell'esempio seguente:

    PARTITIONED BY (account string, region string, year string, month string, day string)

    L'esempio seguente mostra solo il risultato combinato:

    ... PARTITIONED BY (account string, region string, year string, month string, day string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/organization_id/Account_ID/CloudTrail/'
  3. Nella clausola ADD PARTITION dell'istruzione ALTER TABLE, includi l'ID dell'account, come nell'esempio seguente:

    ALTER TABLE table_name ADD PARTITION (account='111122223333', region='us-east-1', year='2022', month='08', day='08')
  4. Nella clausola LOCATION dell'istruzione ALTER TABLE, includi l'ID dell'organizzazione, l'ID dell'account e la partizione che desideri aggiungere, come nell'esempio seguente:

    LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/organization_id/Account_ID/CloudTrail/us-east-1/2022/08/08/'

    L'istruzione di esempio ALTER TABLE seguente mostra solo il risultato combinato:

    ALTER TABLE table_name ADD PARTITION (account='111122223333', region='us-east-1', year='2022', month='08', day='08') LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/organization_id/111122223333/CloudTrail/us-east-1/2022/08/08/'

Creazione della tabella per CloudTrail i log in Athena utilizzando la proiezione delle partizioni

Poiché CloudTrail i log hanno una struttura nota il cui schema di partizione è possibile specificare in anticipo, è possibile ridurre il tempo di esecuzione delle query e automatizzare la gestione delle partizioni utilizzando la funzionalità di proiezione delle partizioni Athena. La proiezione delle partizioni aggiunge automaticamente nuove partizioni man mano che vengono aggiunti nuovi dati. Ciò elimina la necessità di aggiungere manualmente le partizioni utilizzando ALTER TABLE ADD PARTITION.

L'CREATE TABLEistruzione di esempio che segue utilizza automaticamente la proiezione delle partizioni sui CloudTrail registri da una data specificata a quella attuale per un singolo registro. Regione AWS Nelle clausole LOCATION e storage.location.template, sostituire i segnaposto bucket, account-id e aws-region con valori corrispondenti identici. Per projection.timestamp.range, sostituire 2020/01/01 con la data di inizio che si desidera usare. Dopo aver eseguito la query con esito positivo, è possibile eseguire query sulla tabella. Non è necessario eseguire ALTER TABLE ADD PARTITION per caricare le partizioni.

CREATE EXTERNAL TABLE cloudtrail_logs_pp( 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>, ec2RoleDelivery:string, webIdFederationData: STRUCT< federatedProvider: STRING, attributes: map<string,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, readOnly STRING, resources ARRAY<STRUCT< arn: STRING, accountId: STRING, type: STRING>>, eventType STRING, apiVersion STRING, recipientAccountId STRING, serviceEventDetails STRING, sharedEventID STRING, vpcendpointid STRING, eventCategory STRING, tlsDetails struct< tlsVersion:string, cipherSuite:string, clientProvidedHostHeader:string> ) PARTITIONED BY ( `timestamp` string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/account-id/CloudTrail/aws-region' TBLPROPERTIES ( 'projection.enabled'='true', 'projection.timestamp.format'='yyyy/MM/dd', 'projection.timestamp.interval'='1', 'projection.timestamp.interval.unit'='DAYS', 'projection.timestamp.range'='2020/01/01,NOW', 'projection.timestamp.type'='date', 'storage.location.template'='s3://DOC-EXAMPLE-BUCKET/AWSLogs/account-id/CloudTrail/aws-region/${timestamp}')

Per maggiori informazioni sulla proiezione delle partizioni, consulta Proiezione delle partizioni con Amazon Athena.

Esecuzione di query nei campi nidificati

Poiché i campi userIdentity e resources sono tipi di dati nidificati, l’esecuzioni di query richiede un trattamento speciale.

L'oggetto userIdentity è costituito da tipi nidificati STRUCT. È possibile eseguire query utilizzando un punto per separare i campi, come nell'esempio seguente:

SELECT eventsource, eventname, useridentity.sessioncontext.attributes.creationdate, useridentity.sessioncontext.sessionissuer.arn FROM cloudtrail_logs WHERE useridentity.sessioncontext.sessionissuer.arn IS NOT NULL ORDER BY eventsource, eventname LIMIT 10

Il campo resources è un array di oggetti STRUCT. Per questi array, utilizzare CROSS JOIN UNNEST per annullare l'array in modo da poter interrogare i suoi oggetti.

L'esempio seguente restituisce tutte le righe in cui la risorsa ARN termina in example/datafile.txt. Per la leggibilità, la funzione replace rimuove la sottostringa iniziale arn:aws:s3::: dall'ARN.

SELECT awsregion, replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as s3_resource, eventname, eventtime, useragent FROM cloudtrail_logs t CROSS JOIN UNNEST(t.resources) unnested (resources_entry) WHERE unnested.resources_entry.ARN LIKE '%example/datafile.txt' ORDER BY eventtime

Di seguito sono illustrati alcuni esempi di query per gli eventi DeleteBucket. La query estrae il nome del bucket e l'ID account a cui appartiene il bucket dall'oggetto resources.

SELECT awsregion, replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as deleted_bucket, eventtime AS time_deleted, useridentity.username, unnested.resources_entry.accountid as bucket_acct_id FROM cloudtrail_logs t CROSS JOIN UNNEST(t.resources) unnested (resources_entry) WHERE eventname = 'DeleteBucket' ORDER BY eventtime

Per ulteriori informazioni sull'annullamento della nidificazione, consulta Filtraggio delle matrici.

Query di esempio

L'esempio seguente mostra una parte di una query che restituisce tutte le richieste anonime (non firmate) dalla tabella creata per i registri degli eventi. CloudTrail Questa query seleziona le richieste in cui useridentity.accountid è anonimo e useridentity.arn non è specificato:

SELECT * FROM cloudtrail_logs WHERE eventsource = 's3.amazonaws.com' AND eventname in ('GetObject') AND useridentity.accountid = 'anonymous' AND useridentity.arn IS NULL AND requestparameters LIKE '%[your bucket name ]%';

Per ulteriori informazioni, consulta il post sul blog AWS Big Data Analyze security, compliance and operations activity using AWS CloudTrail and Amazon Athena.

Suggerimenti per l' CloudTrail interrogazione dei log

Per esplorare i dati dei CloudTrail log, utilizza questi suggerimenti:

  • Prima di eseguire query sui log, verifica che la tabella di log sia uguale a quella definita in Creazione di una tabella per CloudTrail i log in Athena utilizzando il partizionamento manuale. Se non è la prima tabella, elimina la tabella esistente utilizzando il comando: DROP TABLE cloudtrail_logs.

  • Dopo aver eliminato la tabella esistente, ricreala. Per ulteriori informazioni, consulta Creazione di una tabella per CloudTrail i log in Athena utilizzando il partizionamento manuale.

    Verifica che i campi della query Athena siano elencati correttamente. Per informazioni sull'elenco completo dei campi in un CloudTrail record, consulta il contenuto del CloudTrail record.

    Se la query include campi nei formati JSON, ad esempio STRUCT, estrarre i dati da JSON. Per ulteriori informazioni, consulta Estrazione di dati JSON dalle stringhe.

    Alcuni suggerimenti per eseguire interrogazioni sulla tabella: CloudTrail

  • Inizia osservando quali utenti hanno eseguito specifiche operazioni API e gli indirizzi IP di origine.

  • Utilizza la seguente query SQL di base come modello. Incolla la query nella console Athena ed eseguila.

    SELECT useridentity.arn, eventname, sourceipaddress, eventtime FROM cloudtrail_logs LIMIT 100;
  • Modifica la query per esplorare ulteriormente i dati.

  • Per migliorare le prestazioni, includi la clausola LIMIT per ottenere uno specifico sottoinsieme di righe.