為 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 只會透過負載平衡器保護流量,不會保護可能透過 Cloud Run 服務 run.app 網址抵達的流量。如要只允許 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. 在「APPLICATIONS」(應用程式) 下方,找出要新增成員的負載平衡器後端服務,然後選取旁邊的核取方塊。
  4. 在右側側邊面板中,按一下「新增主體」
  5. 在「Add Principal」(新增主體) 對話方塊中,輸入群組或個別使用者的帳戶,這些群組或個別使用者應擁有專案的「IAP-Secured Web App User」(受 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 頁面的「APPLICATIONS」(應用程式) 下方,找到要限制存取權的負載平衡器後端服務。如要為資源啟用 IAP,請按一下「IAP」切換按鈕。 如要啟用 IAP:
    • 負載平衡器前端設定中至少一個通訊協定必須為 HTTPS。瞭解如何設定負載平衡器
    • 您需要 compute.backendServices.updateclientauthconfig.clients.createclientauthconfig.clients.getWithSecret 權限。這些權限係由諸如專案編輯者角色等角色來授予。詳情請參閱「管理受 IAP 保護資源的存取權」。
  2. 在顯示的「開啟 IAP」視窗中,按一下「開啟」,確認要使用 IAP 保護資源。啟用 IAP 後,所有連線都必須提供登入憑證,才能連上負載平衡器。只有專案中擁有「受 IAP 保護的網頁應用程式使用者」角色的帳戶,才能取得存取權。
  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,透過 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 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 權限檢查。正式發布後,Cloud Run 會執行這項權限檢查。

為避免重大變更,我們已將在搶先版期間依賴這項行為的部分客戶專案加入允許清單,因此系統不會檢查權限。請與 Cloud Run 支援團隊聯絡,將這類專案從僅限預覽的許可清單中移除。

後續步驟

為 Cloud Run 設定 IAP