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

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

總覽

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

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

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

詳情請參閱 Access Context Manager 總覽。

事前準備

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

  • 使用 IAP 保護資源。
  • 設定端點驗證。請注意,您只有在想根據使用者裝置資訊 (例如儲存空間加密狀態) 限制資源存取權時,才需要這麼做。
  • 請確認您已授予專案下列任一角色。

    • 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」(建立新的存取層級) 窗格中,按一下「條件」部分的「新增屬性」,然後再按一下「裝置政策」

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

  6. 再次按一下「Add attribute」(新增屬性),然後選取「IP Subnetworks」(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. 編寫要求主體,建立包含一或多個 IPv4 或 IPv6 範圍 (CIDR 區塊格式) 和要求加密儲存空間的裝置政策的 AccessLevel 資源。

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

    {
     "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 政策,系統會根據要求屬性進一步限制對資源的存取權。這些要求屬性包括:

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

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

下列步驟說明如何更新 IAM 政策,為受 IAP 保護的資源新增存取層級。

主控台

  1. 前往 IAP 管理員頁面

    前往 IAP 管理員頁面

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

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

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

  5. 在「請選擇角色」下拉式清單中,選取「IAP-Secured Web App User」角色。

  6. 如要指定現有存取層級,請從「Access levels」(存取層級) 下拉式清單中選取。您必須選取「IAP-Secured Web App User」角色,並擁有機構層級權限,才能查看現有存取層級。

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

  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 指令將政策繫結至應用程式。 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}