VPC私网访问云服务

VPC内的实例访问云服务时(例如访问对象存储OSS),如果通过公网访问,可能会存在数据安全风险、公网网络质量不稳定等问题,同时公网访问也会产生公网流量成本。

为了解决这些问题,阿里云提供了VPC内通过私网访问云服务的能力,确保访问请求保留在阿里云的内网中,从而获得更高的安全性、更稳定的网络性能和更优的成本控制。

本文将介绍两种主流的VPC私网访问方案:网关终端节点和私网连接(PrivateLink)。

工作原理

网关终端节点

私网连接(PrivateLink)

网关终端节点可以理解为VPC在访问特定云服务时的一个“虚拟网关”。

OSS为例,工作过程如下:

  1. 创建网关终端节点时,需要选择VPC、路由表、要访问的云服务。

  2. 网关终端节点完成创建后,系统会自动在选中的路由表里,增加一个自定义路由条目:目标网段为一个系统前缀列表(里面包含OSS在该地域的VIP网段),下一跳为创建的网关终端节点。

  3. 路由表所绑定的交换机内的ECS实例,在访问OSS内网域名时,VPC会将访问请求路由到网关终端节点,并通过阿里云内网直接到达OSS,无需绕行公网。

私网连接(PrivateLink)像是在VPC和目标服务之间建立了一条“私密隧道”。

OSS为例,工作过程如下:

  1. 使用PrivateLink需要先创建接口终端节点。创建接口终端节点时,需要选择VPC、安全组、可用区与交换机、要访问的云服务。

  2. 接口终端节点完成创建后,系统会自动在每个选中的交换机里创建一个拥有私网IP的终端节点弹性网卡(ENI),作为访问服务的唯一入口。

  3. ECS实例在访问终端节点域名时,如果符合安全组规则,所有访问请求都将经过终端节点弹性网卡,并通过阿里云内网直接到达OSS,无需绕行公网。

imageimage

为了让您更直观地选择,下表总结了两种方案的主要区别:

特性

网关终端节点

私网连接 (PrivateLink)

应用场景

结合网关终端节点的终端节点策略与OSSBucket授权策略,可以降低未授权访问风险,实现双向鉴权:

  • 源端控制:VPC侧仅允许该VPC访问指定Bucket,不允许该VPC访问其他Bucket。

  • 目的端控制:OSS侧仅允许指定VPC访问该Bucket,不允许其他VPC访问。

VPC通过私网安全访问云服务的标准方案,相比网关终端节点支持更多云服务类型、更多高级能力。

适用服务类型

目前仅适用于对象存储OSS。

适用于众多阿里云一方服务以及用户自建服务(含ISV提供的服务)。

VPC侧安全能力

仅支持终端节点策略。

支持安全组、网络ACL、终端节点策略。

组网能力

不支持复杂组网。可能存在云服务地址(100.x.x.x网段)冲突的问题。

支持复杂组网。结合VPC对等连接/云企业网、高速通道/VPN网关产品,可以实现跨地域、混合云组网。

运维能力

支持流日志,便于审计与故障排查。

费用

免费

收取实例费、流量处理费。

用户自建服务支持选择服务使用方付费或服务提供方付费。

网关终端节点

结合网关终端节点的终端节点策略与OSSBucket授权策略,可以降低未授权访问风险,实现双向鉴权:

  • 源端控制:VPC侧仅允许该VPC访问指定Bucket,不允许该VPC访问其他Bucket。

  • 目的端控制:OSS侧仅允许指定VPC访问该Bucket,不允许其他VPC访问。

image

控制台

创建网关终端节点并配置授权策略

开启网关终端节点的VPC、授权Bucket、在VPC内访问OSS的用户,可以分别归属于不同的阿里云账号。

