确定您 VPC 的安全要求 - AWS 规范性指导

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

确定您 VPC 的安全要求

重要提示

在测试环境中设计和测试 VPC 的出站流量安全架构是一种最佳实践。在开发环境中测试架构变更可以减轻推送意外系统行为的实时风险。

在更改网络的出站流量模式之前,请务必了解应用程序按预期运行所需的流量模式。这些信息可以帮助您确定在重新架构网络时允许哪些流量模式和拒绝哪些流量模式。

要分析您的 VPC 现有的出站流量模式,请先打开 VPC 流日志。然后,使用测试环境在各种使用场景中运行您的应用程序,并分析流日志中的模拟流量。

VPC 流日志会记录您的 VPC 的入站和出站 IP 流量。然后,亚马逊 VPC 将日志发送到亚马逊简单存储服务 (Amazon S3) 或亚马逊。 CloudWatch您可以使用以下任一工具查看和分析日志:

  • (适用于 Amazon S3)Amazon Athena

  • (适用于 CloudWatch) CloudWatch 日志见解

有关更多信息和查询示例,请参阅以下内容:

有关 VPC 流日志捕获的信息类型的详细信息,请参阅 Amazon VPC 用户指南中的流日志记录示例

注意

VPC 流日志不会捕获应用程序层(第 7 层)信息,例如 DNS 主机名。如果您的安全要求需要分析应用程序层数据,则可以部署 AWS Network Firewall 以捕获所需的详细信息。有关更多信息,请参阅本指南的使用 AWS Network Firewall 和 DNS 主机名限制 VPC 的出站流量部分。

使用 VPC 流日志分析您的 VPC 的出站流量的最佳实践

使用 Amazon Athena CloudWatch 或 Logs Insights 查询分析您的 VPC 流日志时,请务必执行以下操作:

  • 确定和分析流经连接到您的应用程序使用的资源的弹性网络接口的入站和出站流量。

  • 确定和分析流经连接到 NAT 网关的网络接口的应用程序流量。

  • 通过将查询中的源地址设为网络接口的私有 IP 地址,确保捕获到网络接口的所有出站流量。

  • 写入您的查询,仅关注意外流量模式。(例如,如果您的应用程序与第三方实体(例如 HTTPS API 端点)进行通信,则您可以在构造查询时不包含这些实体。)

  • 调查每个端口和目标 IP 地址的有效性。(例如,对于堡垒主机或者使用 SSH 从 Git 克隆存储库的主机而言,出站目标端口 22 可能是正常的。)

注意

如果您是首次使用 Amazon Athena,请务必配置查询结果位置。有关其说明,请参阅 Amazon Athena 用户指南中的使用 Athena 控制台指定查询结果位置

Amazon Athena 查询示例

返回来自特定网络接口的出站管理员流量的 Athena 查询示例

以下 Athena 查询返回来自网络接口的前 200 条出站管理员流量的结果,该网络接口的 IP 地址为 10.100.0.10

SELECT * FROM "<vpc_flow_logs_table_name>" WHERE interface_id = 'eni-1234567890000000' AND srcaddr LIKE '10.100.0.10' AND dstport < 1024 LIMIT 200;

输出示例

#

1

version

2

account_id

<account-id>

interface_id

eni-123456789000000

srcaddr

10.32.0.10

dstaddr

11.22.33.44

srcport

36952

dstport

443

protocol

6

packets

25

bytes

5445

start

1659310200

end

1659310225

action

ACCEPT

log_status

OK

date

2022-07-16

注意

此模式中的输出格式仅用于演示目的,在您的系统上可能会有所不同。

返回从特定 VPC 接收最多流量的外部 IP 地址的 Athena 查询示例

以下 Athena 查询可以返回从 VPC 接收最多出站流量的外部 IP 地址和端口,CIDR 块以“10.32”开头:

