使用 Identity-Aware Proxy 設定情境感知存取權

本指南說明如何使用存取層級身分與存取權管理 (IAM) 條件架構,擴充 Identity-Aware Proxy (IAP) 存取權政策。存取層級允許根據 IP 位址與使用者裝置屬性,限制對資源的存取權。IAM 條件允許根據網址主機、路徑、日期與時間限制存取權。

例如,根據政策設定,您的敏感應用程式可以執行下列操作:

  • 在所有員工都使用公司網路中受信任的公司裝置時,授予這些員工存取權。
  • 遠端存取群組中的員工使用任何網路中受信任的公司裝置,且這些裝置擁有安全密碼與最新修補程式等級時,授予這些員工存取權。
  • 網址路徑以 /admin 開頭時,只授予存取權給「特殊存取權限」群組中的員工。

事前準備

在您開始之前,您需要擁有下列項目:

  • 您要新增個人或群組存取權的 IAP 安全應用程式。
  • 您要授予存取權的使用者或群組名稱。

設定存取層級

如要根據 IP 位址使用者裝置屬性限制存取權,您必須建立存取層級。如要瞭解如何建立存取層級,請參閱 Access Context Manager 指南。IAP 會使用存取層級名稱,將層級與受 IAP 保護的應用程式建立關聯。

IAP 不支援使用範圍限定政策。存取層級必須在機構存取政策中設定。詳情請參閱「建立存取權政策」。

編輯 IAM 政策

受 IAP 保護的應用程式具有 IAM 政策,可將 IAP 角色繫結至應用程式。

IAM 條件繫結新增至 IAM 政策,系統會根據要求屬性進一步限制對資源的存取權。這些要求屬性包括:

  • 存取層級
  • URL 主機/路徑
  • 日期/時間

請注意,與 request.hostrequest.path (在 IAM 條件繫結中指定) 比較的要求值必須使用確切值。舉例來說,如果您將存取權限制於 /internal admin 開頭的路徑,使用者可以前往 /internal%20admin,略過這項限制。如要進一步瞭解主機名稱和路徑條件,請參閱「使用主機名稱和路徑條件」一文。

請按照以下流程,針對 IAM 政策新增及編輯條件繫結。

主控台

如要使用 Google Cloud 控制台新增條件繫結,請執行下列操作:

  1. 前往 IAP 管理員頁面

    前往 IAP 管理員頁面

  2. 找出您要更新 IAM 權限的資源,然後選取資源旁的核取方塊。

  3. 在右側的「資訊面板」中,按一下「新增主體」

  4. 在「New principal」(新增主體) 方塊中,輸入您要指派角色的主體。

  5. 在「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
  6. 如果您要為主體新增更多角色,請按一下「新增其他角色」

  7. 新增完角色之後,點選 [Save] (儲存)

    現在,您已將條件繫結新增至資源。

如要移除條件繫結,請執行下列操作:

  1. 前往 IAP 管理員頁面

    前往 IAP 管理員頁面

  2. 找出您要從中移除主要對象 IAM 角色的資源,然後選取資源旁的核取方塊。

  3. 在右側「Info panel」(資訊面板) 的「Role / Principal」下方,點選您要從主體身上移除的角色。

  4. 按一下主體旁的「移除」

  5. 在隨即顯示的「Remove role from principal」對話方塊中,按一下「Remove」。如要針對已選取的資源移除主體的所有非沿用角色,請選取核取方塊,然後按一下「移除」

gcloud

目前您只能使用 gcloud 工具設定專案層級條件繫結。

如要設定條件繫結,請按照下列流程編輯專案的 policy.yaml 檔案:

  1. 使用下列 gcloud 指令開啟應用程式的 IAM 政策:

    gcloud iap web get-iam-policy --project=PROJECT_ID > policy.yaml

  2. 編輯 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
    ...
  3. 使用 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

  1. 匯出下列 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}

  2. 使用 getIamPolicy 方法取得 App Engine 應用程式的 IAM 政策。結尾的空資料位元會將 curl 要求轉換為 POST,而不是 GET。

    curl -i -H "Authentication: Bearer $(gcloud auth print-access-token)" \
    ${GAE_BASE_URL}/:getIamPolicy -d ''

  3. 將 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"
      }
    }
    ]
    }
    }

  4. 使用 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 政策。如要針對特定版本服務執行此操作:

  1. 匯出下列其他變數。
    export GAE_SERVICE=SERVICE_NAME
    export GAE_VERSION=VERSION_NAME
  2. 更新匯出的 GAE_BASE_URL 變數。
    export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}/services/${GAE_SERVICE}/versions/${GAE_VERSION}
  3. 使用本文先前提供的 getIamPolicysetIamPolicy 指令,取得並設定版本的 IAM 政策。

GKE 與 Compute Engine

  1. 匯出後端服務的專案 ID。

    export BACKEND_SERVICE_NAME=BACKEND_SERVICE_NAME

  2. 使用 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 ''

  3. 將 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"
    }
    }
    ]
    }
    }

  4. 使用 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.comtestgoogle.com 相符。如果您的目標是將政策限制為所有結尾為 google.com 的子網域,請將政策設為 request.host.endsWith(".google.com")

請注意,政策設為 request.host.endsWith(".google.com") 時會與 sub_domain.google.com 相符,但因為有額外的 .,因此不會與 google.com 相符。

Cloud 稽核記錄和存取層級

針對受 IAP 保護的專案啟用 Cloud 稽核記錄後,即可查看已授權與未授權的存取要求。請按照下列流程,查看要求以及要求者符合的所有存取層級

  1. 前往 Google Cloud 控制台的「Logs Explorer」頁面,查看專案的記錄。
    前往「Logs」(記錄) 頁面
  2. 在「resource selector」(資源選取器) 下拉式清單中,選取資源。 受 IAP 保護的 HTTPS 資源屬於「GAE Application」(GAE 應用程式) 和「GCE Backend Service」(GCE 後端服務)。受 IAP 保護的 SSH 和 TCP 資源位於 GCE VM 執行個體下。
  3. 在「logs type」下拉式清單中,選取「data_access」
    • 只有在您已為 IAP 啟用 Cloud 稽核記錄且有流量進入您的資源,系統才會顯示「data_access」data_access記錄類型。
  4. 按一下以展開您要查看的存取日期與時間。
    • 經過授權的存取以藍色的 i 圖示表示。
    • 未經授權的存取以橘色的 !! 圖示表示。
  5. 按一下展開區段,直到看見 protoPayload > requestMetadata > requestAttributes > auth > accessLevels 為止,然後即可查看要求者符合的存取層級。

請注意,查看要求時,可以看到使用者符合的所有存取層級,包括並非存取必需的存取層級在內。您在查看未經授權的要求時,系統並不會指出不符合的存取層級。將資源的條件與要求中可見的存取層級進行比較,可對此加以判斷。

如要進一步瞭解記錄,請參閱 Cloud 稽核記錄指南。