注意网关终端节点仅在部分地域支持

  1. 创建网关终端节点并配置终端节点策略。

    1. 前往专有网络控制台-网关终端节点页面,单击创建终端节点

    2. 选择地域并自定义终端节点名称,终端节点类型保持为网关终端节点

    3. 终端节点服务选中选择可用服务,并选中服务资源类型为对象存储OSS的终端节点服务。

    4. 选中VPC并勾选路由表。

      网关终端节点完成创建后,系统会自动在选中的路由表里,增加一个自定义路由条目:目标网段为一个系统前缀列表(里面包含OSS在该地域的VIP网段),下一跳为创建的网关终端节点。

    5. 配置终端节点策略:语法与访问控制RAM产品的权限策略语言相同。

      策略示例

      下面的示例表示:VPC仅允许账号ID1746xxxxxx的用户,访问名称为examplebucketBucket,进行OSS相关操作。

      {
        "Version": "1",
        "Statement":
          [
            {
              "Effect": "Allow",
              "Action": "oss:*",
              "Resource": ["acs:oss:*:*:examplebucket",
                           "acs:oss:*:*:examplebucket/*"],
              "Principal": ["1746xxxxxx"]
            }
          ]
      }
    6. 创建完成后,可以在关联路由表的自定义路由条目中,查看到一条系统自动添加的、下一跳指向网关终端节点的路由条目。

  2. 配置OSSbucket授权策略。

    1. 前往OSS控制台-Bucket页面,单击需要配置授权的Bucket名称。

    2. 左侧导航选择权限控制 > Bucket授权策略。单击按语法策略添加,单击编辑

    3. 配置Bucket授权策略:语法与访问控制RAM产品的权限策略语言相同。

      策略示例

      下面的示例表示:

      1. 策略1:拒绝所有账号,从除了实例IDvpc-bp******VPC外的其他VPC,访问名称为examplebucketBucket,进行OSS相关操作。

        OSSAction汇总请参见RAM Policy。Deny策略建议尽量避免配置Action*,以免导致Bucket所有者在OSS控制台也无法访问Bucket。
      2. 策略2:仅允许账号ID1746xxxxxx的用户,从实例IDvpc-bp******VPC,访问名称为examplebucketBucket,进行OSS相关操作。

      {
        "Version": "1",
        "Statement":
          [
            {
              "Effect": "Deny",
              "Action": ["oss:ListObjects","oss:GetObject","oss:PutObject","oss:DeleteObject"],
              "Resource": ["acs:oss:*:*:examplebucket",
                           "acs:oss:*:*:examplebucket/*"],
              "Principal": ["*"],
      	"Condition": {
      	  "StringNotEquals": {
                  "acs:SourceVpc": [
      	      "vpc-bp******"
      	    ]
      	  }
      	}
            },{
              "Effect": "Allow",
              "Action": ["oss:*"],
              "Resource": ["acs:oss:*:*:examplebucket",
                           "acs:oss:*:*:examplebucket/*"],
              "Principal": ["1746xxxxxx"],
      	"Condition": {
      	  "StringEquals": {
                  "acs:SourceVpc": [
      	      "vpc-bp******"
      	    ]
      	  }
      	}
            }
          ]
      }

    4. 策略配置完成后单击保存

  3. 验证访问策略。

    注意如果访问OSS的账号是RAM账号,则RAM账号本身需要授予OSS相关Bucket的操作权限,否则可能导致访问失败。
    1. 使用授权账号,在授权VPC访问授权Bucket时,访问成功。

    2. 若账号、VPCBucket任意一个未授权,则访问失败。

修改权限策略

可以通过修改权限策略,调整授权VPC、授权Bucket或授权账号范围。

  • 调整授权VPC:前往OSS控制台-Bucket页面,单击目标Bucket名称,左侧导航选择权限控制 > Bucket授权策略,调整现有授权策略的Condition字段,增减可访问BucketVPC。

  • 调整授权Bucket:

    1. 前往专有网络控制台-网关终端节点页面,单击目标网关终端节点实例ID,选择终端节点策略页签,调整现有授权策略的Resource字段,增减VPC可访问的Bucket。

    2. 前往OSS控制台-Bucket页面,单击目标Bucket名称,左侧导航选择权限控制 > Bucket授权策略,调整现有授权策略的Resource字段,增减可被访问的Bucket资源。如果涉及多个Bucket,在每个Bucket里均需要进行操作。

  • 调整授权账号:

    注意如果访问OSS的账号是RAM账号,则RAM账号本身需要授予OSS相关Bucket的操作权限,否则可能导致访问失败。
    1. 前往专有网络控制台-网关终端节点页面,单击目标网关终端节点实例ID,选择终端节点策略页签,调整现有授权策略的Principal字段,增减可在VPC内访问Bucket的账号。

    2. 前往OSS控制台-Bucket页面,单击目标Bucket名称,左侧导航选择权限控制 > Bucket授权策略,调整现有授权策略的Principal字段,增减可在VPC内访问Bucket的账号。如果涉及多个Bucket,在每个Bucket里均需要进行操作。

绑定/解绑路由表

可以通过网关终端节点绑定/解绑路由表,控制VPC内哪些交换机通过网关终端节点访问云服务。

  1. 前往专有网络控制台-网关终端节点页面,单击目标网关终端节点实例ID。

  2. 关联的路由表页签:

    1. 绑定新的路由表:单击关联路由表。绑定完成后,可以在关联路由表的自定义路由条目中,查看到一条系统自动添加的、下一跳指向网关终端节点的路由条目。

    2. 解绑已有路由表:单击已关联路由表右侧的解除关联。解绑后,系统添加的路由条目将会被自动移除。

删除网关终端节点

删除网关终端节点前,您需要先解绑所有已关联的路由表。

  1. 解绑所有已关联的路由表。

  2. 前往专有网络控制台-网关终端节点页面,单击目标网关终端节点实例右侧的删除

  3. (可选)由于Bucket中仍然存在Bucket授权策略,会限制其他VPC无法访问该Bucket。如需调整,可以前往OSS控制台-Bucket页面,单击目标Bucket名称,左侧导航选择权限控制 > Bucket授权策略,调整或删除仅允许从指定VPC访问的策略。

