為 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)
  • 建立人脈
    • 全域負載平衡器轉送規則
    • 輸入流量

如需以預測使用量為基礎的預估費用,請參閱這個 Pricing Calculator

新的 Cloud Platform 使用者可能符合免費試用的資格。

事前準備

在開始本教學課程之前,您需要執行下列操作:

  1. 選取或建立 Google Cloud 專案。
    前往「專案」頁面

  2. 啟用專案的計費功能。瞭解如何修改專案的帳單設定

步驟 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
    

更新完值之後,按一下「Create」(建立),建立範本。

步驟 2:建立代管執行個體群組

在 Google Cloud 控制台中,前往「Compute Engine」>「Create a new instance group」(建立新的執行個體群組) 頁面,並選取您要在其中建立 Managed Instance Group 的專案。

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

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

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

    • 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 執行個體」頁面。
    前往「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. 點選 [Backend configuration] (後端設定),然後選取 [Backend services] (後端服務) > [Create a backend service] (建立後端服務)

  6. 在「Create back-end service」(建立後端服務) 面板的「Name」(名稱) 方塊中輸入 my-backend-service

  7. 在「New backend」(新增後端) 下,除下列選項以外,均使用預設值:

    • Instance group (執行個體群組):my-managed-instance-group
  8. 在「Health check」(健康狀態檢查) 下方,選取 [my-health-check]

  9. 更新完值之後,按一下 [Create] (建立)。「New HTTP(S) load balancer」(新增 HTTP(S) 負載平衡器) 面板會重新顯示。

  10. 點選 [Host and path rules] (主機與路徑規則),載入預設值。您不需要新增任何規則。

  11. 按一下 [Frontend configuration] (前端設定)。除下列選項以外,均使用預設值:

    • Protocol (通訊協定):HTTPS
    • IP address (IP 位址):按一下「Create IP address」(建立 IP 位址)
      • 輸入「Name」(名稱),以與新的靜態 IP 位址建立關聯。
      • 按一下 [Reserve] (預約),預約靜態 IP 位址。
    • Certificate (憑證):my-cert
  12. 輸入完前端設定值之後,點選「Done」(完成)

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

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

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

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

  1. 登入網域代管商提供給您的網域帳戶。
  2. 尋找頁面以更新網域的 DNS 記錄。這個頁面可能叫做「DNS Management」(DNS 管理)、「Name Server Management」(名稱伺服器管理) 或「Advanced Settings」(進階設定)。
  3. 將您的 A 記錄變更為下列值:
    • Name/Host/Alias (名稱/主機/別名):@
    • Value (值):您在上文建立的負載平衡器外部 IP 位址。請勿在 DNS 記錄中加入通訊埠 :443
    • 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」(虛擬私有雲網路) >「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 範圍,因此 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. 在隨即顯示的「Turn on IAP」視窗中,選取「I have read the configuration requirements and configured my Compute Engine resource according to documentation」(我已詳閱設定規定,並按照文件的指示設定我的 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.」
  4. 請重新整理頁面,您的瀏覽器應會顯示代管執行個體群組中的 3 個機器的名稱。這是負載平衡器,可跨群組中的 VM 分配流量。

恭喜!您已使用 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 為其提供保護。