本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
确定您 VPC 的安全要求
重要提示
在测试环境中设计和测试 VPC 的出站流量安全架构是一种最佳实践。在开发环境中测试架构变更可以减轻推送意外系统行为的实时风险。
在更改网络的出站流量模式之前,请务必了解应用程序按预期运行所需的流量模式。这些信息可以帮助您确定在重新架构网络时允许哪些流量模式和拒绝哪些流量模式。
要分析您的 VPC 现有的出站流量模式,请先打开 VPC 流日志。然后,使用测试环境在各种使用场景中运行您的应用程序,并分析流日志中的模拟流量。
VPC 流日志会记录您的 VPC 的入站和出站 IP 流量。然后,亚马逊 VPC 将日志发送到亚马逊简单存储服务 (Amazon S3) 或亚马逊。 CloudWatch您可以使用以下任一工具查看和分析日志:
(适用于 Amazon S3)Amazon Athena
(适用于 CloudWatch) CloudWatch 日志见解
有关更多信息和查询示例,请参阅以下内容:
查询 Amazon VPC 流日志(Amazon Athena 用户指南)
如何在我的 VPC 流 CloudWatch 日志中使用日志见解查询?
(AWS 知识中心) CloudWatch 日志见解查询语法(Amazon CloudWatch 日志用户指南)
有关 VPC 流日志捕获的信息类型的详细信息,请参阅 Amazon VPC 用户指南中的流日志记录示例。
注意
VPC 流日志不会捕获应用程序层(第 7 层)信息,例如 DNS 主机名。如果您的安全要求需要分析应用程序层数据,则可以部署 AWS Network Firewall
使用 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 |