使用应用连接器保护非Google Cloud应用

本页介绍了如何设置和使用 Chrome 企业进阶版 应用连接器来保护非Google Cloud 应用。

概览

您可以使用 Chrome 企业进阶版 应用连接器为在非Google Cloud环境中运行的 HTTPS 应用提供身份和情境感知访问权限。Chrome 企业进阶版应用连接器是 Chrome 企业进阶版强制执行平面与在其他云端和本地环境中运行的应用之间经过身份验证的安全接口。

使用 Chrome 企业进阶版 应用连接器的好处在于,您无需打开 防火墙 或设置站点到站点的 Cloud VPN 连接。

架构

下图是一个概要架构图,其中描绘了 Chrome 企业进阶版应用连接器的主要组件。

Chrome 企业进阶版应用连接器组件

Chrome 企业进阶版应用连接器组件通过三个主要 API 资源进行管理:应用连接器、应用连接和应用网关。

应用连接器
连接器资源用于定义唯一的应用连接器远程代理。应用连接器远程代理部署在远程企业环境中,例如其他云环境和本地环境中。远程代理会启动并维护与 Google Cloud的隧道会话,从Google Cloud接收流量,并将流量中继到同一环境中的远程应用端点。
应用关联
连接资源定义了从Google Cloud 到特定应用端点的逻辑连接,该端点使用 IP 地址:端口或 FQDN:端口进行标识。连接资源用于编排为给定应用端点分配的一组受管理的应用程序连接器网关。网关在Google Cloud 中进行管理,并在不再需要时终止来自远程代理的隧道会话。
应用网关

应用网关是一项由 Google 代管式服务。应用连接器远程代理会连接到一个或多个网关,这些网关允许应用连接和应用连接器将流量从最终用户中继到远程代理。托管在同一应用网关上的应用连接的流量会通过通用虚拟基础架构进行路由。

当您使用应用连接器连接应用时,系统会为您隐式创建和管理应用网关。如果您想将应用连接资源整理成组,还可以创建其他应用网关。应用网关可灵活地对应用连接进行分组或隔离,以实现应用隔离。

每个应用网关最多可支持 1 Gbps 的总吞吐量,最多可支持 20 万个并发连接。我们建议您为需要高性能的关键应用创建专用网关。每个网关最多可分配 10 个应用。

为了支持最多 20 万个并发连接和最高 1 Gbps 的总吞吐量,我们建议您使用具有 8 个核心和 8 GB 内存的专用虚拟机来运行应用连接器远程代理。例如,您可以在一个高可用性集群中分配 2 个应用连接器远程代理,该集群具有 8 个核心和 8 GB 内存,以支持具有专用应用网关 (app_gateway1) 的高性能 Web 应用 (app1.examplecompany.com)。创建另一个集群,其中包含 2 个虚拟机,每个虚拟机具有 8 个核心和 8 GB 内存,以支持 10 个低使用率应用与另一个专用应用网关 (app_gateway2) 的组合。

应用连接器、应用连接和应用网关资源是区域级资源。您只能在区域背景下使用它们。例如,您无法将区域 A 中的应用连接器分配给在区域 B 中创建的应用连接或应用网关。

准备工作

您只能将 Chrome 企业进阶版应用连接器用于 HTTPS 应用。此外,HTTPS 负载平衡器不使用服务器名称指示 (SNI) 扩展程序来连接到后端。如需了解详情,请参阅从负载均衡器到后端的加密

如需使用 Chrome 企业进阶版应用连接器,您必须具备以下条件:

每个 Chrome 企业进阶版应用连接器代理都需要一个运行 Docker 的 Linux 虚拟机。我们建议使用以下 Linux 发行版:

  • Debian 10.7 (buster)
  • Red Hat Enterprise Linux Server 7.8 (Maipo) x86_64
  • Ubuntu 16.04 或更高版本

对于 Linux 虚拟机的硬件,我们建议至少配备 2 个 CPU 和 2 GB RAM。

您可以使用 gcloud 和 API 或使用 Google Cloud 控制台来设置和启用应用连接器。如需使用 gcloud 和 API,请完成以下步骤。如需使用 Google Cloud 控制台,请参阅使用 Google Cloud 控制台设置应用连接器

设置 Google Cloud 项目

