为 Compute Engine 设置 IAP


本指南介绍了如何使用 Identity-Aware Proxy (IAP) 设置 Compute Engine 实例。如果您已经设置了 Compute Engine 实例并且只需要启用 IAP,请参阅为 Compute Engine 启用 IAP

目标

在本教程中,您将了解以下内容:

  • 创建 Compute Engine 实例模板和托管实例组 (MIG)。
  • 获取域名和证书。
  • 使用证书创建 HTTPS 负载平衡器。
  • 启用 IAP。
  • 测试 IAP 是否正常运行。

费用

本教程使用 Google Cloud的收费组件,包括:

  • Compute Engine
    • 4 个虚拟机 (VM)
  • 网络
    • 全局负载平衡器转发规则
    • 入站流量

若要根据预计使用情况来估算费用,请参阅此价格计算器

Cloud Platform 新用户可能有资格申请免费试用

准备工作

在开始本教程之前,您需要做好以下准备:

  1. 选择或创建 Google Cloud 项目。
    前往“项目”页面

  2. 为您的项目启用结算功能。了解如何修改项目的结算设置

第 1 步:创建 Compute Engine 模板

在 Google Cloud 控制台中,依次前往 Compute Engine > 创建实例模板页面,然后选择要在其中创建模板的项目。

转到“创建实例模板”页面

除以下几项外,其他设置均使用默认值:

  • 机器类型
    • micro (f1-micro)
  • 访问权限范围
    • 针对每个 API 设置访问权限
    • Compute Engine:只读
  • 防火墙
    • 允许 HTTP 流量
  • 管理部分的自动化 > 启动脚本下方,复制并粘贴以下脚本:
    # Copyright 2021 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    apt-get -y update
    apt-get -y install git
    apt-get -y install virtualenv
    git clone https://github.com/GoogleCloudPlatform/python-docs-samples
    cd python-docs-samples/iap
    virtualenv venv -p python3
    source venv/bin/activate
    pip install -r requirements.txt
    cat example_gce_backend.py |
      sed -e "s/YOUR_BACKEND_SERVICE_ID/$(gcloud compute backend-services describe my-backend-service --global --format="value(id)")/g" |
      sed -e "s/YOUR_PROJECT_ID/$(gcloud config get-value account | tr -cd "[0-9]")/g" > real_backend.py
    gunicorn real_backend:app -b 0.0.0.0:80
    

更新完值后,点击创建以创建模板。

第 2 步:创建托管实例组

在 Google Cloud 控制台中,依次前往 Compute Engine > 创建新的实例组页面,然后选择要在其中创建托管实例组的项目。

转到“创建实例组”页面

除以下几项外,其他设置均使用默认值:

  • 名称:my-managed-instance-group
  • 位置:多地区
  • 实例模板:选择您在第 1 步中创建的实例模板
  • 实例数:如需更改实例数,您必须先关闭自动扩缩功能。
  • 自动扩缩模式:不自动扩缩
  • 健康检查:选择创建健康检查,然后输入以下值:

    • 名称:my-health-check
    • 协议:HTTP

    点击保存并继续,使用新的健康检查。

更新完值后,点击创建以创建托管实例组 (MIG)。

第 3 步:获取域名和证书

要使用负载平衡器处理 HTTPS 流量,您需要一个域名和一个签名证书。您可以在 Google Domains 上注册一个网域,也可以使用自己选择的网域注册商。在继续本指南之前,请先注册您的网域。

设置证书

创建证书,以向用户标识您的网站。如需了解如何创建证书,请参阅使用 Google 管理的 SSL 证书

您的 CA 必须验证注册的域名是否为您所有。在以下步骤中,您将创建一个虚拟机来对您的网域进行 CA 身份验证。

创建一个虚拟机来验证您的网域所有权

在 Google Cloud 控制台中,前往 Compute Engine > 创建实例页面。

转到“创建实例”页面

除以下几项外,其他设置均使用默认值:

  • 名称:certbot-vm
  • 机器类型:micro (f1-micro)
  • 访问权限范围
    • 针对每个 API 设置访问权限
    • Compute Engine:读写
  • 启动磁盘映像
    • Debian GNU/Linux 9(拉伸)
  • 防火墙
    • 允许 HTTP 流量
    • 允许 HTTPS 流量

更新完值后,点击创建以创建虚拟机实例。请记下刚刚创建的虚拟机的外部 IP 地址。下一步操作将会用到该地址。

将您的网域设置为指向虚拟机

要将您的网域设置为指向虚拟机,请按照下述步骤配置 A 记录:

  1. 通过网域托管服务商登录您的网域账号。
  2. 找到相关页面以更新网域的 DNS 记录。此页面的名称可能是“DNS 管理” (DNS Management)、“域名服务器管理”(Name Server Management) 或“高级设置” (Advanced Settings)。
  3. 将 A 记录更改为以下值:
    • 名称/主机/别名:@
    • :您创建用于验证上述网域所有权的虚拟机的外部 IP 地址。
    • TTL:注册商的默认值,或 86400(一天)。
  4. 等待 DNS 记录更新。您所添加的记录最长可能需要一天的时间来传播。

