建立及套用 IAP 安全性資源的存取層級

本頁說明如何使用 Access Context Manager 建立存取層級,並將這些層級套用至Identity-Aware Proxy (IAP) 保護的資源。

總覽

存取層級是一組根據要求來源而指派給要求的屬性。您可以依據裝置類型、IP 位址和使用者身分等資訊,指派要授予的存取層級。舉例來說,您可針對公司內部連線指派「High_Trust」層級,而執行已核准作業系統的外部裝置則可指派「Medium_Trust」信任關係。

設定端點驗證後,存取層級就會收集並參照裝置資訊。端點驗證會建立清單,列出所有存取公司資源的企業和個人裝置。

如要強制執行存取層級,請將存取層級新增為受 IAP 保護資源的身分與存取權管理 (IAM) 條件。您可以透過 IAP 採用精細的資源層級存取權控管模型,而非使用網路層級防火牆。舉例來說,您可以為許多資源指派「Medium_Trust」層級,但有些比較敏感的資源則需要「High_Trust」層級。

詳情請參閱 Access Context Manager 總覽。

事前準備

開始之前,請先完成下列步驟:

  • 使用 IAP 保護資源。
  • 設定 Endpoint Verification。請注意,只有在您想根據使用者裝置資訊 (例如儲存空間加密狀態) 限制資源存取權時,才需要執行這項操作。
  • 請確認您已獲得專案的下列任一角色。

    • Access Context Manager 管理員
    • Access Context Manager 編輯者

建立存取層級

以下程序會建立存取層級。

在本例中,假設您要建立存取層級,讓內部稽核員群組存取專案的 Google Cloud Observability。稽核員所有裝置的指定 IP 都位於範圍在 203.0.113.0203.0.113.127 之間的子網路。此外,您也希望確保裝置已加密。您知道除了稽核員使用的裝置以外,不會有任何其他裝置指派到該子網路。

主控台

  1. 前往 Google Cloud 控制台的 Access Context Manager 頁面。

    前往 Access Context Manager 頁面

  2. 如果系統提示您選取機構,請依提示選取您的機構。

  3. 按一下「Access Context Manager」頁面最上方的 [New] (新增)

  4. 在「New Access Level」(建立新的存取層級) 窗格中,按一下「Conditions」(條件) 部分的「Add attribute」(新增屬性),然後再按一下「Device Policy」(裝置政策)

  5. 按一下「儲存空間加密」下拉式選單,然後選取「已加密」。 請注意,您必須先在員工裝置上設定端點驗證,這項規則才會生效。

  6. 再次按一下「新增屬性」,然後選取「IP 子網路」

  7. 在「IP Subnetworks」(IP 子網路) 方塊中輸入一或多個 IPv4 或 IPv6 範圍 (CIDR 區塊格式)。

    在本例中,如要限制只有稽核員可存取,請在「IP Subnetworks」(IP 子網路) 方塊中輸入 203.0.113.0/25

  8. 按一下 [儲存]

gcloud

  1. 為包含一或多個 IPv4 或 IPv6 (CIDR 區塊格式) 範圍的存取層級建立 YAML 檔案。

    在本例中,如要僅限稽核員存取,請在 YAML 檔案中輸入以下程式碼:

    - ipSubnetworks:
        - 203.0.113.0/25
    - devicePolicy:
        allowedEncryptionStatuses
          - ENCRYPTED
    

    如需存取層級屬性及其 YAML 格式的清單,請參閱「存取層級屬性」。如需所有可能屬性的完整 YAML 檔案,請參閱這個存取層級 YAML 檔案範例

    請注意,您必須先在員工裝置上設定端點驗證devicePolicy 規則才會生效。

  2. 儲存檔案。本例的檔案名稱為「CONDITIONS.yaml」

  3. 建立存取層級。

    gcloud access-context-manager levels create NAME \
       --title TITLE \
       --basic-level-spec CONDITIONS.yaml \
       --policy=POLICY_NAME

    其中:

    • NAME 是存取層級的唯一名稱,開頭須為英文字母,且只能由英文字母、數字和底線組成。

    • TITLE 是使用者可理解的文字標題,政策不得使用重複的標題。

    • POLICY_NAME 是指您機構的存取權政策名稱。

    畫面會顯示類似以下的輸出:

    Create request issued for: NAME
    Waiting for operation [accessPolicies/POLICY_NAME/accessLevels/NAME/create/1521594488380943] to complete...done.
    Created level NAME.
    

