本指南說明如何使用存取層級和 身分與存取權管理 (IAM) 條件架構,擴充 Identity-Aware Proxy (IAP) 存取權政策。存取層級允許根據 IP 位址與使用者裝置屬性,限制對資源的存取權。IAM 條件允許根據網址主機、路徑、日期與時間限制存取權。
例如,根據政策設定,您的敏感應用程式可以執行下列操作:
- 在所有員工都使用公司網路中受信任的公司裝置時,授予這些員工存取權。
- 在遠端存取群組中的員工使用任何網路中受信任的公司裝置,且這些裝置擁有安全密碼與最新修補程式等級時,授予這些員工存取權。
- 網址路徑以
/admin
開頭時,只授予存取權給「特殊存取權限」群組中的員工。
事前準備
在您開始之前,您需要擁有下列項目:
- 您要新增個人或群組存取權的 IAP 安全應用程式。
- 您要授予存取權的使用者或群組名稱。
設定存取層級
如要根據 IP 位址或使用者裝置屬性限制存取權,您必須建立存取層級。如要瞭解如何建立存取層級,請參閱 Access Context Manager 指南。IAP 會使用存取層級名稱,將層級與受 IAP 保護的應用程式建立關聯。
IAP 不支援使用範圍限定政策。存取層級必須在機構存取政策中設定。詳情請參閱「建立存取權政策」。
編輯 IAM 政策
受 IAP 保護的應用程式具有 IAM 政策,可將 IAP 角色繫結至應用程式。
將 IAM 條件繫結新增至 IAM 政策,系統會根據要求屬性進一步限制對資源的存取權。這些要求屬性包括:
- 存取層級
- URL 主機/路徑
- 日期/時間
請注意,與 request.host
和 request.path
(在 IAM 條件繫結中指定) 比較的要求值必須使用確切值。舉例來說,如果您將存取權限制於 /internal admin
開頭的路徑,使用者可以前往 /internal%20admin
,略過這項限制。如要進一步瞭解主機名稱和路徑條件,請參閱「使用主機名稱和路徑條件」一文。
請按照以下流程,針對 IAM 政策新增及編輯條件繫結。
主控台
如要使用 Google Cloud 控制台新增條件繫結,請執行下列操作:
前往 IAP 管理員頁面。
找出您要更新 IAM 權限的資源,然後選取資源旁的核取方塊。
在右側的「資訊面板」中,按一下「新增主體」。
在「New principal」(新增主體) 方塊中,輸入您要指派角色的主體。
在「Select a role」(請選擇角色) 下拉式清單中,選取「IAP-secured Web App User」(受 IAP 保護的網路應用程式使用者) 角色,並指定主體必須符合哪些存取層級條件,才能存取資源。
- 如要指定現有存取層級,請從 [Access levels] (存取層級) 下拉式清單中選取。您必須選取「IAP-secured Web App User」角色,並擁有機構層級權限,才能查看現有存取層級。您必須獲得下列其中一個角色:
- Access Context Manager 管理員
- Access Context Manager 編輯者
- Access Context Manager 讀取者
- 如要建立及管理存取層級,請使用 Access Context Manager。
- 如要指定現有存取層級,請從 [Access levels] (存取層級) 下拉式清單中選取。您必須選取「IAP-secured Web App User」角色,並擁有機構層級權限,才能查看現有存取層級。您必須獲得下列其中一個角色:
如果您要為主體新增更多角色,請按一下「新增其他角色」。
新增完角色之後,點選 [Save] (儲存)。
現在,您已將條件繫結新增至資源。
如要移除條件繫結,請執行下列操作:
前往 IAP 管理員頁面。
找出您要從中移除主要對象 IAM 角色的資源,然後選取資源旁的核取方塊。
在右側「Info panel」(資訊面板) 的「Role / Principal」下方,點選您要從主體身上移除的角色。
按一下主體旁的「移除」。
在隨即顯示的「Remove role from principal」對話方塊中,按一下「Remove」。如要針對已選取的資源移除主體的所有非沿用角色,請選取核取方塊,然後按一下「移除」。
gcloud
目前您只能使用 gcloud 工具設定專案層級條件繫結。
如要設定條件繫結,請按照下列流程編輯專案的 policy.yaml
檔案:
使用下列 gcloud 指令開啟應用程式的 IAM 政策:
gcloud iap web get-iam-policy --project=PROJECT_ID > policy.yaml
編輯
policy.yaml
檔案,指定下列內容:- 您要套用 IAM 條件的使用者與群組。
- 您要授予資源存取權的
iap.httpsResourceAccessor
角色。 IAM 條件。
以下程式碼片段示範僅指定一個屬性的 IAM 條件。如果符合 ACCESS_LEVEL_NAME 存取層級要求,且資源網址路徑以
/
開頭,這個條件會授予使用者與群組存取權。
bindings: ... - members: - group:EXAMPLE_GROUP@GOOGLE.COM - user:EXAMPLE_USER@GOOGLE.COM role: roles/iap.httpsResourceAccessor condition: expression: "accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/") title: CONDITION_TITLE ...
使用
set-iam-policy
指令將政策繫結至應用程式。gcloud iap web set-iam-policy --project=PROJECT_ID policy.yaml
現在,您的 IAM 政策已經包含條件繫結。
API
如要編輯應用程式的 policy.json
檔案,請依您應用程式的類型來執行下列程序。如要進一步瞭解如何使用 IAM API 管理存取政策,請參閱「管理受 IAP 保護資源的存取權」一文。
在執行下文的應用程式特定 API 步驟之前,請先匯出下列變數:
export PROJECT_NUM=PROJECT_NUMBER export IAP_BASE_URL=https://iap.googleapis.com/v1/projects/${PROJECT_NUM}/iap_web # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy export JSON_NEW_POLICY=POLICY_FILE.JSON
App Engine
匯出下列 App Engine 變數:
# The APP_ID is usually the project ID export GAE_APP_ID=APP_ID export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}
使用
getIamPolicy
方法取得 App Engine 應用程式的 IAM 政策。結尾的空資料位元會將curl
要求轉換為 POST,而不是 GET。curl -i -H "Authentication: Bearer $(gcloud auth print-access-token)" \ ${GAE_BASE_URL}/:getIamPolicy -d ''
將 IAM 條件繫結新增至 IAM 政策 JSON 檔案。以下是已編輯的
policy.json
檔案範例。此檔案會將iap.httpsResourceAccessor
角色繫結至兩個使用者,進而授予受 IAP 保護資源的存取權。系統已新增 IAM 條件,因此只會在使用者符合 ACCESS_LEVEL_NAME 存取層級要求且資源網址路徑以/
開頭時,才會授予資源的存取權。每個繫結只能有一個條件。
範例 policy.json 檔案{ "policy": { "bindings": [ { "role": "roles/iap.httpsResourceAccessor", "members": [ "group:EXAMPLE_GROUP@GOOGLE.COM", "user:EXAMPLE_USER@GOOGLE.COM" ], "condition": { "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")", "title": "CONDITION_NAME" } } ] } }
使用
setIamPolicy
方法設定新的policy.json
檔案。curl -i -H "Authentication: Bearer $(gcloud auth print-access-token)" \ ${GAE_BASE_URL}:setIamPolicy -d @${JSON_NEW_POLICY}
App Engine 服務與版本
您也可以更新 App Engine 服務、所有版本或特定版本服務的 IAM 政策。如要針對特定版本服務執行此操作:
- 匯出下列其他變數。
export GAE_SERVICE=SERVICE_NAME export GAE_VERSION=VERSION_NAME
- 更新匯出的 GAE_BASE_URL 變數。
export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}/services/${GAE_SERVICE}/versions/${GAE_VERSION}
- 使用本文先前提供的
getIamPolicy
和setIamPolicy
指令,取得並設定版本的 IAM 政策。
GKE 與 Compute Engine
匯出後端服務的專案 ID。
export BACKEND_SERVICE_NAME=BACKEND_SERVICE_NAME
使用
getIamPolicy
方法取得 Compute Engine 應用程式的 IAM 政策。結尾的空資料位元會將curl
要求轉換為 POST,而不是 GET。curl -i -H "Authentication: Bearer $(gcloud auth print-access-token)" \ ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:getIamPolicy \ -d ''
將 IAM 條件繫結新增至 IAM 政策 JSON 檔案。以下是已編輯的
policy.json
檔案範例。此檔案會將iap.httpsResourceAccessor
角色繫結至兩個使用者,進而授予受 IAP 保護資源的存取權。系統已新增 IAM 條件,因此只會在使用者符合 ACCESS_LEVEL_NAME 存取層級要求且資源網址路徑以/
開頭時,才會授予資源的存取權。每個繫結只能有一個條件。
範例 policy.json 檔案{ "policy": { "bindings": [ { "role": "roles/iap.httpsResourceAccessor", "members": [ "group":EXAMPLE_GROUP@GOOGLE.COM, "user:EXAMPLE_USER@GOOGLE.COM" ], "condition": { "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")", "title": "CONDITION_NAME" } } ] } }
使用
setIamPolicy
方法設定新的policy.json
檔案。curl -i -H "Content-Type:application/json" \ -H "Authentication: Bearer $(gcloud auth print-access-token)" \ ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:setIamPolicy \ -d @${JSON_NEW_POLICY}
使用主機名稱和路徑條件
您可以使用要求網址的主機名稱和路徑來保護應用程式存取權。舉例來說,request.path.startsWith
IAM 條件只有在網址路徑以 /admin
開頭時,才會授予存取權給「特殊存取權限」群組中的員工。
如要進一步瞭解主機名稱和路徑條件的使用方式,請參閱「要求屬性」一文。
字串正規化
網址有主機名稱和路徑。例如,網址 https://sheets.google.com/create?query=param
的主機名稱為 sheets.google.com
,路徑為 /create
。
後端解譯主機名稱和路徑的方式有很多種。為免產生混淆,IAP 檢查政策時會將主機名稱和路徑字串正規化。
當要求使用非正規路徑,IAP 會進行兩項政策檢查。如果非正規化路徑通過政策檢查,IAP 會將路徑正規化並開始進行第二項政策檢查。非正規化和正規化後的路徑都通過政策檢查,系統才會授予存取權。
舉例來說,如果要求含有路徑 /internal;some_param/admin
,IAP 首先會對非正規化路徑 (/internal
) 進行其中一項政策檢查。如果檢查通過,IAP 會對正規化路徑 (/internal/admin
) 進行第二項政策檢查。
主機名稱
主機名稱將依據以下標準來正規化:
- 移除結尾的句點 (.)
- 將字元轉換成小寫字元
- 轉換成 ASCII
包含非 ASCII 字元的主機名稱將進一步透過 Punycode 編碼來正規化。您必須使用 Punycode 來編碼主機名稱字串,以便進行比對。
如要透過 Punycode 來編碼您的主機名稱字串,請使用 Punycoder 這類轉換器。
以下是正規化主機名稱範例:
FOO.com
已正規化為foo.com
café.fr
已正規化為xn--caf-dma.fr
路徑
路徑將依據以下標準來正規化:
- 移除路徑參數
- 移除絕對等值的相對路徑
包含所有字元的路徑參數 (包括 ;
到下一個 /
或路徑結尾的參數)。
路徑部分開頭包含 ..;
的要求將視為無效。例如 /..;bar/
和 /bar/..;/
會傳回 HTTP 400: Bad Request
錯誤。
以下是正規化路經範例:
/internal;some_param/admin
已正規化為/internal/admin
/a/../b
已正規化為/b
/bar;param1/baz;baz;param2
已正規化為/bar/baz
子網域結尾
含有 request.host.endsWith("google.com")
的政策組合會與 sub_domain.google.com
和 testgoogle.com
相符。如果您的目標是將政策限制為所有結尾為 google.com
的子網域,請將政策設為 request.host.endsWith(".google.com")
。
請注意,政策設為 request.host.endsWith(".google.com")
時會與 sub_domain.google.com
相符,但因為有額外的 .
,因此不會與 google.com
相符。
Cloud 稽核記錄和存取層級
針對受 IAP 保護的專案啟用 Cloud 稽核記錄後,即可查看已授權與未授權的存取要求。請按照下列流程,查看要求以及要求者符合的所有存取層級:
-
前往 Google Cloud 控制台的「Logs Explorer」頁面,查看專案的記錄。
前往「Logs」(記錄) 頁面 - 在「resource selector」(資源選取器) 下拉式清單中,選取資源。 受 IAP 保護的 HTTPS 資源屬於「GAE Application」(GAE 應用程式) 和「GCE Backend Service」(GCE 後端服務)。受 IAP 保護的 SSH 和 TCP 資源位於 GCE VM 執行個體下。
-
在「logs type」下拉式清單中,選取「data_access」。
- 只有在您已為 IAP 啟用 Cloud 稽核記錄且有流量進入您的資源,系統才會顯示「data_access」data_access記錄類型。
-
按一下以展開您要查看的存取日期與時間。
- 經過授權的存取以藍色的
i
圖示表示。 - 未經授權的存取以橘色的
!!
圖示表示。
- 經過授權的存取以藍色的
-
按一下展開區段,直到看見
protoPayload
>requestMetadata
>requestAttributes
>auth
>accessLevels
為止,然後即可查看要求者符合的存取層級。
請注意,查看要求時,可以看到使用者符合的所有存取層級,包括並非存取必需的存取層級在內。您在查看未經授權的要求時,系統並不會指出不符合的存取層級。將資源的條件與要求中可見的存取層級進行比較,可對此加以判斷。
如要進一步瞭解記錄,請參閱 Cloud 稽核記錄指南。