如需了解详情,请参阅关于 A 记录

测试服务器

要测试您的服务器是否正常运行,请按照下述步骤操作:

  1. 在 Google Cloud 控制台中,依次前往 Compute Engine > 虚拟机实例页面。
    前往“虚拟机实例”页面

  2. certbot-vm 对应的 Connect 下方,点击 SSH.

  3. 运行以下命令以在虚拟机上运行小型网络服务器:

      mkdir web
      cd web
      echo "Hello" > index.html
      sudo busybox httpd -v -f
    
  4. 在网络浏览器中,转到您之前注册的域名。您的网络浏览器应显示 Hello,并且您的 SSH 会话应显示一条包含 ... response:200 的消息。否则,请等待几分钟,然后重复此步骤。

  5. 测试成功完成后,按 Ctrl+C 停止网络服务器。

创建证书

要创建证书,请在虚拟机上运行以下命令来注册 Let's Encrypt,其中 YOUR_DOMAIN 是您的域名(不包括协议):

sudo pkill busybox
sudo apt-get install -y certbot
sudo certbot certonly --standalone -d YOUR-DOMAIN

在此过程中,Let's Encrypt 可能会向您索要电子邮件地址,以便在您的证书即将到期时(默认为在颁发 3 个月后到期)发送提醒。此外,您必须同意 Let's Encrypt 设定的服务条款。

成功注册后,您应该会看到一条消息,其内容为 Congratulations! Your certificate and chain have been saved at...

将证书添加到项目中

如需将证书添加到项目中,请在虚拟机上运行以下命令:

sudo su
cd /etc/letsencrypt/live/YOUR_DOMAIN
gcloud compute ssl-certificates create my-cert --certificate=fullchain.pem --private-key=privkey.pem

