巧用VPC Flow Logs + Athena,云上异常流量无处藏身

云上网络攻击日益频繁,传统流量分析工具成本高且配置复杂。本文深入讲解如何通过VPC Flow Logs收集元数据,并借助Athena的SQL引擎快速识别异常通信模式——从端口扫描到数据外泄,让隐形攻击无处可藏。

巧用VPC Flow Logs + Athena,云上异常流量无处藏身
封面图:ZuCDN · ZuCDN 原创

云上安全盲区:为什么需要流量分析

实际操作要点

说到异常流量分析,很多问题都出在细节上。在云环境中,安全团队往往投入大量精力在主机入侵检测、漏洞扫描和身份权限管控上,却容易忽略一个基础但关键的位置——网络流量。攻击者一旦突破边界,会在内部横向移动、探测敏感服务、建立C2信道或窃取数据,而这些行为都会在VPC Flow Logs中留下痕迹。但大多数团队长期处于“有日志、没分析”的状态,因为传统网络流量分析工具(如NetFlow收集器)在云端部署繁琐,且按流量计费可能产生高昂成本。

VPC Flow Logs作为AWS原生的网络日志服务,可以捕获弹性网卡上所有出入流量元数据(五元组、包数、字节数、动作等),且不产生额外传输费用。配合Amazon Athena的按需SQL查询能力,我们就能以极低的成本对海量流量日志进行任意维度的异常流量分析,而不需要预置任何分析集群。

异常流量分析的四大典型场景

配置前的检查

在开始动手之前,先梳理清楚哪些网络行为值得重点关注。基于实际攻防经验,以下四类事件出现的频率最高,且VPC Flow Logs都能有效捕获:

  • 未预期的出站连接:内网主机主动访问已知恶意IP、云存储服务或非标准端口,可能表示数据外泄或僵尸网络活动。
  • 端口扫描与探测:同一源IP在短时间内对多个目标IP的多个端口发起SYN请求,即使被防火墙拒绝,Flow Logs中的REJECT记录也会暴露出扫描行为。
  • 非工作时段活跃:凌晨2点业务低峰期,某台Web服务器大量对外建连,很可能已经被攻陷。
  • 拒绝连接突增:某一时刻大量REJECT流量指向同一目标,通常由配置错误或攻击导致,也可能是DDoS反射攻击的预兆。

传统上,发现这些问题需要部署独立的网络检测设备或购买商业SIEM。但使用Athena查询Flow Logs,只需要几条SQL就能得到结果,且查询费用按扫描数据量计费(通常每月几美元)。

异常流量分析:实践步骤:从启用日志到查询异常

1. 开启VPC Flow Logs并选择格式

在AWS控制台选择目标VPC、子网或弹性网卡,创建Flow Logs时推荐使用自定格式,明确包含以下字段:version account-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status。注意添加log-status字段,便于后续过滤SKIPDATA记录。将日志发送到Amazon S3桶,建议按AWSLogs/account-id/vpcflowlogs/region/YYYY/MM/DD/目录结构存储,以便Athena通过分区过滤快速定位。

2. 在Athena中建表

使用AWS Glue Crawler自动识别chema,或手动执行以下DDL(以Parquet格式为例,压缩比更高、查询更快):