若要设置 Google Cloud 项目以搭配 Chrome 企业进阶版应用连接器使用,您必须启用 Chrome 企业进阶版 API。如需启用 API,请完成以下步骤:

gcloud CLI

在完成以下步骤之前,请确保您已安装 gcloud CLI SDK。

  1. 运行以下命令,设置所需的环境变量:

    PROJECT_ID=my-project
    

    my-project 替换为 Google Cloud 项目 ID。

  2. 运行以下命令以启用该 API:

    gcloud config set project $PROJECT_ID
    gcloud services enable beyondcorp.googleapis.com
    

API

  1. 运行以下命令,获取访问令牌并设置所需的环境变量和别名:

    PROJECT_NUMBER=my-project-number
    ACCESS_TOKEN=my-access-token
    

    my-project 替换为 Google Cloud 项目 ID。

  2. 设置一个方便的别名来使用您的访问令牌:

    alias gcurl="curl -H 'Authorization: Bearer ${ACCESS_TOKEN}' -H 'Content-Type: application/json'"
    

  3. 运行以下命令以启用该 API:

    gcurl https://serviceusage.googleapis.com/v1/projects/${PROJECT_NUMBER}/services/beyondcorp.googleapis.com:enable -d "{}"
    

安装应用连接器远程代理

对于托管您要使用 Chrome 企业进阶版保护的应用的每个网络环境,您都必须部署一个应用连接器远程代理虚拟机。您必须为创建的每个远程代理配备专用虚拟机或安装了 Docker 的任何裸金属服务器。

如需创建远程代理,请完成以下步骤:

  1. 在应用环境中创建虚拟机实例。
    1. 确保远程代理虚拟机的网络防火墙允许在端口 443 上针对 IAP-TCP IP 范围 35.235.240.0/20 发起的所有出站流量。如需了解远程代理虚拟机防火墙应允许出站流量传入哪些其他网域,请参阅验证防火墙配置
  2. 安装远程代理:

    1. 验证您的 DNS 是否已正确配置,以及您是否可以使用 curl 访问应用。
    2. 安装 Docker Engine
      1. 可选:如果您使用的是代理,请验证 Docker 守护程序是否已正确配置
    3. 可选:如果您使用的是代理,请验证 HTTP 和 HTTPS 代理环境变量是否均已设置,并且是否使用了 http:// 架构。
    4. 在远程代理虚拟机上运行以下命令以安装远程代理:
      curl https://raw.githubusercontent.com/GoogleCloudPlatform/beyondcorp-applink/main/bash-scripts/install-beyondcorp-runtime -o ./install-beyondcorp-runtime && chmod +x ./install-beyondcorp-runtime && ./install-beyondcorp-runtime
      
    5. 如需将 bce-connctl 别名添加到 shell,请运行以下命令:
       source ~/.bce_alias
       
    6. 运行以下命令,设置所需的环境变量:

      PROJECT_ID=my-project
      REGION=us-central1
      CONNECTOR_NAME=my-connector
      
      请替换以下内容:

      • my-project: Google Cloud 项目 ID。
      • us-central1:要在其中部署连接和网关的区域。
      • my-connector:连接器的名称。
    7. 使用以下任一凭据类型注册连接器:

    服务账号

    1. bce-connctl CLI 中运行以下命令,注册连接器:

      bce-connctl init --project=$PROJECT_ID --region=$REGION --connector=$CONNECTOR_NAME
      

    2. 按照屏幕上的说明,使用 Cloud Shell 或 gcloud CLI 将注册脚本复制并粘贴到您的 Google Cloud 项目中,然后完成连接器的注册。如需运行注册脚本,您必须拥有项目的 Owner 权限。

      注册脚本完成后,运行时会自动同步连接器配置。

    联合身份

    1. 按照工作负载身份联合指南授予外部身份使用服务账号模拟访问 Google Cloud的权限。
    2. 下载客户端库配置,并将该文件放置在远程代理虚拟机的 /var/beyondcorp/credentials/credentials.json 中。
      1. 如果使用 AWS EC2 实例作为远程代理虚拟机,请执行以下操作之一:
        1. 在 EC2 实例上将 IMDSv2 设置为可选。
        2. 将以下代码行添加到客户端库配置文件中的 credential_source 对象:
          "imdsv2_session_token_url": "http://169.254.169.254/latest/api/token"
          
    3. 在远程代理虚拟机上,运行 bce-connctl CLI 中的以下命令:
      bce-connctl config set project $PROJECT_ID
      bce-connctl config set region $REGION
      bce-connctl config set connector $CONNECTOR_NAME
      
    4. 运行以下命令以重启代理并让其获取凭据:
      sudo systemctl restart beyondcorp
      
    5. 在 Cloud Shell 或 gcloud CLI 端点上,运行以下命令来设置所需的环境变量:
      SERVICE_ACCOUNT=my-service-account
      
      替换以下内容:
      • my-service-account:与外部身份关联的 Google Cloud 服务账号。
    6. 运行以下命令,向 Google Cloud 服务账号授予 BeyondCorp Connection Agent 角色:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
          --member="serviceAccount:$SERVICE_ACCOUNT" \
          --role="roles/beyondcorp.connectionAgent"
      
    7. 运行以下命令以创建 Google Cloud 应用连接器资源。

      gcloud alpha beyondcorp app connectors create $CONNECTOR_NAME \
          --project=$PROJECT_ID \
          --location=$REGION \
          --member="serviceAccount:$SERVICE_ACCOUNT" \
          --display-name=$CONNECTOR_NAME
      

      创建应用连接器资源后,远程代理运行时会自动同步连接器配置。

  3. 验证远程代理安装:

    1. 运行以下命令以确保服务正在运行:
      sudo systemctl status beyondcorp
      
    2. 远程代理包含三个 Docker 容器:bce-control-runtimebce-logagentbce-connector。运行以下命令,验证所有三个容器是否都在运行:
      docker ps --filter name=bce
      
    3. 可选:您可以运行以下命令来检查 Docker 容器日志文件:
      docker logs -f CONTAINER_NAME
      
      CONTAINER_NAME 替换为 Docker 容器名称。

