您可以透過兩種方式為 Cloud Run 服務啟用 IAP:直接在 Cloud Run 服務上啟用,或在 Cloud Run 服務前端的後端服務上啟用。
建議您直接在 Cloud Run 上啟用 IAP。
這項功能可保護 run.app
端點,以及您設定的負載平衡器端點。
如要集中管理存取權,或將流量導向多個區域,請繼續進行下列程序。
本頁說明如何透過後端服務或負載平衡器,使用 IAP 保護 Cloud Run 服務。如果您在多個區域中執行 Cloud Run,並將這些區域附加至同一個負載平衡器全域後端服務,請按照本頁的說明,為後端服務設定一次 IAP。
已知限制
在負載平衡器上啟用 IAP 時,IAP 只會透過負載平衡器保護流量,不會保護可能透過 Cloud Run 服務
run.app
URL 抵達的流量。如要只允許 IAP 授權的流量,請參閱設定 Cloud Run 來限制存取權。IAP 會使用
X-Serverless-Authorization
標頭向 Cloud Run 進行驗證。Cloud Run 會移除簽章,然後將這個標頭傳遞至服務。如果您的服務設計是將要求轉送至需要 IAM 驗證的其他 Cloud Run 服務,請先更新服務以移除這個標頭。IAP 與 Cloud CDN 不相容。
IAP 會增加延遲時間。僅針對不容易受到延遲影響的執行個體啟用 IAP。
事前準備
如要為 IAP 中的 Cloud Run 資源啟用 IAP,請先準備好下列項目:
- 啟用計費功能的 Google Cloud 主控台專案。
- 一或多個 Cloud Run 服務的群組,由負載平衡器提供服務。
- 瞭解如何設定外部 HTTPS 負載平衡器。
- 瞭解如何設定內部 HTTPS 負載平衡器。
- 已註冊至您負載平衡器位址的網域名稱。
- 確認所有要求都擁有身分識別資訊的應用程式程式碼。
- 瞭解如何取得使用者身分識別資訊。
IAP 會使用 Google 代管的 OAuth 用戶端驗證使用者。只有機構內的使用者可以存取啟用 IAP 的應用程式。如要允許機構外部使用者存取,請參閱「為外部應用程式啟用 IAP」。
從後端服務或負載平衡器啟用 IAP
如要從後端服務或負載平衡器後方的 IAP 啟用 IAP,請按照下列操作說明進行。
控制台
使用 Google Cloud 控制台啟用 IAP 時,無法使用 Google 代管的 OAuth 用戶端。
如果您尚未設定專案的 OAuth 同意畫面,系統會提示您進行設定。如要設定 OAuth 同意畫面,請參閱「設定 OAuth 同意畫面」。
設定 IAP 存取權
- 前往「Identity-Aware Proxy」頁面。
- 選取要使用 IAP 保護的專案。
- 在「應用程式」下方,選取要新增成員的負載平衡器後端服務旁的核取方塊。
- 在右側面板中,按一下「新增主體」。
在「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
從「Roles」(角色) 下拉式清單中選取「Cloud IAP」>「IAP-secured Web App User」(受 IAP 保護的網路應用程式使用者)。
按一下 [儲存]。
正在啟用 IAP
- 在 IAP 頁面的「APPLICATIONS」(應用程式) 下方,找到要限制存取權的負載平衡器後端服務。如要為資源啟用 IAP,請按一下「IAP」切換按鈕。
如要啟用 IAP:
- 負載平衡器前端設定中至少一個通訊協定必須為 HTTPS。瞭解如何設定負載平衡器。
- 您需要
compute.backendServices.update
、clientauthconfig.clients.create
和clientauthconfig.clients.getWithSecret
權限。這些權限係由諸如專案編輯者角色等角色來授予。詳情請參閱「管理受 IAP 保護資源的存取權」。
- 在顯示的「開啟 IAP」視窗中,按一下「開啟」,確認要使用 IAP 保護資源。啟用 IAP 後,所有連線都必須提供登入憑證,才能連上負載平衡器。系統只會為專案中擁有「IAP-Secured Web App User」(受 IAP 保護的網路應用程式使用者) 角色的帳戶提供存取權。
按照「使用 IAM 控管存取權」的說明,授權 IAP 將流量傳送至後端 Cloud Run 服務。
- Principal:
service-[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
- Principal:
gcloud
- 如果您先前未在專案中執行這項操作,請執行下列指令建立 IAP 服務代理。如果您先前已建立服務代理程式,執行指令不會重複建立。
gcloud beta services identity create --service=iap.googleapis.com --project=[PROJECT_ID]
- 執行下列指令,將叫用者權限授予上一個步驟中建立的服務帳戶。
gcloud run services add-iam-policy-binding [SERVICE-NAME] \ --member='serviceAccount:service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com' \ --role='roles/run.invoker'
視負載平衡器後端服務是全域或區域服務,執行全域或區域範圍的指令,啟用 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
- 如果您先前未執行這項操作,請在專案中執行下列指令,建立 IAP 服務代理程式。如果您先前已建立服務代理程式,執行指令不會重複建立。
resource "google_project_service" "project" { project = "your-project-id" service = "iap.googleapis.com" }
- 執行下列指令,將叫用者權限授予上一步建立的服務代理程式。
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", ] }
視負載平衡器而定,執行全域或區域指令來啟用 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 Invoker 角色的 IAP 呼叫執行 run.routes.invoke
權限檢查。正式發布 (GA) 後,Cloud Run 會執行這項權限檢查。
為避免重大變更,我們將在預先發布期間依賴這項行為的部分客戶專案加入允許清單,因此系統不會檢查權限。請與 Cloud Run 支援團隊聯絡,將這類專案從僅限預覽的許可清單中移除。
後續步驟
如要使用 Terraform 設定 Cloud Run 的 IAP,請參閱 Terraform 程式碼範例。