為 Compute Engine 設定 IAP

本指南說明如何使用 Identity-Aware Proxy (IAP) 設定 Compute Engine 執行個體。如果您已經設定 Compute Engine 執行個體,且只需要啟用 IAP,請參閱為 Compute Engine 啟用 IAP 一文。

步驟 1:建立 Compute Engine 範本

在 Google Cloud 控制台中,前往「Compute Engine」>「Create an instance template」(建立執行個體範本) 頁面,並選取您要在其中建立範本的專案。

前往「CREATE AN INSTANCE TEMPLATE」(建立執行個體範本) 頁面

除下列選項以外,均使用預設值:

  • 機器類型:
    • micro (f1-micro)
  • 存取權範圍:
    • 針對各個 API 設定存取權
    • Compute Engine:唯讀
  • 防火牆:
    • 允許 HTTP 流量
  • 在「Management」(管理) 區段的「Automation」(自動) >「Startup script」(開機指令碼) 下,複製並貼上下列指令碼:
    # 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」>「Create a new instance group」(建立新的執行個體群組) 頁面,然後選取要建立代管執行個體群組的專案。

前往「CREATE AN INSTANCE GROUP」(建立執行個體群組) 頁面

除下列選項以外,均使用預設值:

  • Name (名稱):my-managed-instance-group
  • Location (位置):多區域
  • Instance template (執行個體範本):選取您在步驟 1 中建立的執行個體範本
  • 執行個體數量:如要變更執行個體數量,請先停用自動調度資源功能。
  • Autoscaling mode (自動調度資源模式):不要自動調整資源配置
  • 健康狀態檢查:選取「建立健康狀態檢查」,然後輸入下列值:

    • Name (名稱):my-health-check
    • Protocol (通訊協定):HTTP

    點選「儲存並繼續」,即可使用新的健康狀態檢查。

更新完值之後,按一下 [Create] (建立),建立代管執行個體群組 (MIG)。

步驟 3:取得網域名稱與憑證

如要將負載平衡器與 HTTPS 流量搭配使用,您需要網域名稱與已簽署的憑證。您可以在 Google Domains 中註冊網域,也可以使用您選擇的網域註冊商。請先註冊網域,再繼續本指南。

設定您的憑證

建立可識別網站使用者的憑證。如要瞭解如何建立憑證,請參閱「使用 Google 代管的 SSL 憑證」。

您的 CA 必須驗證您是否擁有已註冊的網域名稱。在以下步驟中,您將建立 VM 來使用 CA 驗證網域。

建立 VM 以驗證您的網域擁有權

在 Google Cloud 控制台中,前往「Compute Engine」>「Create an instance」(建立執行個體) 頁面

前往「CREATE AN INSTANCE」(建立執行個體) 頁面

除下列選項以外,均使用預設值:

  • Name (名稱):certbot-vm
  • Machine type (機器類型):micro (f1-micro)
  • 存取權範圍:
    • 針對各個 API 設定存取權
    • Compute Engine:讀取/寫入
  • 開機磁碟映像檔:
    • Debian GNU/Linux 9 (stretch)
  • 防火牆:
    • 允許 HTTP 流量
    • 允許 HTTPS 流量

更新完值之後,按一下 [Create] (建立),建立 VM 執行個體。請記下您剛建立的 VM 外部 IP 位址,在下一步中將會用到。

將網域設定為指向 VM

如要將網域設定為指向 VM,請按照下列步驟設定 A 記錄:

  1. 登入網域代管商提供給您的網域帳戶。
  2. 尋找頁面以更新網域的 DNS 記錄。這個頁面可能叫做「DNS Management」(DNS 管理)、「Name Server Management」(名稱伺服器管理) 或「Advanced Settings」(進階設定)。
  3. 將您的 A 記錄變更為下列值:
    • Name/Host/Alias (名稱/主機/別名):@
    • Value (值):您在前面建立以驗證網域擁有權的 VM 外部 IP 位址。
    • TTL (存留時間):註冊商的預設值,或 86400 (一天)。
  4. 等待 DNS 記錄更新。您新增的記錄最多需要一天時間才能傳播完畢。

詳情請參閱關於 A 記錄一文。

