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

本页面介绍如何设置和使用 BeyondCorp Enterprise 应用连接器来保护非 Google Cloud 应用。

概览

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

使用 BeyondCorp Enterprise 应用连接器的优势在于,您无需打开防火墙或设置站点到站点的 Cloud VPN 连接。

架构

下图是一个概要架构图,描述了 BeyondCorp Enterprise 应用连接器的主要组件。

BeyondCorp Enterprise 应用连接器组件

BeyondCorp Enterprise 应用连接器组件使用以下三种主要 API 资源进行管理:应用连接器、应用连接和应用网关。

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

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

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

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

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

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

准备工作

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

如需使用 BeyondCorp Enterprise 应用连接器,您必须具备以下条件:

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

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

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

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

设置 Google Cloud 项目

如需设置 Google Cloud 项目以与 BeyondCorp Enterprise 应用连接器搭配使用,您必须启用 BeyondCorp Enterprise 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 "{}"
    

安装应用连接器远程代理

对于托管您要使用 BeyondCorp Enterprise 保护的应用的每个网络环境,您必须为其部署应用连接器远程代理虚拟机。您创建的每个远程代理都必须有一个专用虚拟机或任何安装了 Docker 的 Bare Metal 服务器。

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

  1. 在应用环境中创建一个虚拟机实例。
    1. 确保远程代理虚拟机网络防火墙允许针对 IAP-TCP IP 范围 35.235.240.0/20 的端口 443 发起的所有出站流量。如需了解远程代理虚拟机防火墙应允许流向的其他网域,请参阅验证防火墙配置
  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)')"
    GATEWAY_URI_L7="${GATEWAY_URI/bce-psc/bce-ps7}"
    

    GATEWAY_URI_L7 用于创建转发规则。BeyondCorp Enterprise 应用连接器使用 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')
    GATEWAY_URI_L7="${GATEWAY_URI/bce-psc/'bce-ps7'}"
    

    GATEWAY_URI_L7 用于创建转发规则。BeyondCorp Enterprise 应用连接器使用 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_L7
    

    可选标志:

    • 设置 --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_L7}' \
    }"
    

    可选字段:

    • 设置 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 名称相关联。运行以下命令来检查预配状态:

    1. 显示要在 DNS 提供商中设置的 IP 地址:
      echo "Load Balancer ip address - $LB_IP"
      
    2. 设置 DNS 后,运行以下命令检查域名是否解析为 IP 地址:
      dig $DOMAIN_NAME
      
    3. 运行以下命令来获取预配状态:
    echo $(gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/sslCertificates/${LB_PREFIX}-ssl-cert \
    | jq -r '.name + " " + .managed.status + " " + (.managed.domainStatus | keys[]) + "=" + .managed.domainStatus[]')
    

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

启用 Identity-Aware Proxy

按照 Identity-Aware Proxy (IAP) 文档设置 Identity-Aware Proxy。设置 IAP 后,请完成以下步骤,为后端服务启用 IAP:

  1. 前往 IAP 页面:
    IAP

  2. HTTPS 资源下,找到 $LB_PREFIX-backend-service。如需为此资源启用 IAP,请点击 IAP 列中的切换开关。在显示的开启 IAP 窗口中,选中相应复选框以确认此资源的配置要求,然后点击开启以确认您希望 IAP 保护您的资源。

  3. 要允许用户访问您的应用,您必须完成以下步骤,以向其授予项目的 IAP-secured Web App User 角色:

    1. 选中 $LB_PREFIX-backend-service 复选框。
    2. 信息面板上,选择添加主账号,然后输入有权访问您的应用的群组或个人的电子邮件地址。
    3. 选择角色下拉列表中,依次选择 Cloud IAP > IAP-secured Web App User,然后点击保存

您的本地应用现在应该已发布到互联网,并受 BeyondCorp Enterprise 保护。

使用 Google Cloud 控制台设置应用连接器

完成本部分中的步骤,使用 Google Cloud 控制台部署 BeyondCorp Enterprise 应用连接器。

输入您的申请详情

