Esecuzione di query sui log di flusso Amazon VPC - 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à.

Esecuzione di query sui log di flusso Amazon VPC

I flussi di log Amazon Virtual Private Cloud acquisiscono informazioni sul traffico IP da e verso le interfacce di rete in un VPC. Utilizza i log per analizzare i modelli di traffico di rete e identificare le minacce e i rischi nella rete VPC.

Per eseguire query nel flusso di log di Amazon VPC, sono disponibili due opzioni:

  • Console Amazon VPC: utilizza la funzionalità di integrazione Athena nella console Amazon VPC per generare un modello AWS CloudFormation che crei un database Athena, un gruppo di lavoro e una tabella di log di flusso con partizionamento per te. Il modello crea inoltre un set di query di flusso di log predefinite che può essere utilizzato per ottenere informazioni dettagliate sul traffico in transito attraverso il VPC.

    Per ulteriori informazioni su questo approccio, consulta Eseguire una query dei flussi di log tramite Amazon Athena nella Guida per l'utente di Amazon VPC.

  • Console Amazon Athena: crea le tabelle e le query direttamente nella console Athena. Per maggiori informazioni, continua a leggere questa pagina.

Creazione ed esecuzione di query sulle tabelle per log di flusso VPC personalizzati

Prima di iniziare a eseguire query sui log in Athena, abilita i log di flusso VPC e configurali in modo che possano essere salvati nel bucket Amazon S3. Dopo aver creato i log, lasciali in esecuzione per qualche minuto per raccogliere alcuni dati. I log vengono creati in un formato di compressione GZIP su cui Athena consente di eseguire query direttamente.

Durante la creazione di un log di flusso, puoi utilizzare un formato personalizzato quando vuoi specificare quali campi restituire nel log di flusso e l'ordine in cui visualizzarli. Per ulteriori informazioni sui record dei log di flusso, consulta Record log di flusso nella Guida per l'utente di Amazon VPC.

Considerazioni generali

