从零开始构建安全AWS VPC的指南

通过规划CIDR范围、公有和私有子网、路由表、NAT、安全组和流日志,构建一个安全的AWS VPC。

从零开始构建安全AWS VPC的指南

AWS VPC为您的云资源提供了一个私有网络边界,但默认配置通常不足以满足生产环境需求。如果您将数据库放在公有子网中,重用重叠的CIDR范围,或开放宽泛的安全组规则,可能会造成日后难以解决的问题。

本指南将向您展示如何从零开始构建一个安全的AWS VPC,包括用于入口点的公有子网、用于应用程序和数据库工作负载的私有子网、路由表、NAT、安全组以及基本监控。

理解核心VPC概念

在深入配置步骤之前,掌握AWS VPC的基本概念至关重要:

  • VPC(虚拟私有云): 专属于您AWS账户的虚拟网络。它是AWS云中一个逻辑隔离的部分,您可以在其中启动AWS资源。
  • 子网: VPC中的IP地址范围。您可以将AWS资源启动到您创建的子网中。子网由其CIDR块定义,该块是VPC CIDR块的子集。
  • 路由表: 一组规则(称为路由),用于确定子网或网关的网络流量去向。
  • 互联网网关(IGW): 一个VPC组件,允许具有公有IP地址和网关路由的资源进行互联网可路由流量。
  • NAT网关(网络地址转换): 一种高可用且可扩展的NAT服务,使私有子网中的实例能够访问互联网,同时阻止来自互联网的入站连接。
  • 安全组: 作为实例的虚拟防火墙,用于控制入站和出站流量。它在实例级别运行。
  • 网络访问控制列表(NACL): VPC的可选安全层,作为防火墙控制进出单个或多个子网的流量。它在子网级别运行。

逐步创建VPC

让我们开始构建您的安全VPC。

1. 规划您的IP地址方案

第一步也是最关键的一步是规划VPC及其子网的IP地址范围。这涉及为您的VPC选择一个无类别域间路由(CIDR)块。

  • VPC CIDR块: 选择一个不与您的本地网络或您可能通过VPN或Direct Connect连接的其他AWS VPC重叠的私有IP地址范围。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

2. 创建您的VPC

导航到AWS管理控制台中的VPC仪表板,创建一个新的VPC。

  1. 转到VPC仪表板 > 您的VPC > 创建VPC
  2. 名称标签: 为您的VPC提供一个描述性名称(例如MySecureVPC)。
  3. IPv4 CIDR块: 输入您规划的CIDR块(例如10.0.0.0/16)。
  4. IPv6 CIDR块: 如果需要,您可以选择启用IPv6 CIDR块。
  5. 租户: 对于大多数用例,默认是合适的。专用提供硬件隔离,但成本更高。
  6. 点击创建VPC

3. 创建子网

现在,在VPC内创建您的公有和私有子网。

  1. 转到VPC仪表板 > 子网 > 创建子网
  2. VPC ID: 选择您刚刚创建的VPC。
  3. 子网名称: 提供一个名称(例如MyPublicSubnet-AZ1)。
  4. 可用区: 选择一个可用区(AZ)。最佳实践是将资源部署到多个AZ以实现高可用性。
  5. IPv4 CIDR块: 输入此子网的CIDR块(例如10.0.1.0/24)。
  6. 点击创建子网

重复此过程以创建所有规划的公有和私有子网,确保它们位于不同的可用区以实现弹性。

4. 创建互联网网关(IGW)

您的公有子网需要IGW才能访问互联网。

  1. 转到VPC仪表板 > 互联网网关 > 创建互联网网关
  2. 名称标签: MyVPCInternetGateway
  3. 点击创建互联网网关
  4. 创建后,选择IGW,点击操作,然后选择附加到VPC。选择您的VPC并点击附加互联网网关

5. 创建路由表

路由表引导VPC内的流量。您通常至少需要两个:一个用于公有子网,一个用于私有子网。

a. 公有路由表:

  1. 转到VPC仪表板 > 路由表 > 创建路由表
  2. 名称标签: MyPublicRouteTable
  3. VPC: 选择您的VPC。
  4. 点击创建路由表
  5. 选择新创建的MyPublicRouteTable
  6. 路由选项卡下,点击编辑路由
  7. 点击添加路由
  8. 目标: 0.0.0.0/0(所有IPv4流量)。
  9. 目标: 选择互联网网关并选择您的IGW。
  10. 点击保存路由
  11. 关联子网: 转到子网关联选项卡,点击编辑子网关联,并将您的公有子网与此路由表关联。

b. 私有路由表(带NAT网关):