完成以下步骤,添加您的应用详情:

  1. 在 Google Cloud 控制台中,转到 IAP 页面。
    转到 IAP

  2. 点击关联新应用按钮,然后选择通过应用连接器连接

  3. 对于应用名称,输入要保护的应用的名称。

  4. 面向外部的应用网址部分,输入可供用户访问您的应用的可公开访问的网址。

  5. 点击下一步

设置与 Google Cloud 的连接

完成以下步骤,在 Google Cloud 与您的非 Google Cloud 环境之间建立连接。

  1. 点击创建应用连接器按钮,然后输入以下信息:

    • 应用连接器名称:连接器的名称。
    • 区域:要在其中部署连接网关和连接器的区域。
  2. 点击创建按钮。

  3. 按照预配虚拟机窗格中的说明操作,在您的虚拟机上部署远程代理。

  4. 点击测试连接状态按钮以测试连接。

  5. Google Cloud 在哪里可以找到您的应用?中输入以下信息,配置您在上一步中创建的连接器:

    • 内部主机名:托管应用的本地 IP 地址或 FQDN。
    • Port:用于连接到应用的端口号。

授予对您的应用的访问权限(可选)

  1. 新的主账号部分,输入以下一项或多项内容:

    • Google 账号电子邮件地址:<用户名>@gmail.com
    • Google 群组:<管理员>@googlegroups.com
    • 服务账号:<服务器>@<示例>.gserviceaccount.com
    • Google Workspace 网域:example.com
    • anybody:输入 allUsers 可向所有用户授予访问权限
    • 所有 Google 账号allAuthenticatedUsers,可将访问权限授予任何已登录 Google 账号的用户
  2. 选择一个或多个访问权限级别,然后点击下一步

发布应用

  1. 若要发布应用,请点击安全发布应用按钮。

  2. 在您发布应用并收到安全发布的应用确认消息后,您必须创建一条 DNS 记录,将面向外部的应用网址指向代理的 IP 地址。请完成以下步骤:

    • 第 2 步 - 更新 DNS 部分,复制 IP 地址字段中的 IP 地址。按照 DNS 提供商的说明,了解如何将 IP 地址与 DNS 名称关联,使用该地址创建 DNS 记录。
  3. 创建 DNS 记录后,请点击测试按钮对其进行测试。您应该会收到已通过 DNS 测试的确认消息。

  4. 点击完成

启用 IAP

  1. 前往 IAP 页面。
    转到 IAP

  2. 从资源列表中找到您的应用,然后选择“IAP”列中的按钮。

  3. 在显示的开启 IAP 对话框中,选中我已阅读配置要求并根据文档配置了我的后端服务复选框,然后点击开启

您的本地应用现在应该已发布到互联网,并受 BeyondCorp Enterprise 保护。

创建应用网关(可选)

当您使用应用连接器连接应用时,系统会隐式创建和管理应用网关。您还可以创建自己的应用网关,将应用连接资源整理成组。托管在不同应用网关中的应用连接的流量通过单独的虚拟基础架构进行路由。

如需创建和指定应用网关,请完成以下步骤。

gcloud CLI

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

    CONNECTOR_NAME=CONNECTOR_NAME
    CONNECTION_NAME=CONNECTION_NAME
    GATEWAY_NAME=GATEWAY_NAME
    PROJECT_ID=PROJECT_ID
    REGION=REGION
    APP_ENDPOINT=APP_HOST:APP_PORT
    

    替换以下内容:

    • CONNECTOR_NAME:在先前步骤中定义的连接器名称。
    • CONNECTION_NAME:连接的唯一名称。
    • GATEWAY_NAME:应用网关的名称。
    • PROJECT_ID:Google Cloud 项目 ID。
    • REGION:要在其中部署应用网关的区域,例如 us-central1
    • APP_HOST:托管应用的本地 IP 地址或 FQDN。
    • APP_PORT:用于连接到应用的端口号。
  2. 运行以下命令,创建应用网关:

    gcloud beta beyondcorp app gateways create $GATEWAY_NAME \
    --project=$PROJECT_ID --location=$REGION --display-name=$GATEWAY_NAME
    
  3. 运行以下命令,在创建连接调用中指定应用网关:

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