API

  1. 网关终端节点:

    1. 创建网关终端节点并配置终端节点策略:调用CreateVpcGatewayEndpoint接口。

      1. 创建时需要传入终端节点服务名称字段ServiceName,可以通过调用ListVpcEndpointServicesByEndUser接口,查询可使用的终端节点服务。

      2. PolicyDocument字段用于配置终端节点策略,语法与访问控制RAM产品的权限策略语言相同。

    2. 修改网关终端节点策略:调用UpdateVpcGatewayEndpointAttribute接口,传入PolicyDocument字段。

    3. 绑定路由表:调用AssociateRouteTablesWithVpcGatewayEndpoint接口。

    4. 解绑路由表:调用DissociateRouteTablesFromVpcGatewayEndpoint接口。

    5. 删除网关终端节点:调用DeleteVpcGatewayEndpoint接口。

  2. OSS Bucket:

    1. 配置OSSbucket授权策略:调用PutBucketPolicy接口。

    2. 修改Bucket授权策略:调用PutBucketPolicy接口,传入JSON形式的权限策略。

    3. 删除Bucket授权策略:调用DeleteBucketPolicy接口。

Terraform

配置网关终端节点:

Resources:alicloud_vpc_gateway_endpoint
注意删除网关终端节点前,您需要先解绑所有已关联的路由表。
provider "alicloud" {
  region = "cn-hangzhou"
}

resource "alicloud_vpc_gateway_endpoint" "default" {
  gateway_endpoint_name = "gateway-endpoint-name"        # 网关终端节点名称
  service_name          = "com.aliyun.cn-hangzhou.oss"   # OSS服务名称
  vpc_id                = "vpc-bp******"                 # 网关终端节点所属VPC
  route_tables = ["vtb-bp******","vtb-bp******"]         # 关联的路由表ID
  # 终端节点策略
  policy_document       = <<EOF
   {
    "Version": "1",
    "Statement":
     [
       {
        "Effect": "Allow",
        "Action": "oss:*",
        "Resource": ["acs:oss:*:*:examplebucket","acs:oss:*:*:examplebucket/*"],
        "Principal": ["1746******"]
      }
    ]
  }
  EOF                                              
}

配置OSSbucket授权策略:

Resources:alicloud_oss_bucket_policy
provider "alicloud" {
  region = "cn-hangzhou"
}

resource "alicloud_oss_bucket_policy" "default" {
  bucket = "examplebucket"  # Bucket名称
  
  policy = jsonencode({
    Version = "1"
    Statement = [
      {
        Effect = "Deny"
        Action = [
          "oss:ListObjects",
          "oss:GetObject",
          "oss:PutObject",
          "oss:DeleteObject"
        ]
        Principal = [
          "*"
        ]
        Resource = [
          "acs:oss:*:*:examplebucket",
          "acs:oss:*:*:examplebucket/*"
        ]
        Condition = {
          StringNotEquals = {
            "acs:SourceVpc" = [
              "vpc-bp******"  # 请替换为实际的VPC ID
            ]
          }
        }
      },{
        Effect = "Allow"
        Action = [
          "oss:*"
        ]
        Principal = [
          "1746xxxxxx"  # 请替换为实际的阿里云账号ID
        ]
        Resource = [
          "acs:oss:*:*:examplebucket",
          "acs:oss:*:*:examplebucket/*"
        ]
        Condition = {
          StringEquals = {
            "acs:SourceVpc" = [
              "vpc-bp******"  # 请替换为实际的VPC ID
            ]
          }
        }
      }
    ]
  })
} 

私网连接(PrivateLink)

参考PrivateLink相关文档:

更多信息

计费说明

网关终端节点功能免费。

私网连接(PrivateLink)请参见私网连接计费说明

支持的地域

区域

网关终端节点支持的地域

亚太-中国

华东1(杭州)华东2(上海)华北1(青岛)华北2(北京)华北3(张家口)华北5(呼和浩特)华南1(深圳)华北6(乌兰察布)华南2(河源)华南3(广州)西南1(成都)中国香港

亚太-其他

日本(东京)新加坡马来西亚(吉隆坡)印度尼西亚(雅加达)

欧洲与美洲

德国(法兰克福)英国(伦敦)美国(硅谷)美国(弗吉尼亚)

中东

阿联酋(迪拜)

私网连接(PrivateLink)请参见支持私网连接的地域和可用区

配额

网关终端节点配额:

  1. 针对同一种云服务,一个VPC只能绑定一个网关终端节点,一个VPC路由表也只能关联一个网关终端节点。

  2. 一个网关终端节点可以关联多个VPC路由表。

私网连接(PrivateLink)请参见服务配额