API

  1. 編寫要求主體,建立 AccessLevel 資源,其中包含一或多個 IPv4 或 IPv6 範圍 (CIDR 區塊格式),以及要求加密儲存空間的裝置政策。

    在本例中,如要僅限稽核員存取,請在要求主體中輸入以下程式碼:

    {
     "name": "NAME",
     "title": "TITLE",
     "basic": {
       "conditions": [
         {
           "ipSubnetworks": [
             "203.0.113.0/25"
           ]
         },
         {
         "devicePolicy": [
           "allowedEncryptionStatuses": [
             "ENCRYPTED"
           ]
         ]
         }
       ]
     }
    }

    其中:

    • NAME 是存取層級的唯一名稱,開頭須為英文字母,且只能由英文字母、數字和底線組成。

    • TITLE 是使用者可理解的文字標題,政策不得使用重複的標題。

  2. 以呼叫 accessLevels.create 的方式來建立存取層級。

    POST https://accesscontextmanager.googleapis.com/v1/accessPolicies/POLICY_NAME/accessLevels

    其中:

    • POLICY_NAME 是指您機構的存取權政策名稱。

套用存取層級

受 IAP 保護的資源具有 IAM 政策,可將 IAP 角色繫結至資源。

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

  • 存取層級
  • 網址主機和路徑
  • 日期與時間

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

將存取層級套用至 IAP 資源時,請務必確保存取層級位於機構層級,而非專案或資料夾層級。下列步驟說明如何更新 IAM 政策,將存取層級新增至受 IAP 保護的資源。

主控台

  1. 前往 IAP 頁面

    前往 IAP 頁面

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

  3. 在右側的「Info panel」(資訊面板) 中,按一下「Add principal」(新增主體)

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

  5. 在「Select a role」(選擇角色) 下拉式清單中,選取「IAP-secured Web App User」(受 IAP 保護的網路應用程式使用者) 角色。

  6. 如要指定現有存取層級,請從「存取層級」 下拉式清單中選取。您必須選取「受 IAP 保護的網頁應用程式使用者」角色,並擁有機構層級權限,才能查看現有存取層級。

    如果為資源套用多個存取層級,只要使用者符合您所選取的「其中一項」存取層級條件,系統就會授予他們資源存取權 (清單中的存取層級使用「或」邏輯運算子)。如果您希望使用者一次符合多項存取層級條件 (使用「且」邏輯運算子的存取層級),請建立包含多個存取層級的存取層級。

  7. 如要為主體新增更多角色,請按一下「新增其他角色」

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

gcloud

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

如要設定條件繫結,請編輯專案的 policy.yaml 檔案:

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

    gcloud projects get-iam-policy PROJECT_ID > policy.yaml
  2. 編輯 policy.yaml 檔案,指定下列內容:

    • 您要套用 IAM 條件的使用者與群組。
    • 您要授予資源存取權的 iap.httpsResourceAccessor 角色。
    • 包含存取層級的 IAM 條件。

    如果符合 ACCESS_LEVEL_NAME 存取層級要求,且資源網址路徑以 / 開頭,下列條件會授予使用者與群組存取權。

    ...
    - 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 指令將政策繫結至應用程式。 none gcloud projects set-iam-policy PROJECT_ID policy.yaml

API

如要編輯應用程式的 policy.json 檔案,請按照應用程式類型的相關程序操作。如要進一步瞭解如何使用 IAM API 管理存取政策,請參閱「管理受 IAP 保護資源的存取權」一文。

完成應用程式專屬 API 步驟前,請匯出下列變數:

 export PROJECT_NUM=PROJECT_NUMBER
 export IAP_BASE_URL=https://iap.googleapis.com/v1beta1/projects/${PROJECT_NUMBER}/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 "Authorization: Bearer $(gcloud auth print-access-token)" \
    -d '' ${GAE_BASE_URL}/:getIamPolicy

  3. 將 IAM 條件繫結新增至 IAM 政策 JSON 檔案。以下是已編輯的 policy.json 檔案範例。此檔案會將 iap.httpsResourceAccessor 角色繫結至兩個使用者,進而授予受 Chrome Enterprise 進階版保護資源的存取權。系統已新增 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 "Authorization: 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 "Authorization: Bearer $(gcloud auth print-access-token)" \
     ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:getIamPolicy \
     -d ''

  3. 將 IAM 條件繫結新增至 IAM 政策 JSON 檔案。以下是已編輯的 policy.json 檔案範例。此檔案會將 iap.httpsResourceAccessor 角色繫結至兩個使用者,進而授予受 Chrome Enterprise 進階版保護資源的存取權。系統已新增 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 "Authorization: Bearer $(gcloud auth print-access-token)" \
         ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:setIamPolicy \
         -d @${JSON_NEW_POLICY}