測試伺服器

如要測試您的伺服器是否正常運作,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中,前往「Compute Engine」>「VM Instances」(VM 執行個體) 頁面
    前往「VM INSTANCES」(VM 執行個體) 頁面

  2. 在「certbot-vm」的「Connect」(連線) 下,點選 [SSH]

  3. 執行下列指令,在 VM 上執行較小的網路伺服器:

      mkdir web
      cd web
      echo "Hello" > index.html
      sudo busybox httpd -v -f
    
  4. 在網路瀏覽器中,前往您之前註冊的網域名稱。網路瀏覽器應會顯示 Hello,且 SSH 工作階段應會顯示包含 ... response:200 的訊息。若並非如此,請等待幾分鐘,然後重複這個步驟。

  5. 在測試成功之後,按下 Ctrl+C 來停止網路伺服器。

建立憑證

如要建立憑證,請在 VM 上執行下列指令以註冊 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...

將憑證新增至專案

如要將憑證新增至您的專案,請在 VM 上執行下列指令:

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 控制台的「Network Services」(網路服務) >「Create a load balancer」(建立負載平衡器) 頁面,並選取您想為其建立負載平衡器的專案。
    前往「CREATE A LOAD BALANCER」(建立負載平衡器) 頁面

  2. 在「HTTP(S) 負載平衡」下方,按一下「開始設定」

  3. 選取「從網際網路到我的 VM」

  4. 在顯示的「New external Application Load Balancer」(新增外部應用程式負載平衡器) 頁面中,輸入負載平衡器的「Name」(名稱)

  5. 按一下「後端設定」

  6. 在「後端服務和後端值區」下方,選取「建立後端服務」

  7. 為後端服務新增名稱,例如 my-backend-service

  8. 前往「安全性」專區,然後選取「啟用 IAP 來安全地存取應用程式」

    Cloud CDN 和 IAP 不相容。如果您已啟用 Cloud CDN,並選取啟用 IAP,系統會自動停用 Cloud CDN。

  9. 點按「Create」(建立)。「Load balancing」(負載平衡) 頁面會顯示出來,且您的新負載平衡器將建立在負載平衡器清單中。

  10. Google Cloud 主控台完成建立新負載平衡器之後,按一下負載平衡器的名稱,並記下「Details」(詳細資料) >「Frontend」(前端) 下方的外部 IP 位址,在下一步中將會用到。

將網域設定為指向負載平衡器

如要將網域設定為指向負載平衡器,請按照下列步驟設定 A 記錄:

  1. 登入網域代管商提供給您的網域帳戶。
  2. 尋找頁面以更新網域的 DNS 記錄。這個頁面可能叫做「DNS Management」(DNS 管理)、「Name Server Management」(名稱伺服器管理) 或「Advanced Settings」(進階設定)。
  3. 將您的 A 記錄變更為下列值:
    • Name/Host/Alias (名稱/主機/別名):@
    • Value (值):您在上文建立的負載平衡器外部 IP 位址。請勿將通訊埠 :443 包含在 DNS 記錄中。
    • TTL (存留時間):註冊商的預設值,或 86400 (一天)。
  4. 等待 DNS 記錄更新。您剛新增的記錄最多需要一天時間才能傳播完畢。
  5. 如要測試負載平衡器,請使用網路瀏覽器前往採用 https:// 通訊協定的網域。
    • 如果負載平衡器尚未設定,您會看到「HTTP 502」錯誤。
    • 當負載平衡器準備好時,您會看到「Unauthorized request」(要求未獲授權)。

詳情請參閱關於 A 記錄一文。

重新啟動 VM

您必須按照下列步驟在 MIG 中重新啟動 VM,才能從 IAP 正確驗證要求:

  1. 在 Google Cloud 控制台中,前往「Compute Engine」>「Instance groups」(執行個體群組) 頁面
    前往「INSTANCE GROUPS」(執行個體群組) 頁面
  2. 按一下 [my-managed-instance-group]
  3. 在顯示的執行個體群組詳細資料頂端,點選 [Rolling Restart/Replace] (輪動式重新啟動/取代)
  4. 在顯示的「Restart/replace instances of my-managed-instance-group」(重新啟動/取代 my-managed-instance-group 的執行個體) 頁面中,設定下列值:
    • Operation (作業):重新啟動
    • Maximum unavailable (無法使用的執行個體數量上限):3 個執行個體 (共 3 個執行個體)
    • Minimum wait time (最短等待時間):0 秒
  5. 更新完值之後,按一下 [Restart] (重新啟動)