API

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

    CONNECTOR_NAME=CONNECTOR_NAME
    CONNECTION_NAME=CONNECTION_NAME
    GATEWAY_NAME=GATEWAY_NAME
    PROJECT_ID=PROJECT_ID
    REGION=REGION
    APP_ENDPOINT=APP_HOST:APP_PORT
    

    替换以下内容:

    • CONNECTOR_NAME:在先前步骤中定义的连接器名称。
    • CONNECTION_NAME:连接的唯一名称。
    • GATEWAY_NAME:应用网关的名称。
    • PROJECT_ID:Google Cloud 项目 ID。
    • REGION:要在其中部署应用网关的区域,例如 us-central1
    • APP_HOST:托管应用的本地 IP 地址或 FQDN。
    • APP_PORT:用于连接到应用的端口号。
  2. 运行以下命令,创建应用网关:

    gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/appGateways?app_gateway_id=${GATEWAY_NAME} \
    -d "{ \
    'type': 'TCP_PROXY', \
    'display_name': '${CONNECTION_NAME}' \
    }"
    
  3. 运行以下命令,在创建连接调用中指定应用网关:

    gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/appConnections?app_connection_id=${CONNECTION_NAME} \
    -d "{ \
    'application_endpoint': \
    { \
    'host': '${APP_HOST}', \
    'port': '${APP_PORT}' \
    }, \
    'gateway': { 'app_gateway' : 'projects/${PROJECT_ID}/locations/${REGION}/appGateways/${GATEWAY_NAME}'}, \
    'connectors':['projects/${PROJECT_ID}/locations/${REGION}/appConnectors/${CONNECTOR_NAME}'], \
    'type': 'TCP_PROXY', \
    'display_name': '${CONNECTION_NAME}' \
    

后续步骤

问题排查

找不到之前创建的资源

使用 gcloud CLI 392.0.0 或更高版本时,请使用新的应用连接器默认资源 AppConnectorAppConnection。例如,gcloud alpha beyondcorp app connectorsgcloud alpha beyondcorp app connections 都引用新资源。

如需访问使用 392.0.0 之前的 gcloud CLI 版本创建的旧版资源,请使用关键字 legacy。例如,gcloud alpha beyondcorp app legacy connectorsgcloud alpha beyondcorp app legacy connections 都引用旧版资源。

使用旧版资源的配置目前仍然有效,但将来会被弃用。

  • 请按照本指南中的步骤配置新资源。
  • 如果您的配置使用旧版资源,请使用关键字 legacy 找到这些资源并将其移除。按照本文档中的步骤重新创建资源。
  • 如果您有使用旧版资源的不完整配置,请使用关键字 legacy 找到这些资源并将其移除。按照本文档中的步骤重新创建资源。

TLS/SSL 错误

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

浏览器会显示错误 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 或类似 TLS/SSL 错误,并且不会重定向到登录页面。

  • 在 Google Cloud 负载均衡器详情页面上验证证书的状态。

    注意:预配 Google 管理的证书最多可能需要 60 分钟时间。

TLS error

浏览器在重定向到登录页面后显示错误 upstream connect error or disconnect/reset before headers. retried and the latest reset reason: connection failure, transport failure reason: TLS error 或类似 TLS/SSL 错误。

  • 验证 Connection 中使用的应用端点是否为 HTTPS。
  • 使用 curl 验证是否可以从远程代理虚拟机访问应用端点:

    curl https://$APP_ENDPOINT
    

    如果您的应用证书是自签名证书,您可能需要使用 -k 标志。

验证防火墙配置

确保远程代理与互联网之间的防火墙允许与以下网域的出站连接:

连接类型 网域 Port(端口)
TCP raw.githubusercontent.com 443
TCP gcr.io 443
TCP *.googleapis.com 443
TCP tunnel.cloudproxy.app 443
TCP *.tunnel.cloudproxy.app 443
TCP accounts.google.com 443
TCP oauth2.googleapis.com 443

更改与连接关联的连接器

gcloud

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

    CONNECTOR_NAME=my-connector
    CONNECTION_NAME=my-connection
    REGION=us-central1
    PROJECT_ID=my-project
    

    替换以下内容:

    • my-connector:连接器的名称。也可能是以英文逗号分隔的列表,例如 connector1,connector2
    • my-connection:要更新的连接的名称。
    • us-central1:部署连接的区域。
    • my-project:Google Cloud 项目 ID。
  2. 要更改与连接关联的连接器,请运行以下命令:

    gcloud alpha beyondcorp app connections update $CONNECTION_NAME \
        --project=$PROJECT_ID \
        --location=$REGION \
        --connectors=$CONNECTOR_NAME
    

