从零开始构建安全 AWS VPC 指南
亚马逊网络服务(AWS)虚拟私有云(VPC)是在云端部署应用程序和资源的基本构建块。它提供了 AWS 云中逻辑隔离的部分,您可以在其中启动您定义的虚拟网络中的 AWS 资源。从零开始构建安全的 VPC 对于保护您的数据和应用程序免受未经授权的访问至关重要。本指南将引导您完成设计和配置新 VPC 的基本步骤,涵盖子网、路由表等关键组件,以及实现最佳网络分段和隔离的关键安全注意事项。
设计良好的 VPC 是安全云基础设施的基础。它允许您控制网络环境、定义访问规则,并根据资源的敏感性和功能对其进行分段。通过仔细规划和实施您的 VPC,您可以显著增强 AWS 部署的安全态势,减少攻击面并防止意外数据暴露。本指南将为您提供创建符合您特定需求的强大而安全的 VPC 所需的知识。
理解核心 VPC 概念
在深入配置步骤之前,了解 AWS VPC 的基本概念至关重要:
- VPC (Virtual Private Cloud): 专用于您的 AWS 账户的虚拟网络。它是 AWS 云中逻辑隔离的部分,您可以在其中启动 AWS 资源。
- 子网 (Subnet): VPC 中的 IP 地址范围。您可以将 AWS 资源启动到您创建的子网中。子网由其 CIDR 块定义,该 CIDR 块是 VPC 的 CIDR 块的子集。
- 路由表 (Route Table): 一组规则(称为路由),用于确定来自您的子网或网关的网络流量的导向位置。
- 互联网网关 (Internet Gateway, IGW): 一个 VPC 组件,允许您的 VPC 与互联网之间进行通信。它使您的 VPC 中的实例能够连接到互联网,反之亦然。
- NAT 网关 (Network Address Translation): 一种高可用、可扩展的 NAT 服务,允许私有子网中的实例访问互联网,同时阻止从互联网发起的入站连接。
- 安全组 (Security Group): 充当您实例的虚拟防火墙,用于控制入站和出站流量。它在实例级别运行。
- 网络访问控制列表 (Network Access Control List, NACL): 您的 VPC 的可选安全层,充当防火墙,用于控制进出一个或多个子网的流量。它在子网级别运行。
VPC 分步创建流程
让我们开始构建您的安全 VPC。
1. 规划 IP 地址方案
第一步也是最关键的一步是规划您的 VPC 及其子网的 IP 地址范围。这涉及到为您的 VPC 选择一个无类别域间路由 (CIDR) 块。
-
VPC CIDR 块: 选择一个私有 IP 地址范围,该范围不应与您的本地网络或您可能通过 VPN 或 Direct Connect 连接的任何其他 AWS VPC 重叠。AWS 建议使用 RFC 1918 IP 地址范围(10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16)。CIDR 块范围可以是从 /16(65,536 个 IP 地址)到 /28(16 个 IP 地址)。
- 示例:
10.0.0.0/16为您的 VPC 提供了较大的地址空间。
- 示例:
-
子网 CIDR 块: 将您的 VPC 的 CIDR 块划分为更小的 CIDR 块用于您的子网。确保每个子网的 CIDR 块是 VPC CIDR 块的子集,并且与其他子网不重叠。
- **示例(如果 VPC 为
10.0.0.0/16):- 公共子网 1:
10.0.1.0/24 - 公共子网 2:
10.0.2.0/24 - 私有子网 1:
10.0.10.0/24 - 私有子网 2:
10.0.11.0/24
- 公共子网 1:
- **示例(如果 VPC 为
2. 创建您的 VPC
导航到 AWS 管理控制台中的 VPC 控制面板并创建一个新 VPC。
- 转到 VPC 控制面板 > 您的 VPC > 创建 VPC。
- 名称标签: 为您的 VPC 指定一个描述性名称(例如,
MySecureVPC)。 - IPv4 CIDR 块: 输入您计划的 CIDR 块(例如,
10.0.0.0/16)。 - IPv6 CIDR 块: 如果需要,您可以选择启用 IPv6 CIDR 块。
- 租期 (Tenancy): 对于大多数用例,默认 (Default) 即可。专用 (Dedicated) 以更高的成本提供硬件隔离。
- 点击 创建 VPC。
3. 创建子网
现在,在 VPC 内创建您的公共和私有子网。
- 转到 VPC 控制面板 > 子网 > 创建子网。
- VPC ID: 选择您刚刚创建的 VPC。
- 子网名称: 提供一个名称(例如,
MyPublicSubnet-AZ1)。 - 可用区 (Availability Zone): 选择一个可用区 (AZ)。最佳实践是将资源部署到多个可用区以实现高可用性。
- IPv4 CIDR 块: 输入此子网的 CIDR 块(例如,
10.0.1.0/24)。 - 点击 创建子网。
重复此过程创建所有计划的公共和私有子网,确保它们位于不同的可用区以提高弹性。
4. 创建互联网网关 (IGW)
您的公共子网需要 IGW 来访问互联网。
- 转到 VPC 控制面板 > 互联网网关 > 创建互联网网关。
- 名称标签:
MyVPCInternetGateway。 - 点击 创建互联网网关。
- 创建后,选择 IGW,点击 操作 (Actions),然后选择 附加到 VPC (Attach to VPC)。选择您的 VPC,然后点击 附加互联网网关。
5. 创建路由表
路由表指导您的 VPC 内的流量。您通常至少需要两个:一个用于公共子网,一个用于私有子网。
a. 公共路由表:
- 转到 VPC 控制面板 > 路由表 > 创建路由表。
- 名称标签:
MyPublicRouteTable。 - VPC: 选择您的 VPC。
- 点击 创建路由表。
- 选择新创建的
MyPublicRouteTable。 - 在 路由 (Routes) 选项卡下,点击 编辑路由 (Edit routes)。
- 点击 添加路由 (Add route)。
- 目标 (Destination):
0.0.0.0/0(所有 IPv4 流量)。 - 目标 (Target): 选择 互联网网关 (Internet Gateway) 并选择您的 IGW。
- 点击 保存路由 (Save routes)。
- 关联子网 (Associate Subnets): 转到 子网关联 (Subnet associations) 选项卡,点击 编辑子网关联 (Edit subnet associations),并将您的公共子网与此路由表关联。
b. 私有路由表(使用 NAT 网关):
为了允许私有子网中的实例发起对互联网的出站连接(例如,用于软件更新),同时阻止来自互联网的直接访问,您将使用 NAT 网关。
-
创建 NAT 网关:
- 转到 VPC 控制面板 > NAT 网关 > 创建 NAT 网关。
- 名称:
MyNATGateway。 - 子网: 选择您的其中一个 公共 子网。
- 连接类型:
公共 (Public)。 - 弹性 IP 分配 ID (Elastic IP allocation ID): 点击 分配弹性 IP (Allocate Elastic IP) 以创建并分配一个新的弹性 IP 地址。
- 点击 创建 NAT 网关。
- 注意:NAT 网关会产生费用。对于基本的出站连接,请确保您的公共子网中有足够的 IP 地址可用于 NAT 网关。。
-
创建私有路由表:
- 转到 VPC 控制面板 > 路由表 > 创建路由表。
- 名称标签:
MyPrivateRouteTable。 - VPC: 选择您的 VPC。
- 点击 创建路由表。
- 选择
MyPrivateRouteTable。 - 在 路由 (Routes) 选项卡下,点击 编辑路由 (Edit routes)。
- 点击 添加路由 (Add route)。
- 目标:
0.0.0.0/0。 - 目标: 选择 NAT 网关 (NAT Gateway) 并选择您的 NAT 网关。
- 点击 保存路由 (Save routes)。
- 关联子网: 转到 子网关联 (Subnet associations) 选项卡,点击 编辑子网关联 (Edit subnet associations),并将您的 私有 子网与此路由表关联。
6. 配置安全组
安全组充当实例级别的有状态防火墙。它们根据您定义的规则允许或拒绝流量。
- 最佳实践: 为不同类型的资源(例如,Web 服务器、数据库服务器、应用服务器)创建特定的安全组。避免使用过于宽松的规则。
示例:Web 服务器安全组 (WebServerSG)
- 转到 VPC 控制面板 > 安全组 > 创建安全组。
- 安全组名称:
WebServerSG。 - 描述:
允许 HTTP 和 HTTPS 访问。 - VPC: 选择您的 VPC。
- 入站规则:
- 类型:
HTTP,协议:TCP,端口范围:80,源:0.0.0.0/0(或更具体的受信任 IP 范围)。 - 类型:
HTTPS,协议:TCP,端口范围:443,源:0.0.0.0/0(或更具体的受信任 IP 范围)。 - (可选) 类型:
SSH,协议:TCP,端口范围:22,源:您的受信任 IP 地址/范围(对管理至关重要)。
- 类型:
- 出站规则: 默认情况下,允许所有出站流量 (
0.0.0.0/0)。如果需要,您可以限制此项。 - 点击 创建安全组。
示例:数据库服务器安全组 (DatabaseSG)
- 创建名为
DatabaseSG的新安全组。 - 入站规则:
- 添加一条规则,允许流量通过您的数据库的默认端口(例如,MySQL 为
3306,PostgreSQL 为5432)仅 来自您的应用服务器的安全组(例如,WebServerSG或AppServerSG)。 - 源: 选择 自定义 (Custom),然后输入您的应用服务器安全组的 ID。
- 添加一条规则,允许流量通过您的数据库的默认端口(例如,MySQL 为
- 出站规则: 通常允许所有出站流量。
7. 配置网络访问控制列表 (NACL)
NACL 是在子网级别运行的无状态防火墙。它们充当额外的防御层。
-
有状态 vs. 无状态: 安全组是有状态的(如果允许入站流量,则自动允许出站响应)。NACL 是无状态的(您必须明确定义入站和出站流量的规则)。
-
最佳实践: 除非需要特定的子网级别访问控制,否则 NACL 通常保留默认配置。它们管理起来可能很复杂。
如果您需要使用 NACL:
- 转到 VPC 控制面板 > 网络 ACL > 创建网络 ACL。
- 名称标签:
MyNacl。 - VPC: 选择您的 VPC。
- 点击 创建网络 ACL。
- 选择 NACL,并在 入站规则 (Inbound Rules) 下添加规则。
- 规则编号: NACL 按顺序评估规则,从编号最低的规则开始。使用
100、200、300等数字,以便将来插入规则。 - 允许/拒绝 (Allow/Deny): 指定是允许还是拒绝流量。
- 协议、端口范围、源/目标: 定义流量参数。
- 记住配置相应的 出站规则 (Outbound Rules)。
- 通过转到 子网关联 (Subnet Associations) 选项卡,将 NACL 与您的子网关联。
示例部署场景
考虑一个典型的 Web 应用程序:
- VPC:
10.0.0.0/16 - 公共子网 1 (
us-east-1a):10.0.1.0/24(与MyPublicRouteTable和 IGW 关联) - 公共子网 2 (
us-east-1b):10.0.2.0/24(与MyPublicRouteTable和 IGW 关联) - 私有子网 1 (
us-east-1a):10.0.10.0/24(与MyPrivateRouteTable和 NAT 网关关联) -
私有子网 2 (
us-east-1b):10.0.11.0/24(与MyPrivateRouteTable和 NAT 网关关联) -
互联网网关: 附加到 VPC。
- NAT 网关: 部署在
公共子网 1中,带有弹性 IP。 - 公共路由表: 将
0.0.0.0/0导向 IGW。与公共子网关联。 -
私有路由表: 将
0.0.0.0/0导向 NAT 网关。与私有子网关联。 -
负载均衡器的安全组(位于公共子网中): 允许来自
0.0.0.0/0的 HTTP/HTTPS。 - Web 服务器的安全组(位于私有子网中): 允许来自负载均衡器安全组的 HTTP/HTTPS,以及来自您受信任 IP 的 SSH。
- 数据库的安全组(位于私有子网中): 允许来自 Web 服务器安全组的 MySQL/PostgreSQL。
关键安全注意事项
- 最小权限原则 (Principle of Least Privilege): 仅授予您的安全组和 NACL 必要的权限。尽可能限制源 IP 地址。
- 使用多个可用区: 将您的子网和资源分布在多个可用区 (AZ) 中,以实现高可用性和灾难恢复。这通过在不同的 AZ 中创建子网并将它们与适当的路由表关联来实现。
- 定期审查安全组和 NACL: 随着应用程序的发展,您的安全规则也应随之发展。定期审计和更新它们。
- 避免将敏感资源置于公共子网中: 数据库、应用服务器和其他敏感资源应位于私有子网中。只有需要直接互联网访问的资源(例如负载均衡器或堡垒主机)才应位于公共子网中。
- 考虑使用堡垒主机 (Bastion Hosts): 如果您需要通过 SSH 连接到私有子网中的实例,请考虑在公共子网中使用经过强化的堡垒主机。将对堡垒主机的 SSH 访问限制为已知的 IP 地址。
- VPC 流日志 (VPC Flow Logs): 启用 VPC 流日志以捕获进出您的 VPC 中网络接口的 IP 流量信息。这对于安全监控和故障排除非常宝贵。
- 网络分段 (Network Segmentation): 使用不同的 VPC 和子网来分段环境(例如,开发、预生产、生产)和应用程序的不同层级。
结论
从零开始构建安全的 AWS VPC 涉及对其核心组件进行仔细的规划和配置。通过理解 CIDR 块、子网、路由表,并有效利用安全组和 NACL,您可以为您的 AWS 资源建立一个强大且隔离的网络环境。请记住,安全是一个持续的过程,因此持续的监控、审查和遵循最佳实践对于维护安全的云基础设施至关重要。