為 Cloud Run 啟用 IAP

您可以透過兩種方式為 Cloud Run 服務啟用 IAP,直接在 Cloud Run 服務上或在 Cloud Run 服務前端的後端服務上執行。

建議您直接在 Cloud Run 上啟用 IAP。這可保護 run.app 端點,如果您設定負載平衡器,也會保護負載平衡器端點。

如果您需要集中式存取權管理,或想將流量路由至多個區域,請繼續執行下列程序。

本頁面說明如何透過後端服務或負載平衡器,使用 IAP 保護 Cloud Run 服務。如果您在附加至同一個負載平衡器全域後端服務的多個區域中執行 Cloud Run,請按照本頁說明設定後端服務的 IAP。

已知限制

  • 在負載平衡器上啟用 IAP 時,IAP 只會保護透過負載平衡器傳送的流量,而不會保護可能透過 run.app 網址傳送至 Cloud Run 服務的流量。如要只允許 IAP 授權的流量,請參閱「設定 Cloud Run 以限制存取權」。

  • IAP 會使用 X-Serverless-Authorization 標頭向 Cloud Run 進行驗證。Cloud Run 會在移除簽章後,將這個標頭傳遞至您的服務。如果您的服務設計為將要求轉送至需要 IAM 驗證的其他 Cloud Run 服務,請先更新服務以移除這個標頭。

  • IAP 與 Cloud CDN 不相容。

  • IAP 會增加延遲時間。僅針對不受延遲影響的執行個體啟用 IAP。

事前準備

如要為 IAP 中的 Cloud Run 資源啟用 IAP,您需要:

IAP 會使用 Google 代管的 OAuth 用戶端來驗證使用者。只有機構內的使用者可以存取啟用 IAP 的應用程式。如要允許機構外使用者存取,請參閱「為外部應用程式啟用應用程式內購功能」。

從後端服務或負載平衡器啟用 IAP

如要啟用後端服務或負載平衡器後方的 IAP 中的 IAP,請按照下列操作說明操作。

控制台

使用 Google Cloud 主控台啟用 IAP 時,Google 代管的 OAuth 用戶端就無法使用。

如果您尚未設定專案的 OAuth 同意畫面,系統會提示您進行設定。如要設定 OAuth 同意畫面,請參閱「設定 OAuth 同意畫面」。

設定 IAP 存取權

  1. 前往「Identity-Aware Proxy」頁面
  2. 選取要使用 IAP 保護的專案。
  3. 在「應用程式」下方,選取要新增成員的負載平衡器後端服務旁的核取方塊。
  4. 在右側面板中,按一下「Add Principal」(新增管理員)
  5. 在「Add Principal」對話方塊中,輸入群組或個別使用者的帳戶,這些群組或個別使用者應擁有專案的「IAP-secured Web App User」角色。成員可為以下類型的帳戶:

    • Google 帳戶:user@gmail.com - 這也可以是 Google Workspace 帳戶,例如 user@google.com 或其他 Workspace 網域。
    • Google 群組:admins@googlegroups.com
    • 服務帳戶:server@example.iam.gserviceaccount.com
    • Google Workspace 網域:example.com
  6. 從「Roles」(角色) 下拉式清單中選取「Cloud IAP」>「IAP-secured Web App User」(受 IAP 保護的網路應用程式使用者)

  7. 按一下 [儲存]

正在啟用 IAP

  1. 在「IAP 頁面」的「應用程式」下方,找出您要限制存取權的負載平衡器後端服務。如要為資源啟用 IAP,請按一下「IAP」切換按鈕。如要啟用 IAP,請按照下列步驟操作:
    • 負載平衡器前端設定中至少一個通訊協定必須為 HTTPS。瞭解如何設定負載平衡器
    • 您需要具備 compute.backendServices.updateclientauthconfig.clients.createclientauthconfig.clients.getWithSecret 權限。這些權限係由諸如專案編輯者角色等角色來授予。如要進一步瞭解,請參閱「管理受 IAP 保護資源的存取權」。
  2. 在隨即顯示的「Turn on IAP」(開啟 IAP) 視窗中,按一下「Turn On」(開啟),確認您要使用 IAP 保護資源。啟用 IAP 後,系統會要求您提供負載平衡器所有連線的登入憑證。只有在專案中擁有「IAP-Secured Web App User」角色的帳戶才能取得存取權。
  3. 請按照「使用 IAM 控管存取權」中的說明操作,授權 IAP 將流量傳送至後端 Cloud Run 服務。

    • Principalservice-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com
    • 角色Cloud Run 叫用者

    啟用 IAP 時,系統會建立 IAP 服務帳戶。如果 IAP 服務帳戶不在主要使用者清單中,您可以執行下列 gcloud 指令來建立帳戶:

    gcloud beta services identity create
        --service=iap.googleapis.com
        --project=PROJECT_ID
    