为了允许私有子网中的实例启动到互联网的出站连接(例如用于软件更新),而无需直接从互联网访问,您将使用NAT网关。

  1. 创建NAT网关:

    • 转到VPC仪表板 > NAT网关 > 创建NAT网关
    • 名称: MyNATGateway
    • 子网: 选择您的公有子网之一。
    • 连接类型: 公有
    • 弹性IP分配ID: 点击分配弹性IP以创建并分配一个新的弹性IP地址。
    • 点击创建NAT网关
    • 注意:NAT网关会产生费用。对于基本的出站连接,请确保您的公有子网中有足够的IP地址可用于NAT网关。
  2. 创建私有路由表:

    • 转到VPC仪表板 > 路由表 > 创建路由表
    • 名称标签: MyPrivateRouteTable
    • VPC: 选择您的VPC。
    • 点击创建路由表
    • 选择MyPrivateRouteTable
    • 路由选项卡下,点击编辑路由
    • 点击添加路由
    • 目标: 0.0.0.0/0
    • 目标: 选择NAT网关并选择您的NAT网关。
    • 点击保存路由
    • 关联子网: 转到子网关联选项卡,点击编辑子网关联,并将您的私有子网与此路由表关联。

6. 配置安全组

安全组在实例级别充当有状态防火墙。它们根据您定义的规则允许或拒绝流量。

  • 最佳实践: 为不同类型的资源(例如Web服务器、数据库服务器、应用服务器)创建特定的安全组。避免使用过于宽松的规则。

示例:Web服务器安全组(WebServerSG

  1. 转到VPC仪表板 > 安全组 > 创建安全组
  2. 安全组名称: WebServerSG
  3. 描述: 允许HTTP和HTTPS访问
  4. VPC: 选择您的VPC。
  5. 入站规则:
    • 类型:HTTP,协议:TCP,端口范围:80,源:0.0.0.0/0(或更具体的可信IP范围)。
    • 类型:HTTPS,协议:TCP,端口范围:443,源:0.0.0.0/0(或更具体的可信IP范围)。
    • (可选) 类型:SSH,协议:TCP,端口范围:22,源:您的可信IP地址/范围(对于管理至关重要)。
  6. 出站规则: 默认情况下,允许所有出站流量(0.0.0.0/0)。如果需要,您可以限制此规则。
  7. 点击创建安全组

示例:数据库服务器安全组(DatabaseSG

  1. 创建一个名为DatabaseSG的新安全组。
  2. 入站规则:
    • 添加一条规则,允许流量到达数据库的默认端口(例如MySQL的3306,PostgreSQL的5432来自应用服务器的安全组(例如WebServerSGAppServerSG)。
    • 源: 选择自定义,然后输入您的应用服务器安全组的ID。
  3. 出站规则: 通常允许所有出站流量。

7. 配置网络访问控制列表(NACL)

NACL是无状态防火墙,在子网级别运行。它们作为额外的防御层。

  • 有状态与无状态: 安全组是有状态的(如果您允许入站流量,出站响应会自动允许)。NACL是无状态的(您必须明确为入站和出站流量定义规则)。

  • 最佳实践: 除非需要特定的子网级别访问控制,否则NACL通常保留默认配置。它们可能难以管理。

如果您需要使用NACL:

  1. 转到VPC仪表板 > 网络ACL > 创建网络ACL
  2. 名称标签: MyNacl
  3. VPC: 选择您的VPC。
  4. 点击创建网络ACL
  5. 选择NACL,在入站规则下,添加规则。
  6. 规则编号: NACL按顺序评估规则,从编号最小的规则开始。使用像100200300这样的编号,以便将来插入规则。
  7. 允许/拒绝: 指定是允许还是拒绝流量。
  8. 协议、端口范围、源/目标: 定义流量参数。
  9. 记得配置相应的出站规则
  10. 通过转到子网关联选项卡,将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服务器的安全组(在私有子网中): 允许来自负载均衡器SG的HTTP/HTTPS,以及来自您可信IP的SSH。

  • 数据库的安全组(在私有子网中): 允许来自Web服务器SG的MySQL/PostgreSQL。

关键安全考虑

  • 最小权限原则: 仅授予安全组和NACL必要的权限。尽可能限制源IP地址。
  • 使用多个可用区: 将子网和资源分布到多个AZ以实现高可用性和灾难恢复。这通过在不同AZ创建子网并将其与适当的路由表关联来实现。
  • 定期审查安全组和NACL: 随着应用程序的发展,您的安全规则也应随之变化。定期审计和更新它们。
  • 避免将敏感资源放在公有子网中: 数据库、应用服务器和其他敏感资源应位于私有子网中。只有需要直接互联网访问的资源(如负载均衡器或堡垒主机)才应放在公有子网中。
  • 考虑堡垒主机: 如果您需要通过SSH进入私有子网中的实例,请考虑在公有子网中使用加固的堡垒主机。将堡垒主机的SSH访问限制为已知IP地址。
  • VPC流日志: 启用VPC流日志以捕获进出VPC网络接口的IP流量信息。这对于安全监控和故障排除非常宝贵。
  • 网络分段: 使用不同的VPC和子网来分段环境(例如开发、预发布、生产)以及应用程序的不同层级。

最终要点

围绕流量流向构建VPC:公有子网应仅暴露负载均衡器、NAT网关或严格控制访问的堡垒主机,而应用程序和数据库资源保持私有。启动后,持续审查安全组、路由表和VPC流日志,以确保网络与应用程序的实际运行方式保持一致。