為 Cloud Run 啟用 IAP

您可以使用下列任一方法,為 Cloud Run 服務啟用 Identity-Aware Proxy:

  1. 建議做法:直接在 Cloud Run 服務啟用 IAP,可享下列優點:

    • 直接保護 run.app 端點,因此您不必佈建負載平衡器資源。

    • 設定更簡單,且可避免額外的負載平衡器費用。

    • 如果選擇在 Cloud Run 前方放置負載平衡器,負載平衡器的端點也會受到保護。

  2. 在 Cloud Run 服務前端的後端服務上啟用 IAP:如果您在多個區域執行 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

    注意:建議您直接在 Cloud Run 啟用 IAP,詳情請參閱 Cloud Run 說明文件。

    如要為負載平衡器的後端服務啟用 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 的應用程式。

    如要允許組織外部或沒有組織的使用者存取,請按照「為外部應用程式啟用 IAP」一文所述,更新 OAuth 用戶端設定,改用自訂 OAuth 用戶端。

    正在啟用 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