为 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 模板

在 Cloud Console 中,转到 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 步:创建托管实例组

在 Cloud Console 中,依次转到 Compute Engine > 创建新的实例组页面,然后选择要在其中创建托管实例组的项目。

转到“创建实例组”页面

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

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

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

    点击保存并继续,使用新的运行状况检查。

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

第 3 步:获取域名和证书

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

设置证书

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

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

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

在 Cloud Console 中,转到 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. 在 Cloud Console 中,转到 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. 在 Cloud Console 中,转到网络服务 > 创建负载平衡器页面,然后选择要为其创建负载平衡器的项目。
    转到“创建负载平衡器”页面

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

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

  4. 在随即显示的新的外部 HTTP(S) 负载平衡器页面上,输入负载平衡器的名称

  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. 输入完前端配置值后,点击完成新的外部 HTTP(S) 负载平衡器面板会重新显示出来。

  13. 新的外部 HTTP(S) 负载平衡器下方,点击创建。此时将显示负载平衡页面,并且将在负载平衡器列表中创建新的负载平衡器。

  14. Cloud Console 创建完新的负载平衡器后,点击负载平衡器的名称,然后记下详细信息 > 前端下方显示的外部 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. 在 Cloud Console 中,转到 Compute Engine > 实例组页面。
    转到“实例组”页面
  2. 点击 my-managed-instance-group
  3. 在显示的实例组详情页面顶部,点击滚动式重新启动/替换
  4. 在显示的重新启动/替换 my-managed-instance-group 的实例页面上,设置以下值:
    • 操作:重新启动
    • 不可用的实例数上限:3 个实例,共 3 个实例
    • 最短等待时间:0 s
  5. 更新完值后,点击重新启动

第 5 步:设置 IAP

配置防火墙

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

  1. 转到 Cloud Console VPC 网络 > 防火墙规则
    转到“防火墙规则”页面
  2. 选中以下规则旁边的复选框:
    • default-allow-http
    • default-allow-https
    • default-allow-internal
  3. 点击删除
  4. 点击创建防火墙规则并设置以下值:
    • 名称:allow-iap-traffic
    • 目标:网络中的所有实例
    • 来源 IP 地址范围(在此框中每粘贴一个值,就按一次 Enter 键):
      • 130.211.0.0/22
      • 35.191.0.0/16
    • 协议和端口
      • 指定的协议和端口
      • tcp:80
  5. 更新完值后,点击创建

设置 IAP

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

  1. 在 Cloud Console 中,转到安全性 > 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. 输入您要向其授予访问权限的主帐号(包括您自己)。主帐号可以是:
    • 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. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除实例

如需删除 Compute Engine 实例,请执行以下操作:

  1. 在 Cloud Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 选中要删除的实例。
  3. 如需删除实例,请点击更多操作,点击删除,然后按照说明操作。

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

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

  1. 在 Cloud Console 中,转到防火墙页面。

    转到“防火墙”

  2. 选中要删除的防火墙规则。
  3. 如需删除防火墙规则,请点击删除

后续步骤

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