查询网络负载均衡器日志 - Amazon Athena

查询网络负载均衡器日志

使用 Athena 分析和处理来自 Network Load Balancer 的日志。这些日志将接收有关发送到 Network Load Balancer 的传输层安全性 (TLS) 请求的详细信息。您可以使用这些访问日志分析流量模式并解决问题。

在分析 Network Load Balancer 访问日志之前,请启用并配置它们以保存在目标 Amazon S3 存储桶中。有关更多信息以及有关每个网络负载均衡器访问日志条目的信息,请参阅网络负载均衡器的访问日志

为 Network Load Balancer 日志创建表
  1. 将以下 DDL 语句复制并粘贴到 Athena 控制台中。检查 Network Load Balancer 日志记录的语法。根据需要更新语句,以包含与日志记录对应的列和正则表达式。

    CREATE EXTERNAL TABLE IF NOT EXISTS nlb_tls_logs ( type string, version string, time string, elb string, listener_id string, client_ip string, client_port int, target_ip string, target_port int, tcp_connection_time_ms double, tls_handshake_time_ms double, received_bytes bigint, sent_bytes bigint, incoming_tls_alert int, cert_arn string, certificate_serial string, tls_cipher_suite string, tls_protocol_version string, tls_named_group string, domain_name string, alpn_fe_protocol string, alpn_be_protocol string, alpn_client_preference_list string, tls_connection_creation_time string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*):([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-0-9]*) ([-0-9]*) ([-0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?' ) LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/AWS_account_ID/elasticloadbalancing/region';
  2. 修改 LOCATION Amazon S3 存储桶以指定您的 Network Load Balancer 日志的目标。

  3. 在 Athena 控制台中运行查询。查询完成后,Athena 将注册 nlb_tls_logs 表,使其中的数据可以供查询。

示例查询

要查看证书的使用次数,请使用与以下示例类似的查询:

SELECT count(*) AS ct, cert_arn FROM "nlb_tls_logs" GROUP BY cert_arn;

以下查询显示了所用 TLS 版本低于 1.3 的用户数:

SELECT tls_protocol_version, COUNT(tls_protocol_version) AS num_connections, client_ip FROM "nlb_tls_logs" WHERE tls_protocol_version < 'tlsv13' GROUP BY tls_protocol_version, client_ip;

使用以下查询可确定需要较长的 TLS 握手时间的连接:

SELECT * FROM "nlb_tls_logs" ORDER BY tls_handshake_time_ms DESC LIMIT 10;

使用以下查询可识别和统计过去 30 天内协商的 TLS 协议版本和密码套件。

SELECT tls_cipher_suite, tls_protocol_version, COUNT(*) AS ct FROM "nlb_tls_logs" WHERE from_iso8601_timestamp(time) > current_timestamp - interval '30' day AND NOT tls_protocol_version = '-' GROUP BY tls_cipher_suite, tls_protocol_version ORDER BY ct DESC;