查詢 Amazon VPC 流程日誌 - Amazon Athena

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

查詢 Amazon VPC 流程日誌

Amazon Virtual Private Cloud 流量日誌擷取傳入和傳出 VPC 中網路界面之 IP 流量的相關資訊。使用日誌來調查網路流量模式,並識別整個 VPC 網路所遭受的威脅和風險。

若要查詢 Amazon VPC 流程日誌,您有下列兩種選擇:

  • Amazon VPC 主控台 — 使用 Amazon VPC 主控台中的 Athena 整合功能產生 AWS CloudFormation 範本,以建立 Athena 資料庫、工作群組和流程日誌表,並為您進行分割。此範本也會建立一組預先定義流程日誌查詢,您可以使用其取得關於流經 VPC 流量的可行見解。

    如需有關此方法的詳細資訊,請參閱《Amazon VPC 使用者指南》中的使用 Amazon Athena 查詢流程日誌

  • Amazon Athena 主控台 – 直接在 Athena 主控台中建立資料表和查詢。如需詳細資訊,請繼續閱讀此頁內容。

為自訂 VPC 流程日誌建立和查詢資料表

在 Athena 中開始查詢日誌之前,請啟用 VPC 流程日誌,並將它們設定為儲存到您的 Amazon S3 儲存貯體。建立日誌之後,讓它們執行幾分鐘以收集一些資料。日誌是以 Athena 可讓您直接查詢的 GZIP 壓縮格式建立。

建立 VPC 流程日誌時,若您想要指定要在流程日誌中傳回的欄位以及欄位出現的順序,請使用自訂格式。如需有關流程日誌記錄的詳細資訊,請參閱《Amazon VPC 使用者指南》中的流程日誌記錄

一般考量事項

在 Athena 中為 Amazon VPC 流程日誌建立資料表時,請記住以下幾點:

  • 預設情況下,在 Athena 中,Parquet 將會依名稱存取欄。如需詳細資訊,請參閱處理結構描述更新

  • 使用流程日誌記錄中的名稱作為 Athena 中的資料欄名稱。Athena 結構描述中的資料欄名稱應與 Amazon VPC 流程日誌中的欄位名稱完全相符,但有以下差異:

    • 在 Athena 資料欄名稱中,將 Amazon VPC 日誌欄位名稱中的連字號替換為底線。在 Athena 中,資料庫名稱、資料表名稱和資料欄名稱唯一接受的字元為小寫字母、數字和底線字元。如需詳細資訊,請參閱資料庫、資料表和資料欄名稱

    • 透過反引號將流程日誌記錄名稱逸出為 Athena 中的保留關鍵字

  • VPC 流程記錄是 AWS 帳戶 特定的。當您將日誌檔案發布到 Amazon S3 時,Amazon VPC 在 Amazon S3 中建立的路徑會包含用來建立流量日誌的 AWS 帳戶 的 ID。如需詳細資訊,請參閱《Amazon VPC 使用者指南》中的發布流量日誌至 Amazon S3

Amazon VPC 流程日誌的 CREATE TABLE 陳述式

以下程序會建立 Amazon VPC 流程日誌的 Amazon VPC 資料表。當您使用自訂格式建立流程日誌時,需要建立資料表,其欄位符合您在建立流程日誌時指定的欄位,而順序與您指定它們的順序相同。

為 Amazon VPC 流量日誌建立 Athena 資料表
  1. 在 Athena 主控台查詢編輯器中輸入類似下列的 DDL 陳述式,遵循 一般考量事項 區段中的準則。陳述式範例會建立擁有 Amazon VPC 流程日誌版本 2 至 5 (如流程日誌記錄所記載) 之資料欄的資料表。如果您使用不同組的資料欄或資料欄順序,請據此修改陳述式。

    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");

    請注意以下重點:

    • 查詢會指定ROW FORMAT DELIMITED並省略指定 SerDe。這表示該查詢會使用 適用於 CSV、TSV 和自訂分隔檔案的 LazySimpleSerDe。在這個查詢中,欄位以空格結尾。

    • PARTITIONED BY 子句使用 date 類型。這樣就可以在查詢中使用數學運算子來選取特定日期之前或之後的項目。

      注意

      因為 date 是 DDL 陳述式中保留的關鍵字,它會溢出反引號字元。如需詳細資訊,請參閱 保留的關鍵字

    • 針對具有不同自訂格式的 VPC 流程日誌,請修改欄位,使其符合您建立流程日誌時指定的欄位。

  2. 修改 LOCATION 's3://DOC-EXAMPLE-BUCKET/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/' 來指向包含日誌資料的 Amazon S3 儲存貯體。

  3. 在 Athena 主控台中執行查詢。查詢完成之後,Athena 會註冊 vpc_flow_logs 資料表,讓其中的資料可供您發出查詢。

  4. 建立能夠讀取資料的分割區,如下列查詢範例所示。這個查詢針對指定的日期建立單一分割區。視需要將預留位置換成日期和位置。

    注意

    這個查詢針對您指定的日期,只建立單一分割區。若要自動執行程序,請使用指令碼以執行此查詢和依此針對 year/month/day 建立分割區,或使用指定分割區投影CREATE TABLE 陳述式。

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