gcloud

  1. 如果您先前未在專案中執行這項操作,請執行下列指令來建立 IAP 服務代理。如果您先前已建立服務代理程式,執行這項指令不會重複建立。
    gcloud beta services identity create --service=iap.googleapis.com --project=[PROJECT_ID]
  2. 執行下列指令,為先前步驟建立的服務帳戶授予叫用者權限。
    gcloud run services add-iam-policy-binding [SERVICE-NAME] \
    --member='serviceAccount:service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com'  \
    --role='roles/run.invoker'
    
  3. 視負載平衡器後端服務是全球性或地區性而定,執行全域或區域範圍的指令來啟用 IAP。使用上一個步驟中的 OAuth 用戶端 ID 和密鑰。

    全域範圍

    gcloud compute backend-services update BACKEND_SERVICE_NAME --global --iap=enabled
    

    區域範圍

    gcloud compute backend-services update BACKEND_SERVICE_NAME --region REGION_NAME --iap=enabled
    
    取代下列內容:

    • BACKEND_SERVICE_NAME:後端服務名稱。
    • REGION_NAME:您要啟用 IAP 的地區。

啟用 IAP 之後,您可以使用 Google Cloud CLI,以身分與存取權管理角色 roles/iap.httpsResourceAccessor 操控 IAP 存取權政策。詳情請參閱「管理受 IAP 保護資源的存取權」。

Terraform

  1. 如果您先前未執行這項操作,請在專案中執行下列指令,建立 IAP 服務代理。如果您先前已建立服務代理程式,執行這項指令不會重複建立。
    resource "google_project_service" "project" {
      project = "your-project-id"
      service = "iap.googleapis.com"
    }
    
  2. 執行下列指令,為先前步驟建立的服務代理程式授予叫用者權限。
    resource "google_cloud_run_service_iam_binding" "binding" {
      location = google_cloud_run_v2_service.default.location
      service  = google_cloud_run_v2_service.default.name
      role = "roles/run.invoker"
      members = [
        "serviceAccount:service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com",
      ]
    }
    
  3. 視負載平衡器而定,執行全域或區域指令即可啟用 IAP。使用上一個步驟中的 OAuth 用戶端 ID 和密鑰。

    • 全域範圍

      resource "google_compute_backend_service" "default" {
        name                  = "tf-test-backend-service-external"
        protocol              = "HTTPS"
        load_balancing_scheme = "EXTERNAL_MANAGED"
        iap {
          enabled              = true
          oauth2_client_id     = "abc"
          oauth2_client_secret = "xyz"
        }
      }
      

    • 區域範圍

      resource "google_compute_region_backend_service" "default" {
        name                  = "tf-test-backend-service-external"
        protocol              = "HTTPS"
        load_balancing_scheme = "EXTERNAL_MANAGED"
        iap {
          enabled              = true
          oauth2_client_id     = "abc"
          oauth2_client_secret = "xyz"
        }
      }
      

設定 Cloud Run 限制存取權

如要避免流量透過 Cloud Run 服務的預設 run.app 網址轉送,請停用預設網址。否則,請將輸入設定設為「限制 Cloud Run 的網路輸入」

排解錯誤

存取 Cloud Run 的權限遭拒

 Your client does not have permission to get URL from this server 
  • IAP 會使用 IAP 服務帳戶權限來叫用 Cloud Run 服務。請確認您已將 Cloud Run 叫用者角色授予下列服務帳戶:service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com

  • 如果您已將 Cloud Run 叫用者角色授予上述服務帳戶,但仍遇到這個問題,請重新部署 Cloud Run 服務。

服務代理失敗導致設定 IAM 錯誤

首次在新專案中啟用 IAP 可能會導致以下錯誤:

Setting IAM permissions failed

這是因為 Cloud Run 服務代理失敗。如要解決這個問題,請再次啟用 IAP,或手動設定 IAM 政策

無法透過 gcloud CLI 設定 IAP

 The IAP service account is not provisioned 

如果看到這項錯誤,請執行下列指令:

gcloud beta services identity create --service=iap.googleapis.com --project=[PROJECT_ID]

IAP 服務帳戶不需要 run.routes.invoke 權限

在使用 Cloud Run 預覽版的 IAP 期間,Cloud Run 並未針對使用 Cloud Run 叫用者角色的 IAP 呼叫執行 run.routes.invoke 權限檢查。在正式發布 (GA) 版中,Cloud Run 會執行這項權限檢查。

為避免變更造成異動,在預覽期間,我們將部分依賴這項行為的客戶專案放入許可清單,以便不檢查權限。請與 Cloud Run 支援團隊聯絡,將這類專案從「僅限預覽」許可清單中移除。

後續步驟

如要使用 Terraform 設定 Cloud Run 的 IAP,請參閱 Terraform 程式碼範例