Quando si creano tabelle nei flussi di log di Athena per Amazon VPC, tenere in considerazione i seguenti punti:

  • Per impostazione predefinita, in Athena, Parquet accederà alle colonne in base al nome. Per ulteriori informazioni, consulta Gestione degli aggiornamenti degli schemi.

  • Utilizzare i nomi nei record del flusso di log per i nomi delle colonne in Athena. I nomi delle colonne nello schema Athena devono corrispondere esattamente ai nomi dei campi nel flusso di log Amazon VPC, con le seguenti differenze:

    • Sostituire i trattini nei nomi dei campi di log di Amazon VPC con i caratteri di sottolineatura nei nomi delle colonne Athena. In Athena, gli unici caratteri consentiti per i nomi di database, tabelle e colonne sono lettere minuscole, numeri e il carattere di sottolineatura. Per ulteriori informazioni, consulta Database di nomi, tabelle e colonne.

    • Escludere i nomi dei registri del flusso di log che rappresentano in Athena parole chiave riservate, racchiudendoli tra apici retroversi (`).

  • I log di flusso VPC sono specifici. Account AWS Quando pubblichi i tuoi file di log su Amazon S3, il percorso creato da Amazon VPC in Amazon S3 include l'ID dell' Account AWS che è stato utilizzato per crearli. Per ulteriori informazioni, consulta la sezione relativa alla pubblicazione di registri di flusso in Amazon S3 nella Guida per l'utente di Amazon VPC.

Istruzione CREATE TABLE (CREA TABELLA) per il flusso di log di Amazon VPC

La procedura seguente consente di creare una tabella Amazon VPC per il flusso di log di Amazon VPC. Quando crei un log di flusso con un formato personalizzato, crea una tabella con campi che corrispondano a quelli specificati durante la creazione del log di flusso, nello stesso ordine in cui li hai specificati.

Per creare una tabella Athena per il flusso di log di Amazon VPC
  1. Inserire un'istruzione DDL come la seguente nell'editor di query della console Athena, seguendo le linee guida riportate nella sezione Considerazioni generali. L'istruzione di esempio crea una tabella con le colonne per il flusso di log di Amazon VPC, versioni da 2 a 5, come documentato in Registri del flusso di log. Se si utilizza un set di colonne o un ordine di colonne diverso, modificare questa istruzione di conseguenza.

    CREATE EXTERNAL TABLE IF NOT EXISTS `vpc_flow_logs` ( version int, account_id string, interface_id string, srcaddr string, dstaddr string, srcport int, dstport int, protocol bigint, packets bigint, bytes bigint, start bigint, `end` bigint, action string, log_status string, vpc_id string, subnet_id string, instance_id string, tcp_flags int, type string, pkt_srcaddr string, pkt_dstaddr string, region string, az_id string, sublocation_type string, sublocation_id string, pkt_src_aws_service string, pkt_dst_aws_service string, flow_direction string, traffic_path int ) PARTITIONED BY (`date` date) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LOCATION 's3://DOC-EXAMPLE-BUCKET/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/' TBLPROPERTIES ("skip.header.line.count"="1");

    Notare i seguenti punti:

    • La query specifica ROW FORMAT DELIMITED e omette di specificare un. SerDe Ciò significa che la query utilizza il metodo LazySimpleSerDe per CSV, TSV e file delimitati in modo personalizzato. In questa query, i campi terminano con uno spazio.

    • La clausola PARTITIONED BY utilizza il tipo date. In questo modo è possibile utilizzare operatori matematici nelle query per selezionare ciò che è più vecchio o più recente rispetto a una determinata data.

      Nota

      Poiché date è una parola chiave riservata nelle istruzioni DDL, questa viene preceduta da caratteri di apice inverso. Per ulteriori informazioni, consulta Parole chiave riservate.

    • Per un log di flusso VPC con un formato personalizzato diverso, modifica i campi in modo che corrispondano a quelli specificati durante la creazione del log di flusso.

  2. Modificare LOCATION 's3://DOC-EXAMPLE-BUCKET/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/' perché punti al bucket Amazon S3 che contiene i dati di log.

  3. Eseguire la query nella console Athena. Una volta completata la query, Athena registra la tabella vpc_flow_logs, rendendo i dati in essa contenuti pronti per l'esecuzione di query.

  4. Creare partizioni per poter leggere i dati, come nella seguente query di esempio. Questa query crea una singola partizione per una data specificata. Sostituire i segnaposto per data e posizione in base alle esigenze.

    Nota

    Questa query crea unicamente una singola partizione, per la data specificata. Per automatizzare il processo, utilizzare uno script che esegue questa query e crea partizioni in questo modo per year/month/day oppure utilizzare un'istruzione CREATE TABLE che specifica la proiezione delle partizioni.

    ALTER TABLE vpc_flow_logs ADD PARTITION (`date`='YYYY-MM-dd') LOCATION 's3://DOC-EXAMPLE-BUCKET/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/YYYY/MM/dd';

Query di esempio per la tabella vpc_flow_logs

Utilizzare l'editor di query nella console Athena per eseguire istruzioni SQL sulla tabella creata. È possibile salvare le query, visualizzare le query precedenti o scaricare i risultati delle query in formato CSV. Negli esempi seguenti, sostituire vpc_flow_logs con il nome della tabella. Modificare i valori delle colonne e altre variabili in base alle proprie esigenze.

La query di esempio seguente elenca un massimo di 100 log di flusso per la data specificata.

SELECT * FROM vpc_flow_logs WHERE date = DATE('2020-05-04') LIMIT 100;

La query seguente elenca tutte le connessioni TCP rifiutate e utilizza la colonna di partizione della data appena creata, date, per estrarne il giorno della settimana in cui si verificano questi eventi.

SELECT day_of_week(date) AS day, date, interface_id, srcaddr, action, protocol FROM vpc_flow_logs WHERE action = 'REJECT' AND protocol = 6 LIMIT 100;

Per vedere quale server riceve il numero più elevato di richieste HTTPS, utilizzare la seguente query. Conta il numero di pacchetti ricevuti sulla porta HTTPS 443, li raggruppa in base all'indirizzo IP di destinazione e restituisce i primi 10.

SELECT SUM(packets) AS packetcount, dstaddr FROM vpc_flow_logs WHERE dstport = 443 AND date > current_date - interval '7' day GROUP BY dstaddr ORDER BY packetcount DESC LIMIT 10;

Creazione di tabelle per il flusso di log in formato Apache Parquet

La procedura seguente consente di creare una tabella Amazon VPC per il flusso di log di Amazon VPC in formato Apache Parquet.

Per creare una tabella Athena per il flusso di log di Amazon VPC in formato Parquet
  1. Inserire un'istruzione DDL come la seguente nell'editor di query della console Athena, seguendo le linee guida riportate nella sezione Considerazioni generali. L'istruzione di esempio crea una tabella con le colonne per il flusso di log di Amazon VPC, versioni da 2 a 5, come documentato in Registri del flusso di log in formato Parquet, partizionato con Hive ogni ora. Se non disponi di partizioni orarie, rimuovi hour dalla clausola PARTITIONED BY.

    CREATE EXTERNAL TABLE IF NOT EXISTS vpc_flow_logs_parquet ( version int, account_id string, interface_id string, srcaddr string, dstaddr string, srcport int, dstport int, protocol bigint, packets bigint, bytes bigint, start bigint, `end` bigint, action string, log_status string, vpc_id string, subnet_id string, instance_id string, tcp_flags int, type string, pkt_srcaddr string, pkt_dstaddr string, region string, az_id string, sublocation_type string, sublocation_id string, pkt_src_aws_service string, pkt_dst_aws_service string, flow_direction string, traffic_path int ) PARTITIONED BY ( `aws-account-id` string, `aws-service` string, `aws-region` string, `year` string, `month` string, `day` string, `hour` string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/prefix/AWSLogs/' TBLPROPERTIES ( 'EXTERNAL'='true', 'skip.header.line.count'='1' )
  2. Modificare LOCATION 's3://DOC-EXAMPLE-BUCKET/prefix/AWSLogs/' perché punti al bucket Amazon S3 che contiene i dati di log.

  3. Eseguire la query nella console Athena.

  4. Se i dati sono in formato compatibile con Hive, esegui il seguente comando nella console Athena per aggiornare e caricare le partizioni Hive nel metastore. Una volta completata la query, è possibile eseguire query sui dati nella tabella vpc_flow_logs_parquet.

    MSCK REPAIR TABLE vpc_flow_logs_parquet

    Se non utilizzi dati compatibili con Hive, esegui ALTER TABLE ADD PARTITION per caricare le partizioni.

Per ulteriori informazioni sull'utilizzo di Athena per eseguire query sul log di flusso di Amazon VPC in formato Parquet, consulta il post Optimize performance and reduce costs for network analytics with VPC Flow Logs in Apache Parquet format nell'AWS Big Data Blog.

Creazione ed esecuzione di query su una tabella per il flusso di log di Amazon VPC tramite la proiezione delle partizioni

Utilizzare una istruzione CREATE TABLE come la seguente per creare una tabella, partizionarla e popolare automaticamente le partizioni utilizzando la proiezione delle partizioni. Sostituire il nome della tabella test_table_vpclogs nell'esempio con il nome della propria tabella. Modificare la clausola LOCATION per specificare il bucket Amazon S3 che contiene i dati di log di Amazon VPC.

La seguente istruzione CREATE TABLE è per il flusso di log VPC fornito in formato di partizionamento in stile non Hive. L'esempio consente l'aggregazione di più account. Se stai centralizzando i log di flusso VPC da più account in un bucket Amazon S3, l'ID dell'account deve essere inserito nel percorso Amazon S3.

CREATE EXTERNAL TABLE IF NOT EXISTS test_table_vpclogs ( version int, account_id string, interface_id string, srcaddr string, dstaddr string, srcport int, dstport int, protocol bigint, packets bigint, bytes bigint, start bigint, `end` bigint, action string, log_status string, vpc_id string, subnet_id string, instance_id string, tcp_flags int, type string, pkt_srcaddr string, pkt_dstaddr string, az_id string, sublocation_type string, sublocation_id string, pkt_src_aws_service string, pkt_dst_aws_service string, flow_direction string, traffic_path int ) PARTITIONED BY (accid string, region string, day string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LOCATION '$LOCATION_OF_LOGS' TBLPROPERTIES ( "skip.header.line.count"="1", "projection.enabled" = "true", "projection.accid.type" = "enum", "projection.accid.values" = "$ACCID_1,$ACCID_2", "projection.region.type" = "enum", "projection.region.values" = "$REGION_1,$REGION_2,$REGION_3", "projection.day.type" = "date", "projection.day.range" = "$START_RANGE,NOW", "projection.day.format" = "yyyy/MM/dd", "storage.location.template" = "s3://DOC-EXAMPLE-BUCKET/AWSLogs/${accid}/vpcflowlogs/${region}/${day}" )

Query di esempio per test_table_vpclogs

Nelle seguenti query di esempio viene interrogata la test_table_vpclogs creata dall'istruzione CREATE TABLE precedente. Sostituire test_table_vpclogs nelle query con il nome della propria tabella. Modificare i valori delle colonne e altre variabili in base alle proprie esigenze.

Per restituire le prime 100 voci di log di accesso in ordine cronologico per un determinato periodo di tempo, eseguire una query come la seguente.

SELECT * FROM test_table_vpclogs WHERE day >= '2021/02/01' AND day < '2021/02/28' ORDER BY day ASC LIMIT 100

Per visualizzare quale server riceve i dieci pacchetti HTTP principali per un determinato periodo di tempo, eseguire una query come la seguente. La query conta il numero di pacchetti ricevuti sulla porta HTTPS 443, li raggruppa in base all'indirizzo IP di destinazione e restituisce le prime 10 voci principali dalla settimana precedente.

SELECT SUM(packets) AS packetcount, dstaddr FROM test_table_vpclogs WHERE dstport = 443 AND day >= '2021/03/01' AND day < '2021/03/31' GROUP BY dstaddr ORDER BY packetcount DESC LIMIT 10

Per restituire i registri creati durante un determinato periodo di tempo, eseguire una query come la seguente.

SELECT interface_id, srcaddr, action, protocol, to_iso8601(from_unixtime(start)) AS start_time, to_iso8601(from_unixtime("end")) AS end_time FROM test_table_vpclogs WHERE DAY >= '2021/04/01' AND DAY < '2021/04/30'

Per restituire i registri di accesso per un indirizzo IP di origine tra i periodi di tempo specificati, eseguire una query come la seguente.

SELECT * FROM test_table_vpclogs WHERE srcaddr = '10.117.1.22' AND day >= '2021/02/01' AND day < '2021/02/28'

Per elencare le connessioni TCP rifiutate, eseguire una query come la seguente.

SELECT day, interface_id, srcaddr, action, protocol FROM test_table_vpclogs WHERE action = 'REJECT' AND protocol = 6 AND day >= '2021/02/01' AND day < '2021/02/28' LIMIT 10

Per restituire i registri di accesso per l'intervallo di indirizzi IP che inizia con 10.117, eseguire una query come la seguente.

SELECT * FROM test_table_vpclogs WHERE split_part(srcaddr,'.', 1)='10' AND split_part(srcaddr,'.', 2) ='117'

Per restituire i registri di accesso per un indirizzo IP di destinazione tra i periodi di tempo specificati, eseguire una query come la seguente.

SELECT * FROM test_table_vpclogs WHERE dstaddr = '10.0.1.14' AND day >= '2021/01/01' AND day < '2021/01/31'

Creazione di tabelle per il flusso di log in formato Apache Parquet usando la proiezione di partizione

La seguente istruzione CREATE TABLE di proiezione della partizione per i log di flusso VPC è in formato Apache Parquet, non è compatibile con Hive e partizionata per ora e per data anziché per giorno. Sostituire il nome della tabella test_table_vpclogs_parquet nell'esempio con il nome della propria tabella. Modificare la clausola LOCATION per specificare il bucket Amazon S3 che contiene i dati di log di Amazon VPC.

CREATE EXTERNAL TABLE IF NOT EXISTS test_table_vpclogs_parquet ( version int, account_id string, interface_id string, srcaddr string, dstaddr string, srcport int, dstport int, protocol bigint, packets bigint, bytes bigint, start bigint, `end` bigint, action string, log_status string, vpc_id string, subnet_id string, instance_id string, tcp_flags int, type string, pkt_srcaddr string, pkt_dstaddr string, az_id string, sublocation_type string, sublocation_id string, pkt_src_aws_service string, pkt_dst_aws_service string, flow_direction string, traffic_path int ) PARTITIONED BY (region string, date string, hour string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/prefix/AWSLogs/{account_id}/vpcflowlogs/' TBLPROPERTIES ( "EXTERNAL"="true", "skip.header.line.count" = "1", "projection.enabled" = "true", "projection.region.type" = "enum", "projection.region.values" = "us-east-1,us-west-2,ap-south-1,eu-west-1", "projection.date.type" = "date", "projection.date.range" = "2021/01/01,NOW", "projection.date.format" = "yyyy/MM/dd", "projection.hour.type" = "integer", "projection.hour.range" = "00,23", "projection.hour.digits" = "2", "storage.location.template" = "s3://DOC-EXAMPLE-BUCKET/prefix/AWSLogs/${account_id}/vpcflowlogs/${region}/${date}/${hour}" )

Risorse aggiuntive

Per ulteriori informazioni sull'utilizzo di Athena per analizzare i log di flusso del VPC, consulta i seguenti articoli del blog sui big data AWS :