vpc_flow_logs 資料表的查詢範例

使用 Athena 主控台中的查詢編輯器在您建立的資料表上執行 SQL 陳述式。您可以儲存查詢、檢視先前的查詢,或以 CSV 格式下載查詢結果。在下列範例中,將 vpc_flow_logs 替換為您的資料表名稱。根據自己的需求修改欄值和其他變數。

下列範例查詢會列出指定日期的最多 100 個流程日誌。

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

以下查詢列出所有拒絕的 TCP 連線,並使用新建立的日期新分割欄 date,以從中擷取發生這些事件是星期幾。

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;

若要查看您的哪一個伺服器接收最多的 HTTPS 請求,請使用下列查詢。它計算 HTTPS 連接埠 443 所接收的封包數、依目的地 IP 地址分組,然後傳回上週的前 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;

以 Parquet 格式為流程日誌建立資料表

以下程序會以 Parquet 格式建立 Amazon VPC 流程日誌的 Amazon VPC 資料表。

為 Amazon VPC 流量日誌以 Parquet 格式建立 Athena 資料表
  1. 在 Athena 主控台查詢編輯器中輸入類似下列的 DDL 陳述式,遵循 一般考量事項 區段中的準則。陳述式範例會建立擁有 Amazon VPC 流程日誌版本 2 至 5 (如 Parquet 格式、Hive 每小時已分割的流程日誌記錄所記載) 之資料欄的資料表。如果您沒有小時分割區,請從 PARTITIONED BY 子句中移除 hour

    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. 修改 LOCATION 's3://DOC-EXAMPLE-BUCKET/prefix/AWSLogs/' 來指向包含日誌資料的 Amazon S3 路徑。

  3. 在 Athena 主控台中執行查詢。

  4. 如果您的資料採用 Hive 相容的格式,請在 Athena 主控台中執行以下命令來更新和載入中繼存放區中的 Hive 分割區。查詢完成後,您可以在 vpc_flow_logs_parquet 資料表中查詢資料。

    MSCK REPAIR TABLE vpc_flow_logs_parquet

    如果您沒有使用 Hive 相容的資料,請執行 ALTER TABLE ADD PARTITION 來載入分割區。

如需有關使用 Athena 查詢 Parquet 格式的 Amazon VPC 流程日誌的詳細資訊,請參閱 AWS 大數據部落格中的使用 Apache Parquet 格式的 VPC 流程日誌最佳化效能並降低網路分析成本

使用分割區投影為 Amazon VPC 流程日誌建立和查詢資料表

使用如下 CREATE TABLE 陳述句,以建立資料表、分割資料表,並使用分割區投影自動填入分割區。將範例中的資料表名稱 test_table_vpclogs 替換為您的資料表名稱。編輯 LOCATION 子句以指定包含 Amazon VPC 日誌資料的 Amazon S3 儲存貯體。

以下 CREATE TABLE 陳述式適用於以非 Hive 樣式分割格式交付的 VPC 流程日誌。此範例允許多帳戶彙總。如果您要將多個帳戶的 VPC 流程日誌集中到一個 Amazon S3 儲存貯體,則必須在 Amazon S3 路徑中輸入帳戶 ID。

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://$LOCATION_OF_LOGS/AWSLogs/${accid}/vpcflowlogs/${region}/${day}" )

test_table_vpclogs 的查詢範例

下列查詢範例會查詢由前面 CREATE TABLE 陳述式所建立的 test_table_vpclogs。將查詢中的 test_table_vpclogs 替換為您自己的資料表名稱。根據自己的需求修改欄值和其他變數。

若要在指定時段內依時間順序傳回前 100 個存取日誌項目,請執行如下查詢。

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

若要查看哪個伺服器在指定時段內接收前十個 HTTP 封包,請執行如下查詢。查詢計算 HTTPS 連接埠 443 所接收的封包數、依目的地 IP 地址分組,然後傳回上週的前 10 個查詢。

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

若要傳回在指定時段內建立的日誌,請執行如下查詢。

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'

若要傳回指定時段之間的來源 IP 地址的存取日誌,請執行如下查詢。

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

若要列出拒絕的 TCP 連接,請執行如下查詢。

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

若要傳回以 10.117 開頭的 IP 地址範圍的存取日誌,請執行如下查詢。

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

若要傳回特定時間範圍之間的目的地 IP 地址的存取日誌,請執行如下查詢。

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

使用分割區投影,以 Apache Parquet 格式為流程日誌建立資料表

下列 VPC 流程日誌的資料分割投影 CREATE TABLE 陳述式採用 Apache Parquet 格式,與 Hive 不相容,並按小時和日期而非按日期進行分割。將範例中的資料表名稱 test_table_vpclogs_parquet 替換為您的資料表名稱。編輯 LOCATION 子句以指定包含 Amazon VPC 日誌資料的 Amazon S3 儲存貯體。

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}" )

其他資源

如需有關使用 Athena 分析 VPC 流程日誌的詳細資訊,請參閱以下 AWS 大數據部落格文章。