将远程应用连接到 VPC

gcloud CLI

在完成以下步骤之前,请确保您已安装 gcloud CLI SDK,并且已登录具有 beyondcorp.admin 角色的账号。

  1. 运行以下命令,设置所需的环境变量:

    CONNECTOR_NAME=my-connector
    CONNECTION_NAME=my-connection
    PROJECT_ID=my-project
    REGION=us-central1
    APP_ENDPOINT=APP_HOST:APP_PORT
    

    替换以下内容:

    • my-connector:连接器的名称,在之前的步骤中已定义。
    • my-connection:连接的唯一名称。
    • my-project: Google Cloud 项目 ID。
    • us-central1:要在其中部署连接和网关的区域。
    • APP_HOST:托管应用的本地 IP 地址或 FQDN。
    • APP_PORT:用于连接到应用的端口号。
  2. 如需在应用与 VPC 之间创建连接,请运行以下命令:

    gcloud alpha beyondcorp app connections create $CONNECTION_NAME \
        --project=$PROJECT_ID \
        --location=$REGION \
        --application-endpoint=$APP_ENDPOINT \
        --type=tcp \
        --connectors=$CONNECTOR_NAME \
        --display-name=$CONNECTION_NAME
    

    请注意,此步骤可能需要几分钟才能完成。

  3. 创建连接后,运行以下命令以检索网关 URI:

    GATEWAY_URI="$(gcloud alpha beyondcorp app connections describe $CONNECTION_NAME --project=$PROJECT_ID --location=$REGION --format='get(gateway.uri)')"
    

    Chrome 企业进阶版应用连接器使用 Private Service Connect 将使用方项目关联到 Google 管理的项目中的受管理资源。