CREATE EXTERNAL TABLE vpc_flow_logs (
  version int,
  account_id string,
  interface_id string,
  srcaddr string,
  dstaddr string,
  srcport int,
  dstport int,
  protocol int,
  packets bigint,
  bytes bigint,
  start bigint,
  end bigint,
  action string,
  log_status string
)
PARTITIONED BY (region string, day string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://your-bucket/AWSLogs/account-id/vpcflowlogs/';

ALTER TABLE vpc_flow_logs ADD PARTITION (region='us-east-1', day='2025-03-01') 
LOCATION 's3://.../us-east-1/2025/03/01/';

建立分区后,执行MSCK REPAIR TABLE即可加载所有已有分区。建议每天设置一个定时任务(CloudWatch Events + Lambda)自动加载新分区,保证日志可实时查询。

3. 针对异常流量分析的SQL查询模板

以下为四个高频场景的查询示例,读者可直接复制到Athena控制台运行,注意替换dayregion参数以缩小扫描范围、降低成本。

🔍 场景一:发现被拒绝连接最多的外部IP

SELECT srcaddr, COUNT(*) AS reject_count
FROM vpc_flow_logs
WHERE action = 'REJECT' 
  AND day = '2025-03-01'
  AND region = 'ap-northeast-1'
GROUP BY srcaddr
ORDER BY reject_count DESC
LIMIT 20;

这个查询会直接罗列在3月1日东京区域被VPC安全组或NACL拒绝最多的源IP。如果某个IP的拒绝次数超过数千次且来源不明,基本可以判定为扫描行为。

🔍 场景二:发现非工作时段(22:00-06:00)的高流量出站

SELECT srcaddr, dstaddr, dstport, SUM(bytes) AS total_bytes
FROM vpc_flow_logs
WHERE action = 'ACCEPT'
  AND from_unixtime(start) NOT BETWEEN '2025-03-01 06:00:00' AND '2025-03-01 22:00:00'
  AND day = '2025-03-01'
  AND region = 'ap-northeast-1'
GROUP BY srcaddr, dstaddr, dstport
HAVING SUM(bytes) > 100000000
ORDER BY total_bytes DESC;

注意这里使用start字段的时间戳转换为本地时间过滤。出站流量超过100MB且发生在深夜,则需要重点排查是否存在数据窃取或挖矿通信。

🔍 场景三:识别横向移动(同一源IP连接大量内部目标)

SELECT srcaddr, COUNT(DISTINCT dstaddr) AS internal_targets
FROM vpc_flow_logs
WHERE action = 'ACCEPT'
  AND dstaddr LIKE '10.%'  -- 假设内网段是10.x.x.x
  AND day = '2025-03-01'
  AND region = 'ap-northeast-1'
GROUP BY srcaddr
HAVING COUNT(DISTINCT dstaddr) > 10
ORDER BY internal_targets DESC;

一旦发现某台主机短时间内连接了大量不同的内部IP,很可能是攻击者正利用已失陷主机进行网络扫描或传播。

🔍 场景四:检测常见恶意端口(如SSH、RDP、Redis 6379)的入站攻击

SELECT srcaddr, dstport, COUNT(*) AS attempts
FROM vpc_flow_logs
WHERE dstport IN (22, 3389, 6379, 27017, 3306)
  AND action = 'REJECT'
  AND day = '2025-03-01'
  AND region = 'ap-northeast-1'
GROUP BY srcaddr, dstport
HAVING COUNT(*) > 50
ORDER BY attempts DESC;

互联网上的自动化扫描器会不断尝试常见服务端口,如果某个srcaddr针对同一端口产生大量拒绝记录,可在安全组中将其加入黑名单,或利用AWS WAF做更精细的限速。

4. 结果验证与自动化响应

每次查询结果需要人工研判——例如拒绝连接突增也可能是因为配置错误的健康检查。建议在Athena查询后,手动查看源IP的历史行为:用SELECT * FROM vpc_flow_logs WHERE srcaddr='x.x.x.x' LIMIT 100快速浏览该IP的完整通信记录。如果确认是恶意流量,可以使用CloudWatch Events + Lambda自动更新安全组规则,或触发Cortex XSOAR等SOAR平台执行封禁。同时,将Athena查询结果导出到S3,用于长期合规审计。

成本控制与性能调优建议

故障定位思路

使用Athena查询Flow Logs最大的优势是按扫描数据量付费(5美元/TB)。但如果不加限制地扫描全量日志,一个月的单一查询也可能扫出几GB数据。有效控制成本的方法如下:

  • 始终使用分区过滤:在WHERE中指定regionday,避免扫描整个Bucket。
  • 使用列式存储格式:强烈建议Flow Logs以Parquet格式写入S3,相比原始JSON可减少70%以上扫描量。
  • 设置查询超时与数据扫描限制:在Athena工作组的设置中配置每个查询最大扫描数据量(例如10GB),避免意外大查询超预算。
  • 汇总查询结果到单独表:对于每日必看的指标(如TOP拒绝IP),可以编写定时查询将结果写入另一个S3表,后续分析直接查询汇总表。

结语:让日志真正产生价值

容易忽略的细节

VPC Flow Logs + Athena的组合在安全圈早已不是秘密,但真正落地到日常异常流量分析中却需要正确的姿势。许多团队花费大量时间搭建复杂的流处理管道,而忽视了最基础的SQL查询能力。本文提供的四个查询模板可以直接复用,读者可根据自身业务调整端口、时段和阈值。当你能在几分钟内从数十亿条Flow Logs中揪出扫描器和数据外泄行为时,云上安全就不再是黑盒。

最后强调一个原则:先验证,再变更。在自动封禁之前,务必通过多重证据(如CloudTrail、GuardDuty发现)交叉确认,防止误阻断导致业务中断。理解流量背后的业务含义,比单纯执行SQL更重要。后续只要定期检查关键指标,异常流量分析就不会变成维护负担。

延伸阅读