步驟 5:設定 IAP

設定防火牆

接下來,您將設定防火牆以禁止存取基礎 VM 並僅允許透過 IAP 存取:

  1. 前往 Google Cloud 控制台的「VPC network」(VPC 網路) >「Firewall rules」(防火牆規則)
    前往「FIREWALL RULES」(防火牆規則) 頁面
  2. 選取下列規則旁的核取方塊:
    • default-allow-http
    • default-allow-https
    • default-allow-internal
  3. 點選「刪除」。
  4. 點選「Create firewall rule」(建立防火牆規則),並設定下列規則:
    • Name (名稱):allow-iap-traffic
    • Targets (目標):網路中的所有執行個體
    • 來源 IP 範圍 (在方塊中貼上每個值之後,按下 Enter 鍵)。由於負載平衡器必須先與後端通訊,才能正常運作,因此這些 IP 範圍已加入允許清單。
      • 130.211.0.0/22
      • 35.191.0.0/16
    • 通訊協定和通訊埠:
      • 指定的通訊協定和通訊埠
      • tcp:80
  5. 更新完值之後,按一下 [Create] (建立)

設定 IAP

如要為專案設定 IAP,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Security」(安全性) >「Identity-Aware Proxy」頁面,並選取要啟用 IAP 的專案。
    前往「Identity-Aware Proxy」頁面
  2. 如果您尚未設定專案的 OAuth 同意畫面,系統會提示您進行設定:

    1. 前往 OAuth 同意畫面
      設定同意畫面
    2. 在「Support email」(支援電子郵件) 下方,選取您想顯示為公開聯絡人的電子郵件地址。電子郵件地址必須屬於目前登入的使用者帳戶,或是目前登入使用者擔任管理員或擁有者的 Google 群組。
    3. 輸入您想顯示的「Application name」(應用程式名稱)。
    4. 新增您想要的任何選填詳細資料。
    5. 按一下 [儲存]

    如要稍後變更 OAuth 同意畫面上的資訊 (例如產品名稱或電子郵件地址),請重複上述步驟以設定同意畫面。

  3. 在「my-backend-service」旁邊,

  4. 在隨即顯示的「開啟 IAP」視窗中,勾選「我已詳閱設定規定,並按照文件的指示設定我的 Compute Engine 資源」旁的方塊。

  5. 按一下 [開啟]

將主體新增至存取清單

接下來,您會將主體新增至專案的 IAP 存取清單。

  1. 「IAM & admin」(IAM 與管理員) >「Identity-Aware Proxy」右側的「Access」(存取權) 區段,按一下「Add」(新增)
  2. 輸入您要為其提供存取權的主體 (包括您自己在內),然後為這些主體指派「受 IAP 保護的網頁應用程式使用者」角色。主體可以是:
    • Google 帳戶:user@gmail.com
    • Google 群組:admins@googlegroups.com
    • 服務帳戶:server@example.gserviceaccount.com
    • Google Workspace 網域:example.com

步驟 6:測試 IAP

如要測試 IAP 是否正常運作,請按照下列步驟操作:

  1. 在網路瀏覽器中,前往您的網域。
    1. 如果您看到「Unauthorized request」(要求未獲授權),請在幾分鐘之後再試一次。
  2. 看到 Google 登入畫面時,使用您在上一步中為其提供存取權的 Google 帳戶登入。
  3. 您應該會看到類似以下的訊息:「Hi, user@example.com. I am my-managed-instance-group-29z6.」(您好,user@example.com。我是 my-managed-instance-group-29z6)。
  4. 請重新整理頁面,您的瀏覽器應會顯示代管執行個體群組中的 3 個機器的名稱。這是負載平衡器,可跨群組中的 VM 分配流量。

恭喜!您已使用 IAP 成功啟用負載平衡服務。