API

  1. 运行以下命令,设置所需的环境变量:

    CONNECTOR_NAME=my-connector
    CONNECTION_NAME=my-connection
    PROJECT_ID=my-project
    REGION=us-central1
    APP_HOST=my-app-host
    APP_PORT=my-app-port
    

    替换以下内容:

    • my-connector:连接器的名称,在之前的步骤中已定义。
    • my-connection:连接的唯一名称。
    • my-project: Google Cloud 项目 ID。
    • us-central1:要在其中部署连接和网关的区域。
    • my-app-host:托管应用的本地 IP 地址或 FQDN。
    • my-app-port:用于连接到应用的端口号。
  2. 如需在应用与 VPC 之间创建连接,请运行以下命令:

    gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_NUMBER}/locations/${REGION}/appConnections?app_connection_id=${CONNECTION_NAME} \
    -d "{ \
        'application_endpoint': \
        { \
            'host': '${APP_HOST}', \
            'port': '${APP_PORT}' \
        }, \
        'type': 'TCP_PROXY', \
        'display_name': '${CONNECTION_NAME}' \
    }"
    

    请注意,此步骤可能需要几分钟才能完成。

  3. 创建连接后,运行以下命令以检索网关 URI:

    GATEWAY_URI=$(gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_NUMBER}/locations/${REGION}/appConnections/${CONNECTION_NAME} | jq -r '.gateway.uri')
    

    Chrome 企业进阶版应用连接器使用 Private Service Connect 将使用方项目关联到 Google 管理的项目中的受管理资源。

配置外部应用负载平衡器

您只能将 HTTPS 应用连接到外部应用负载平衡器。不支持 HTTP 应用。

gcloud CLI

在完成以下步骤之前,请确保您已安装 gcloud CLI SDK,并且已登录具有 beyondcorp.admin 角色的账号。

  1. 运行以下命令,设置所需的环境变量:

    LB_PREFIX=web-app
    PROJECT_ID=my-project
    REGION=us-central1
    DOMAIN_NAME=app.example.com
    
    请替换以下内容:

    • web-app:附加到所有负载均衡器资源名称的前缀。
    • my-project: Google Cloud 项目 ID。
    • us-central1:连接和网关将部署到的区域。
    • app.example.com:应用的网域名称。
  2. 使用以下命令创建网络端点组 (NEG)

    gcloud beta compute network-endpoint-groups create $LB_PREFIX-neg \
        --region=$REGION \
        --network-endpoint-type=private-service-connect \
        --psc-target-service=$GATEWAY_URI
    

    可选标志:

    • 设置 --network 标志,以指定 NEG 中网络端点的网络名称。如果未指定,则使用默认项目网络。
    • 设置 --subnet 标志,以指定 NEG 中网络端点的子网名称。如果未指定,网络端点可以属于创建网络端点组的区域中的任何子网。
  3. 运行以下命令,创建基于 NEG 的后端服务并将其连接到 Private Service Connect 服务连接:

    gcloud beta compute backend-services create $LB_PREFIX-backend-service \
        --global \
        --protocol=HTTPS \
        --load-balancing-scheme=EXTERNAL_MANAGED
    
    gcloud beta compute backend-services add-backend $LB_PREFIX-backend-service \
        --global \
        --network-endpoint-group=$LB_PREFIX-neg \
        --network-endpoint-group-region=$REGION
    
  4. 运行以下命令,为您的网域创建由 Google 管理的证书:

    gcloud compute addresses create $LB_PREFIX-static-ip \
        --ip-version=IPV4 \
        --global
    gcloud compute ssl-certificates create $LB_PREFIX-ssl-cert \
        --domains=$DOMAIN_NAME \
        --global
    
    LB_IP="$(gcloud compute addresses describe $LB_PREFIX-static-ip --global --format='value(address)')"
    
  5. 运行以下命令,根据上一步中的后端创建外部应用负载平衡器:

    gcloud compute url-maps create $LB_PREFIX-map-https \
        --default-service=$LB_PREFIX-backend-service
    
    gcloud compute target-https-proxies create $LB_PREFIX-https-lb-proxy \
        --url-map=$LB_PREFIX-map-https \
        --ssl-certificates=$LB_PREFIX-ssl-cert
    
    gcloud beta compute forwarding-rules create "$LB_PREFIX-https-lb-forwarding-rule" \
        --global \
        --target-https-proxy=$LB_PREFIX-https-lb-proxy \
        --address=$LB_IP \
        --ports=443 \
        --load-balancing-scheme=EXTERNAL_MANAGED
    

    创建外部应用负载平衡器后,您的应用可通过该 IP 地址在互联网上访问。

  6. 创建外部应用负载平衡器后,您必须将其 IP 地址与域名相关联,以便 Google Cloud 可以预配 SSL 证书。请按照 DNS 提供商的说明将 IP 地址与 DNS 名称相关联。运行以下命令以检查配置状态:

    1. 显示要在 DNS 提供商中设置的 IP 地址:
      echo "Load Balancer ip address - $LB_IP"
      
    2. 设置 DNS 后,运行以下命令,检查域名是否解析为相应 IP 地址:
      dig $DOMAIN_NAME
      
    3. 运行以下命令以获取配置状态:
    gcloud compute ssl-certificates describe $LB_PREFIX-ssl-cert \
        --global \
        --format="get(name,managed.status, managed.domainStatus)"
    

    SSL 证书预配完成后,您应该能够使用 DNS 名称访问应用。