API

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

    CONNECTOR_NAME=my-connector
    CONNECTION_NAME=my-connection
    REGION=us-central1
    PROJECT_ID=my-project
    

    替换以下内容:

    • my-connector:连接器的名称。
    • my-connection:要更新的连接的名称。
    • us-central1:部署连接的区域。
    • my-project:Google Cloud 项目 ID。
  2. 要更改与连接关联的连接器,请运行以下命令:

    gcurl -X PATCH \
    https://beyondcorp.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/appConnections/${CONNECTION_NAME}?update_mask=connectors \
    -d "{ \
        'connectors': ['projects/${PROJECT_ID}/locations/${REGION}/appConnectors/${CONNECTOR_NAME}'], \
    }"
    

    您可以通过运行以下命令并检查输出的 connectors 字段来验证更新:

    gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/appConnections/${CONNECTION_NAME}
    

代理

对代理的支持是在 2024 年初引入的,并且需要更改 BeyondCorp systemd 文件。如果您早于此时间安装了远程代理,并且想要使用代理,请重新安装远程代理

  • 验证 Docker 守护程序是否已正确配置以使用代理。

  • 验证 HTTP 和 HTTPS 代理环境变量是否已设置,以及它们是否都使用 http:// 架构。不支持 https:// 架构和其他架构。

  • 运行 env 命令,验证代理环境变量是否已导出到子进程。

  • 仅支持 HTTP_PROXYHTTPS_PROXYNO_PROXY 及其对应的小写形式。

  • 如果您需要在安装后更新代理设置,请更新 /var/beyondcorp/env/PROXY 中的环境变量(如果使用默认 beyondcorp 用户)。如果使用自定义用户,请按照配置 Docker 客户端的说明更新 /home/$USER/.docker/config.json。如需应用代理更改,请使用以下命令重启远程代理:

    sudo systemctl restart beyondcorp
    

诊断工具

run-post-install-checks

run-post-install-checks 是安装在 /var/beyondcorp/scripts/ 中的脚本,用于验证您的远程代理是否已正确安装、已注册且运行状况良好。成功创建 app connection 并将其分配给远程代理(连接器)后,请转到远程代理虚拟机,然后使用以下命令运行 run-post-install-checks

sudo /var/beyondcorp/scripts/run-post-install-checks

如果一切正常,则脚本会输出成功消息。

run-diagnostics

run-diagnostics 是安装在 /var/beyondcorp/scripts/ 中的脚本,用于诊断远程代理虚拟机上的常见问题并输出报告,您可以将报告分享给 BeyondCorp Enterprise 支持团队。如需运行此诊断脚本,请运行以下命令:

sudo /var/beyondcorp/scripts/run-diagnostics

诊断报告会写入控制台和 ./diagnostics-report.txt

远程代理 CLI

bce-connctl 是用于在本地与远程代理交互的远程代理管理员命令行界面 (CLI)。此 CLI 支持各种命令,例如注册远程代理、检查状态和设置配置值。

Init 命令

您可以使用 Init 命令初始化远程代理,并生成用于注册代理的脚本。

示例:

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

状态命令

您可以使用“状态”命令管理远程代理的状态。

  • List:使用此命令列出远程代理的整体状态以及此代理支持的任何连接的状态。示例:bce-connctl status list

配置命令

您可以使用 Config 命令来管理远程代理的配置值。

  • List:使用此命令列出远程代理的配置值。示例:bce-connctl config list
  • 设置:使用此命令设置远程代理的配置值。示例:bce-connctl config set <key> <value>

注册命令

您可以使用“注册”命令来管理远程代理的注册。

  • 描述:使用此命令可获取远程代理的注册状态。示例:bce-connctl enrollment describe

    bce-connctl init 中的注册脚本成功完成,并且公钥成功上传后,状态为 ENROLLED

帮助

您可以将 -h--help 标志附加到任何 bce-connctl 命令,以输出使用情况信息。

bce-connctl init -h