SELECT dstport, dstaddr, count(*) AS count FROM "<vpc_flow_logs_table_name>" WHERE dstaddr not like '10.32%' AND interface_id = 'eni-1234567890000000' GROUP BY dstport, dstaddr ORDER BY count desc LIMIT 200;

输出示例

#

Dstport

Dstaddr

count

1

443

52.x.x.x

1442

2

443

63.x.x.x

1201

3

443

102.x.x.x

887

返回来自特定 VPC 的被拒绝的出站流量的 Athena 查询示例

以下 Athena 查询可以返回来自 VPC 的被拒绝的出站流量,CIDR 块以“10.32”开头:

SELECT *              FROM "<vpc_flow_logs_table_name>"  WHERE srcaddr like '10.32%' AND action LIKE 'REJECT'

输出示例

#

1

version

2

account_id

<account-id>

interface_id

eni-123456789000000

srcaddr

10.32.0.10

dstaddr

11.22.33.44

srcport

36952

dstport

443

protocol

6

packets

25

bytes

5445

start

1659310200

end

1659310225

action

REJECT

log_status

OK

date

2022-07-16

注意

此模式中的输出格式仅用于演示目的,在您的系统上可能会有所不同。

有关如何解读 Athena 查询结果的更多信息,请参阅 Amazon VPC 用户指南中的流日志记录

CloudWatch 日志见解查询示例

CloudWatch Logs Insights 查询示例,该示例返回来自特定网络接口的出站管理员流量

以下 CloudWatch Logs Insights 查询返回来自 IP 地址为 10.100. 0.10 的网络接口的出站管理员流量的前 200 个结果:

fields @timestamp, @message | filter interfaceId = 'eni-1234567890000000' | filter srcAddr = '10.100.0.10' | filter dstPort < 1024 | limit 200

输出示例

Field

Value

@ingestionTime

1659310250813

@log

<account-id>:/aws/vpc/flowlogs

@logStream

eni-123456789000000-all

@message

2 <account-id> eni-123456789000000 10.100.0.10 11.22.33.44 36952 443 6 25 5445 1659310200 1659310225 ACCEPT OK

@timestamp

1659310200000

accountId

<account-id>

action

ACCEPT

bytes

5445

dstAddr

11.22.33.44

dstPort

443

end

1659310225

interfaceId

eni-123456789000000

logStatus

OK

packets

25

protocol

6

srcAddr

10.100.0.10

srcPort

36952

start

1659310200

version

2

示例 CloudWatch Logs Insights 查询,该查询返回来自特定 VPC 的流量最多的外部 IP 地址

以下 CloudWatch Logs Insights 查询返回从 CIDR 块以 '10.32' 开头的 VPC 接收最多出站流量的外部 IP 地址和端口:

filter @logstream = 'eni-1234567890000000' | stats count(*) as count by dstAddr, dstPort | filter dstAddr not like '10.32' | order by count desc | limit 200

输出示例

#

dstAddr

dstPort

count

1

52.x.x.x

443

439

2

51.79.x.x

63.x.x.x

25

返回来自特定 VPC 的被拒绝出站流量的 CloudWatch 日志洞察查询示例

以下 CloudWatch Logs Insights 查询返回来自 CIDR 块以 '10.32' 开头的 VPC 的被拒绝的出站流量:

filter @logstream = 'eni-0123456789000000' | fields @timestamp, @message | filter action='REJECT'

输出示例

Field

Value

@ingestionTime

1666991000899

@log

<account-id>:/aws/vpc/flowlogs

@logStream

eni-0123456789000000-all

@message

2 <account-id> 'eni-0123456789000000' 185.x.x.x 10.10.2.222 55116 11211 17 1 43 1666990939 1666990966 REJECT OK

@timestamp

1666990939000

accountId

<account-id>

action

REJECT

bytes

43

dstAddr

10.10.2.222

dstPort

11211

end

1666990966

interfaceId

'eni-0123456789000000'

logStatus

OK

数据包

1

protocol

17

srcAddr

185.x.x.x

srcPort

55116

start

1666990939

version

2