API

  1. 运行以下命令,设置所需的环境变量:

    LB_PREFIX=web-app
    PROJECT_ID=my-project
    REGION=us-central1
    DOMAIN_NAME=app.example.com
    
    请替换以下内容:

    • web-app:附加到所有负载均衡器资源名称的前缀。
    • my-project: Google Cloud 项目 ID。
    • us-central1:连接和网关将部署到的区域。
    • app.example.com:应用的网域名称。
  2. 使用以下命令创建网络端点组 (NEG)

    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/regions/${REGION}/networkEndpointGroups \
    -d "{ \
        'name': '${LB_PREFIX}-neg', \
        'network_endpoint_type': 'private-service-connect', \
        'psc_target_service': '${GATEWAY_URI}' \
    }"
    

    可选字段:

    • 设置 network 字段,以指定 NEG 中网络端点的网络网址。如果未指定,则使用默认项目网络。
    • 设置 subnetwork 字段,以指定 NEG 中网络端点的子网网址。如果未指定,网络端点可以属于创建网络端点组的区域中的任何子网。
  3. 运行以下命令,创建基于 NEG 的后端服务并将其连接到 Private Service Connect 服务连接:

    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/backendServices \
    -d "{ \
        'name': '${LB_PREFIX}-backend-service', \
        'service_protocol': 'HTTPS', \
        'port_name': 'https', \
        'load_balancing_scheme': 'EXTERNAL_MANAGED' \
    }"
    
    gcurl -X PATCH https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/backendServices/${LB_PREFIX}-backend-service \
    -d "{ \
        'backends': \
        [{ \
            'group': 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/regions/${REGION}/networkEndpointGroups/${LB_PREFIX}-neg' \
        }] \
    }"
    
  4. 运行以下命令,为您的网域创建由 Google 管理的证书:

    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/addresses \
    -d "{ \
        'name': '${LB_PREFIX}-static-ip', \
        'ip_version': 'IPV4' \
    }"
    
    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/sslCertificates \
    -d "{ \
        'name': '${LB_PREFIX}-ssl-cert', \
        'managed': \
        { \
            'domains': '${DOMAIN_NAME}' \
        }, \
        'type': 'MANAGED' \
    }"
    
    LB_IP=$(gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/addresses/${LB_PREFIX}-static-ip | jq -r '.address')
    
  5. 运行以下命令,根据上一步中的后端创建外部应用负载平衡器:

    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/urlMaps \
    -d "{ \
        'name': '${LB_PREFIX}-map-https', \
        'default_service': 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/backendServices/${LB_PREFIX}-backend-service' \
    }"
    
    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/targetHttpsProxies \
    -d "{ \
        'name': '${LB_PREFIX}-https-lb-proxy', \
        'url_map': 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/urlMaps/${LB_PREFIX}-map-https', \
        'ssl_certificate': 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/sslCertificates/${LB_PREFIX}-ssl-cert' \
    }"
    
    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/forwardingRules \
    -d "{ \
        'name': '${LB_PREFIX}-https-lb-forwarding-rule', \
        target: 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/targetHttpsProxies/${LB_PREFIX}-https-lb-proxy', \
        'ip_address': '${LB_IP}', \
        'port_range': '443-443', \
        'load_balancing_scheme': 'EXTERNAL_MANAGED' \
    }"
    

    创建外部应用负载平衡器后,您的应用可通过该 IP 地址在互联网上访问。

  6. 创建外部应用负载平衡器后,您必须将其 IP 地址与域名相关联,以便 Google Cloud 可以预配 SSL 证书。请按照 DNS 提供商的说明将 IP 地址与 DNS 名称相关联。运行以下命令以检查配置状态: