設定欄位層級存取權

本文說明欄位層級存取權控管,以及如何在 Logging bucket 中設定這類控管機制。透過欄位層級的存取權控管機制,您可以向 Google Cloud 專案使用者隱藏個別 LogEntry 欄位,更精細地控管使用者可存取的記錄資料。

總覽

記錄會使用欄位層級的存取控管,向沒有查看欄位必要權限的專案使用者隱藏LogEntry欄位。 Google Cloud 相較於記錄檢視畫面會隱藏整個 LogEntry,欄位層級的存取權控管機制會隱藏 LogEntry 的個別欄位。您可以在記錄值區中設定欄位層級存取權控管機制和記錄檢視權限。您可以使用 Google Cloud CLI 限制及管理欄位層級的存取權控管。

如要限制記錄檔欄位的存取權,請執行下列操作:

  • 設定記錄檔 bucket 的受限制 LogEntry 欄位。
  • 只授予需要查看受限欄位的使用者該欄位路徑的 logging.fieldAccessor IAM 角色,或包含類似權限的角色。

當使用者查詢設有受限欄位的值區記錄時,記錄功能會檢查 IAM 權限。如果欄位已設定存取控制清單,沒有相應 logging.FieldAccessor 的使用者就無法存取該欄位,也就是說:

  • 如果使用者嘗試直接查詢受限制的欄位,就會收到權限遭拒的錯誤訊息。
  • 全域搜尋不會將遭拒欄位的內容納入考量。
  • 任何傳回的 LogEntry 結果都會省略受限欄位。

受限制的欄位

您可以限制 jsonPayload 欄位的存取權,這也會限制其巢狀路徑的存取權。

您也可以限制存取下列項目的葉節點欄位:

舉例來說,您可以限制存取 labels.check_id 欄位。

事前準備

開始設定欄位層級存取權控管前,請先完成下列步驟:

設定欄位層級存取權控管

您可以在記錄檔 bucket層級設定欄位層級限制,並套用至現有或新建立的記錄檔 bucket。

限制新 bucket 中的欄位

如要在建立新的記錄檔 bucket 時限制記錄欄位,請執行 gcloud logging buckets create 指令。執行指令前,請先進行下列替換:

  • BUCKET_ID:記錄 bucket 的名稱或 ID。
  • LOCATION:記錄 bucket 的位置。
  • DESCRIPTION:記錄檔 bucket 的說明。
  • RESTRICTED_FIELDS:以逗號分隔的受限欄位清單。

指令:

gcloud logging buckets create BUCKET_ID --location=LOCATION  \
--description=DESCRIPTION --restricted-fields=RESTRICTED_FIELDS

範例指令:

gcloud logging buckets create new-log-bucket --location=global \
--description="New bucket with restricted fields" --restricted-fields="jsonPayload.data.ssn,httpRequest.status"

限制現有 bucket 中的欄位

如要限制現有記錄檔 bucket 的記錄欄位,請執行 gcloud logging buckets update 指令:

gcloud logging buckets update BUCKET_ID --location=LOCATION  \
--restricted-fields=RESTRICTED_FIELDS

範例指令:

gcloud logging buckets update my-existing-log-bucket --location=global \
--restricted-fields="jsonPayload.data.ssn,httpRequest.status"

如要為現有限制新增欄位,更新指令必須重新列出整組受限欄位。以上一個範例為基礎,如果您想限制存取 jsonPayload.data.entryDate 欄位,以及已受限制的 jsonPayload.data.ssnhttpRequest.status 欄位,指令會如下所示:

gcloud logging buckets update my-existing-log-bucket --location=global \
--restricted-fields="jsonPayload.data.ssn,jsonPayload.data.entryDate,httpRequest.status"

如果您未重新列出已受限制的欄位,而只是列出 jsonPayload.data.entryDate,則 jsonPayload.data.ssnhttpRequest.status 都會移除為受限制的欄位。

管理受限制欄位的存取權

根據預設,記錄功能會對沒有 logging.fieldAccessor 角色或類似權限的使用者隱藏所有受限欄位。記錄檔會向同時擁有 bucket 記錄檔檢視權限和 logging.fieldAccessor 角色的使用者公開受限制的欄位。

