為 Cloud Run 啟用 IAP

為 Cloud Run 服務啟用 Identity-Aware Proxy 的方法有兩種。

  1. 建議做法: 直接在 Cloud Run 服務上:
    • 直接保護 run.app 端點,因此您不必佈建負載平衡器資源。
    • 設定更簡單,且可避免額外的負載平衡器費用。
    • 如果選擇在 Cloud Run 前方放置負載平衡器,負載平衡器的端點也會受到保護。
  2. 在 Cloud Run 服務前端的後端服務上:如果您在多個區域執行 Cloud Run,並連結至同一個負載平衡器全域後端服務,且需要集中管理存取權,請按照本頁面的操作說明進行。否則,建議您直接在 Cloud Run 服務上啟用 IAP。

已知限制

  • IAP 無法同時用於 Cloud Run 服務和負載平衡器。如果在負載平衡器上啟用 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。

事前準備

建議您直接在 Cloud Run 啟用 IAP。

如果您選擇在負載平衡器上為 Cloud Run 資源啟用 IAP,而非直接在 Cloud Run 上啟用,則必須具備下列條件:

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

如果必須從後端服務或負載平衡器後方的 IAP 啟用 IAP,請按照下列操作說明進行。

控制台

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

設定 IAP 存取權

  1. 前往「Identity-Aware Proxy」頁面。
  2. 選取要使用 IAP 保護的專案。
  3. 在「應用程式」下方,找出要新增成員的負載平衡器後端服務,然後勾選旁邊的核取方塊。
  4. 在右側面板中,按一下「Add Principal」(新增主體)。
  5. 在「新增主體」對話方塊中,輸入應具備專案「受 IAP 保護的網頁應用程式使用者」角色的群組或個人帳戶。成員可為以下類型的帳戶:

    • 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 時,系統會使用 Google 代管的 OAuth 用戶端驗證使用者。因此,只有組織內的使用者可以存取已啟用 IAP 的應用程式。

如要允許組織外部或沒有組織的使用者存取,請更新 OAuth 用戶端設定,改用自訂 OAuth 用戶端,詳情請參閱「為外部應用程式啟用 IAP」。

正在啟用 IAP

  1. 在「IAP」頁面的「應用程式」下方,找出要限制存取權的負載平衡器後端服務。如要啟用資源的 IAP,請按一下「IAP」切換鈕。如何啟用 IAP:
    • 負載平衡器前端設定中至少要有一個通訊協定為 HTTPS。瞭解如何設定負載平衡器。
    • 您需要 compute.backendServices.update、clientauthconfig.clients.create 和 clientauthconfig.clients.getWithSecret 權限。這些權限是由角色 (例如專案編輯者角色) 授予。詳情請參閱「管理 IAP 保護資源的存取權」。
  2. 在顯示的「啟用 IAP」視窗中,按一下「啟用」,確認要讓 IAP 保護資源。啟用 IAP 後,所有連至負載平衡器的連線都必須提供登入憑證。只有在專案中具備「受 IAP 保護的網頁應用程式使用者」角色的帳戶,才能存取。
  3. 按照「使用 IAM 控管存取權」一文的指示,授權 IAP 將流量傳送至後端 Cloud Run 服務。

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

    啟用 IAP 時,系統會建立 IAP 服務帳戶。如果主體清單中沒有 IAP 服務帳戶,請執行下列 gcloud 指令來建立:

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

gcloud

  1. 如果您先前未在專案中建立 IAP 服務代理,請執行下列指令來建立。如果先前已建立服務代理,執行指令不會重複建立。
    gcloud 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,透過 Identity and Access Management 角色 roles/iap.httpsResourceAccessor 操控 IAP 存取權政策。詳情請參閱「管理受 IAP 保護資源的存取權」。

Terraform

  1. 如果您先前未在專案中建立 IAP 服務代理,請執行下列指令。如果先前已建立服務代理,執行指令不會重複建立。
    resource "google_project_service" "project" {
      project = "your-project-id"
      service = "iap.googleapis.com"
    }
    
  2. 新增下列內容,將 roles/run.invoker 角色授予 IAP 服務代理。

    resource "google_cloud_run_v2_service_iam_member" "iap_invoker" {
      project = google_cloud_run_v2_service.default.project
      location = google_cloud_run_v2_service.default.location
      name = google_cloud_run_v2_service.default.name
      role   = "roles/run.invoker"
      member = "serviceAccount:service-"PROJECT_NUMBER@gcp-sa-iap.iam.gserviceaccount.com"
    }
    

    將 PROJECT_NUMBER 替換為專案編號。

  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 services identity create --service=iap.googleapis.com --project=[PROJECT_ID]

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

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

為避免破壞性變更,在預先發布版期間,某些依賴這項行為的客戶專案會列入許可清單,因此不會檢查權限。請與 Cloud Run 支援團隊聯絡,將這類專案從僅限預先發布版的許可清單中移除。

後續步驟

設定 Cloud Run 的 IAP