成功创建证书后,应该看到如下所示的消息:Created [https://www.googleapis.com/compute/v1/projects/example-project/global/sslCertificates/my-cert]

在继续操作之前,请先关闭 SSH 会话。

第 4 步:创建负载平衡器

在开始执行此步骤之前,请确保您在上一步中启动的 SSH 会话已关闭。准备就绪后,请按照以下步骤创建负载平衡器:

  1. 在 Google Cloud 控制台中,前往网络服务 > 创建负载均衡器页面,然后选择要为其创建负载均衡器的项目。
    前往“创建负载平衡器”页面

  2. HTTP(S) 负载平衡下,点击开始配置

  3. 选择从互联网到我的虚拟机

  4. 在随即显示的新外部应用负载均衡器页面上,为您的负载均衡器输入一个名称

  5. 点击后端配置,然后选择后端服务 > 创建后端服务

  6. 创建后端服务面板上的名称框中,输入 my-backend-service

  7. 新后端下方,除以下内容外,其他设置均使用默认值:

    • 实例组:my-managed-instance-group
  8. 健康检查下,选择 my-health-check

  9. 更新完值后,点击创建新 HTTP(S) 负载平衡器面板会重新显示出来。

  10. 点击主机和路径规则以加载默认值。您无需添加任何规则。

  11. 点击前端配置。除以下几项外,其他设置均使用默认值:

    • 协议:HTTPS
    • IP 地址:点击创建 IP 地址
      • 输入要与新的静态 IP 地址关联的名称
      • 点击保留以保留静态 IP 地址。
    • 证书:my-cert
  12. 输入完前端配置值后,点击完成

  13. 点击创建。此时将显示负载均衡页面,并且将在负载均衡器列表中创建新的负载均衡器。

  14. Google Cloud 控制台创建完新的负载均衡器后,点击负载均衡器的名称,然后记下详细信息 > 前端下方显示的外部 IP 地址。下一步操作将会用到该地址。

将您的网域设置为指向负载平衡器

要将您的网域设置为指向负载平衡器,请按照以下步骤配置 A 记录:

  1. 通过网域托管服务商登录您的网域账号。
  2. 找到相关页面以更新网域的 DNS 记录。此页面的名称可能是“DNS 管理” (DNS Management)、“域名服务器管理”(Name Server Management) 或“高级设置” (Advanced Settings)。
  3. 将 A 记录更改为以下值:
    • 名称/主机/别名:@
    • :您在上面创建的负载平衡器的外部 IP 地址。不要将端口 :443 添加到 DNS 记录中。
    • TTL:注册商的默认值,或 86400(一天)。
  4. 等待 DNS 记录更新。要传播您刚刚添加的记录,最长可能需要一天的时间。
  5. 如需测试负载平衡器,请使用网络浏览器通过 https:// 协议转到您的网域。
    • 如果尚未设置负载平衡器,您将会看到“HTTP 502”错误。
    • 如果负载平衡器已准备就绪,您将会看到“请求未获得批准”。

如需了解详情,请参阅关于 A 记录

重启虚拟机

如需对来自 IAP 的请求正确进行身份验证,您必须按照以下步骤重启 MIG 中的虚拟机:

  1. 在 Google Cloud 控制台中,前往 Compute Engine > 实例组页面。
    前往“实例组”页面
  2. 点击 my-managed-instance-group
  3. 在显示的实例组详情页面顶部,点击滚动式重新启动/替换
  4. 在显示的重新启动/替换 my-managed-instance-group 的实例页面上,设置以下值:
    • 操作:重新启动
    • 不可用的实例数上限:3 个实例,共 3 个实例
    • 最短等待时间:0 s
  5. 更新完值后,点击重新启动

第 5 步:设置 IAP

配置防火墙

接下来,您需要配置防火墙以阻止对底层虚拟机的访问,并仅允许通过 IAP 的访问:

  1. 前往 Google Cloud 控制台 VPC 网络 > 防火墙规则
    前往“防火墙规则”页面
  2. 选中以下规则旁边的复选框:
    • default-allow-http
    • default-allow-https
    • default-allow-internal
  3. 点击删除
  4. 点击创建防火墙规则并设置以下值:
    • 名称:allow-iap-traffic
    • 目标:网络中的所有实例
    • 来源 IP 地址范围(在此框中每粘贴一个值,就按一次 Enter 键)。这些 IP 地址范围已列入许可名单,因为这是负载均衡器与后端通信的前提条件。
      • 130.211.0.0/22
      • 35.191.0.0/16
    • 协议和端口
      • 指定的协议和端口
      • tcp:80
  5. 更新完值后,点击创建

设置 IAP

如需为您的项目设置 IAP,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,依次前往安全性 > Identity-Aware Proxy 页面,然后选择要为其启用 IAP 的项目。
    转到 Identity-Aware Proxy 页面
  2. 如果您尚未配置项目的 OAuth 同意屏幕,系统将提示您执行此操作:

    1. 转到 OAuth 同意屏幕
      配置同意屏幕
    2. 支持电子邮件地址下,选择要显示为公开联系人的电子邮件地址。该电子邮件地址必须属于当前登录的用户账号,或者属于当前登录的用户是管理员或所有者的 Google 群组。
    3. 输入您要显示的应用名称
    4. 根据需要添加任何可选详细信息。
    5. 点击保存

    如需稍后更改 OAuth 同意屏幕上的信息(例如产品名称或电子邮件地址),请重复上述步骤配置同意屏幕。

  3. my-backend-service 旁边,

  4. 在随即显示的 开启 IAP 窗口中,选中“我已经阅读了配置要求,并根据文档配置了我的 Compute Engine 资源”旁边的复选框。

  5. 点击开启

将主账号添加到访问列表中

接下来,您需要将主账号添加到项目的 IAP 访问权限列表中。

  1. IAM 和管理 > Identity-Aware Proxy 右侧的访问权限部分中,点击添加
  2. 输入您要向其授予访问权限的主账号(包括您自己),然后为这些主账号分配 IAP-secured Web App User 角色。主账号可以是:
    • Google 账号:user@gmail.com
    • Google 群组:admins@googlegroups.com
    • 服务账号:server@example.gserviceaccount.com
    • Google Workspace 网域:example.com

步骤 6:测试 IAP

如需测试 IAP 是否正常运行,请按照以下步骤操作:

  1. 在网络浏览器中,转到您的网域。
    1. 如果您看到“请求未获得批准”,请过几分钟后重试。
  2. 如果您看到 Google 登录屏幕,请使用您在上一步中授予了访问权限的 Google 账号进行登录。
  3. 您应该会看到如下消息:“您好,user@example.com。我是my-managed-instance-group-29z6。”
  4. 尝试刷新页面。您的浏览器应显示托管实例组中 3 台机器的名称。这表明负载平衡器将流量分配到该组中的各个虚拟机。

恭喜!您已经使用 IAP 成功启用了负载均衡服务。

清除数据

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

为 Compute Engine 设置完 IAP 后,您可以清理自己在 Google Cloud 上创建的资源,避免日后再为这些资源支付费用。以下部分介绍了如何删除或关闭这些资源。

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

要删除项目,请执行以下操作:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

删除实例

要删除 Compute Engine 实例,请运行以下命令:

  1. In the Google Cloud console, go to the VM instances page.

    Go to VM instances

  2. Select the checkbox for the instance that you want to delete.
  3. To delete the instance, click More actions, click Delete, and then follow the instructions.

删除默认网络的防火墙规则

如需删除防火墙规则,请执行以下操作:

  1. In the Google Cloud console, go to the Firewall page.

    Go to Firewall

  2. Select the checkbox for the firewall rule that you want to delete.
  3. To delete the firewall rule, click Delete.

后续步骤

  • 尝试修改我们在本教程中使用的示例应用以传送其他数据。
  • 阅读最佳做法,了解如何编写自己的应用并使用 IAP 保护应用的安全。