您可以修改預設行為,將受限制的欄位子集限制為特定使用者。

授予所有受限制欄位的權限

如要授予使用者所有受限欄位的權限,請將 logging.fieldAccessor 角色指派給使用者,或是指派包含 logging.fieldAccessor 角色的自訂角色。

控制台

如要使用 Google Cloud 控制台授予使用者 logging.fieldAccessor 角色,請完成下列步驟:

  1. 前往 Google Cloud 控制台的「IAM」頁面:

    前往 IAM

    如果您是使用搜尋列尋找這個頁面,請選取子標題為「IAM & Admin」(IAM 與管理) 的結果

  2. 選取主體,然後按一下「編輯」
  3. 在「編輯權限」窗格中,為角色選取「記錄檔欄位存取者」
  4. 選取「新增 IAM 條件」
  5. 在「標題」和「說明」欄位中輸入標題和說明。
  6. 選取「條件編輯器」分頁標籤,然後輸入下列運算式:

    resource.name.extract("locations/global/buckets/{bucket}/") == "BUCKET_ID"
    
  7. 選取「儲存」

身分與存取權管理權限會立即更新。

gcloud

如要使用 gcloud CLI 授予使用者 logging.fieldAccessor 角色,請完成下列步驟:

  1. 如要將目前的 IAM 政策資訊儲存至檔案,請執行 gcloud projects get-iam-policy 指令,並將輸出內容儲存至檔案:

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    

    先前的指令會將資訊儲存在名為 policy.json 的檔案中。

  2. 使用其他繫結更新 policy.json 檔案。

    在下列範例中,「expression」欄位只列出記錄檔 bucket。因此,儲存在該記錄檔 bucket 中的記錄項目,其所有欄位都可供 members 區段中列出的主體存取。

    "bindings": [
        {
          "condition": {
            "description": "DESCRIPTION",
            "expression": "resource.name.extract(\"locations/global/buckets/{bucket}/\") == 'BUCKET_ID'",
            "title": "TITLE"
          },
          "members": [
            PRINCIPAL
          ],
          "role": "roles/logging.fieldAccessor"
        }
    ]
    

    在上述範例中,各個欄位的意義如下:

    • PRINCIPAL:要授予角色的主體 ID。主體 ID 通常採用以下格式: PRINCIPAL-TYPE:ID。 例如:user:my-user@example.com。如需 PRINCIPAL 可採用的完整格式清單,請參閱「主體 ID」。在 policy.json 檔案的 members 欄位中,使用 "PRINCIPAL-TYPE":"ID" 格式。
    • DESCRIPTION:條件說明。
    • TITLE:條件的標題。
  3. 如要套用更新的 policy.json 檔案,請執行 gcloud projects set-iam-policy 指令:

    gcloud projects set-iam-policy PROJECT_ID policy.json
    

身分與存取權管理權限會立即更新。

授予部分受限制欄位的權限

如要授予使用者部分受限欄位的權限,請在授予 logging.fieldAccessor 角色時,或在設定包含 logging.fieldAccessor 的自訂角色時,設定使用者可存取的欄位。

注意事項:

  • 受限欄位的拼字和大小寫必須與值區設定中顯示的受限欄位一致,且與 IAM 權限名稱中的受限欄位一致。舉例來說,如果將受限欄位設為 jsonPayload,您必須在 jsonPayload 欄位授予權限,而非 Jsonpayload 欄位。

  • 欄位路徑 (包括對應鍵字串) 區分大小寫,但 protobuf 欄位路徑可以不區分大小寫的蛇形命名法 (snake_case) 或區分大小寫的駝峰式命名法 (camelCase) 表示。

    舉例來說,logNameLogEntry protobuf 中的欄位;log_name 則是指同一個欄位。欄位 jsonPayload.fooBar 是指與 jsonPayload.foo_bar 不同的欄位,因為 jsonPayload 下方的欄位名稱是對應字串鍵;不過,欄位 jsonPayload.fooBar 是指 json_payload.fooBar

    即使欄位路徑是相同欄位的有效參照,設定限制和 IAM 權限時,也必須符合拼字、大寫和大小寫。舉例來說,如果您指定 jsonPayload.foo 的限制,則必須為 jsonPayload.foo 設定 IAM 權限,而非 json_payload.foo

