為 Cloud Run 服務啟用 Identity-Aware Proxy 的方法有兩種。
- 建議做法: 直接在 Cloud Run 服務上:
- 直接保護
run.app端點,因此您不必佈建負載平衡器資源。 - 設定更簡單,且可避免額外的負載平衡器費用。
- 如果選擇在 Cloud Run 前方放置負載平衡器,負載平衡器的端點也會受到保護。
- 直接保護
- 在 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 上啟用,則必須具備下列條件:
- 已啟用計費功能的 Google Cloud 控制台專案。
- 一或多個 Cloud Run 服務的群組,由負載平衡器提供服務。
- 瞭解如何設定外部 HTTPS 負載平衡器。
- 瞭解如何設定內部 HTTPS 負載平衡器。
- 已註冊至您負載平衡器位址的網域名稱。
- 確認所有要求都擁有身分識別資訊的應用程式程式碼。
- 瞭解如何取得使用者身分識別資訊。
透過後端服務或負載平衡器啟用 IAP
如果必須從後端服務或負載平衡器後方的 IAP 啟用 IAP,請按照下列操作說明進行。
控制台
如果您尚未設定專案的 OAuth 同意畫面,系統會提示您進行設定。如要設定 OAuth 同意畫面,請參閱「設定 OAuth 同意畫面」。
設定 IAP 存取權
- 前往「Identity-Aware Proxy」頁面。
- 選取要使用 IAP 保護的專案。
- 在「應用程式」下方,找出要新增成員的負載平衡器後端服務,然後勾選旁邊的核取方塊。
- 在右側面板中,按一下「Add Principal」(新增主體)。
在「新增主體」對話方塊中,輸入應具備專案「受 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 時,系統會使用 Google 代管的 OAuth 用戶端驗證使用者。因此,只有組織內的使用者可以存取已啟用 IAP 的應用程式。
如要允許組織外部或沒有組織的使用者存取,請更新 OAuth 用戶端設定,改用自訂 OAuth 用戶端,詳情請參閱「為外部應用程式啟用 IAP」。
正在啟用 IAP
- 在「IAP」頁面的「應用程式」下方,找出要限制存取權的負載平衡器後端服務。如要啟用資源的 IAP,請按一下「IAP」切換鈕。如何啟用 IAP:
- 負載平衡器前端設定中至少要有一個通訊協定為 HTTPS。瞭解如何設定負載平衡器。
- 您需要
compute.backendServices.update、clientauthconfig.clients.create和clientauthconfig.clients.getWithSecret權限。這些權限是由角色 (例如專案編輯者角色) 授予。詳情請參閱「管理 IAP 保護資源的存取權」。
- 在顯示的「啟用 IAP」視窗中,按一下「啟用」,確認要讓 IAP 保護資源。啟用 IAP 後,所有連至負載平衡器的連線都必須提供登入憑證。只有在專案中具備「受 IAP 保護的網頁應用程式使用者」角色的帳戶,才能存取。
按照「使用 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
- 如果您先前未在專案中建立 IAP 服務代理,請執行下列指令來建立。如果先前已建立服務代理,執行指令不會重複建立。
gcloud 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" } 新增下列內容,將
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 替換為專案編號。
視負載平衡器而定,執行全域或區域指令來啟用 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 支援團隊聯絡,將這類專案從僅限預先發布版的許可清單中移除。