如要進一步瞭解有效的記錄檔欄位類型,請參閱記錄查詢語言:值和轉換

控制台

如要使用 Google Cloud 控制台授予使用者受限制欄位的存取權,請完成下列步驟:

  1. 前往 Google Cloud 控制台的「IAM」頁面:

    前往 IAM

    如果您是使用搜尋列尋找這個頁面,請選取子標題為「IAM & Admin」(IAM 與管理) 的結果

  2. 選取主體,然後按一下「編輯」
  3. 在「編輯權限」窗格中,為角色選取「記錄檔欄位存取者」
  4. 選取「新增 IAM 條件」
  5. 在「標題」和「說明」欄位中輸入標題和說明。
  6. 選取「條件編輯器」分頁標籤,然後輸入下列運算式:

    resource.name.extract("locations/global/buckets/BUCKET_ID/fields/{field}") == "RESTRICTED_FIELDS"
    
  7. 選取「儲存」

身分與存取權管理權限會立即更新。

gcloud

如要使用 gcloud CLI 授予使用者受限欄位的存取權,請完成下列步驟:

  1. 如要將 IAM 資訊儲存至檔案,請執行 gcloud projects get-iam-policy 指令,並將輸出內容儲存至檔案:

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    

    先前的指令會將資訊儲存在名為 policy.json 的檔案中。

  2. 使用其他繫結更新 policy.json 檔案。

    以下 expression 欄位列出特定欄位。因此,只有「members」部分列出的主體,才能存取儲存在指定記錄檔 bucket 中的記錄項目欄位。

    "bindings": [
        {
          "condition": {
            "description": "DESCRIPTION",
            "expression": "resource.name.extract(\"locations/global/buckets/BUCKET_ID/fields/{field}\") == 'RESTRICTED_FIELDS'",
            "title": "TITLE"
          },
          "members": [
            PRINCIPAL
          ],
          "role": "roles/logging.fieldAccessor"
        }
    ]
    

    在上述範例中,各個欄位的意義如下:

    • PRINCIPAL:要授予角色的主體 ID。主體 ID 通常採用以下格式: PRINCIPAL-TYPE:ID。 例如:user:my-user@example.com。如需 PRINCIPAL 可採用的完整格式清單,請參閱「主體 ID」。在 policy.json 檔案的 members 欄位中,使用 "PRINCIPAL-TYPE":"ID" 格式。
    • DESCRIPTION:條件說明。
    • TITLE:條件的標題。
  3. 如要套用更新的 policy.json 檔案,請執行 gcloud projects set-iam-policy 指令:

    gcloud projects set-iam-policy PROJECT_ID policy.json
    

身分與存取權管理權限會立即更新。

範例

假設記錄檔 bucket 限制了 jsonPayload 欄位、特定標籤和特定 httpRequest 子欄位。使用者檢查記錄項目時,會發生下列情況

  • 如果使用者有權存取所有受限制的欄位,記錄項目中的所有欄位都會顯示。

  • 如果使用者只能存取受限制的 jsonPayload LogEntry 欄位,則會看到所有不受限制的欄位,以及 jsonPayload 欄位。

  • 如果使用者沒有權限查看任何受限制的欄位,就只會看到不受限制的欄位。

如果使用者撰寫的查詢含有全域限制,則回應中會省略含有受限欄位的記錄項目。

列出受限制的欄位

如要列出記錄檔 bucket 中的受限制欄位,請執行下列 gcloud logging buckets describe

gcloud logging buckets describe BUCKET_ID --location=LOCATION

範例指令:

gcloud logging buckets describe my-log-bucket --location=global

配額與限制

設定及使用欄位層級存取控管時,請注意下列事項:

  • 受限欄位數量:每個記錄檔 bucket 最多可限制 20 個欄位。
  • 受限欄位的大小:受限欄位路徑長度不得超過 800 個位元組。

如要進一步瞭解 Cloud Logging 的使用限制,請參閱「配額與限制」。