設定欄位層級存取權

本文件將說明欄位層級存取權控管,以及如何在記錄 值區中設定這些控管機制。欄位層級的存取權控管機制可讓您隱藏個別 LogEntry 欄位,避免 Google Cloud 專案使用者存取,讓您更精細地控管使用者可存取的記錄資料。

總覽

Logging 會使用欄位層級存取權控制項,針對沒有查看欄位所需權限的 Google Cloud 專案使用者,隱藏 LogEntry 欄位。與記錄檢視畫面 (會隱藏整個 LogEntry) 相比,欄位層級存取權控管機制會隱藏 LogEntry 的個別欄位。您可以在記錄值區上設定欄位層級存取權控管機制和記錄檢視權限。您可以使用 Google Cloud CLI 限制及管理欄位層級存取權控管。

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

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

當使用者從設有限制欄位的值區查詢記錄時,記錄會檢查 IAM 權限。對於任何已設定 ACL 的欄位,如果使用者沒有該欄位的對應 logging.FieldAccessor,系統就會拒絕該使用者存取該欄位,也就是說:

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

受限制的欄位

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

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

例如,您可以限制對 labels.check_id 欄位的存取權。

事前準備

開始設定欄位層級存取權控管機制前,請先執行下列操作:

  • 確認 gcloud --version 回報的版本為 362.0.0 以上版本。

    如要安裝最新版的 gcloud CLI,請執行 gcloud components update 指令:

    gcloud components update
    

    如需安裝 gcloud CLI 的操作說明,請參閱「安裝 Google Cloud CLI」。

  • 執行 gcloud config set,為 Google Cloud CLI 指令設定預設Google Cloud 專案。執行指令前,請先進行下列替換:

    • PROJECT_ID:專案的 ID。

    指令:

    gcloud config set project PROJECT_ID
    
  • 請確認您具備下列其中一個 IAM 角色,才能存取包含值區的 Google Cloud 專案:

    如要瞭解如何設定身分與存取權管理角色,請參閱 Logging 的存取權控管指南

設定欄位層級存取權控管

欄位層級限制是在記錄檔值區層級設定,可套用至現有的記錄檔值區,或在建立新的記錄檔值區時套用。

限制新 bucket 的欄位

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

  • BUCKET_ID:記錄值區的名稱或 ID。
  • LOCATION:記錄值區的位置。
  • DESCRIPTION:記錄值區的說明。
  • 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"

限制現有值區的欄位

如要限制現有記錄集區的記錄欄位,請執行 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 與管理」的結果

  2. 選取主體,然後按一下「編輯」
  3. 在「Edit permissions」窗格中,為角色選取「Log Field Accessor」
  4. 選取「新增 IAM 條件」
  5. 在「標題」和「說明」欄位中輸入標題和說明。
  6. 選取「Condition editor」分頁標籤,然後輸入下列運算式:

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

Identity and Access Management 權限會立即更新。

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 欄位只會列出記錄值區。因此,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 可用的完整格式清單,請參閱「主要識別碼」。在 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
    

Identity and Access Management 權限會立即更新。

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

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

注意事項:

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

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

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

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

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

主控台

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

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

    前往「身分與存取權管理」頁面

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

  2. 選取主體,然後按一下「編輯」
  3. 在「Edit permissions」窗格中,為角色選取「Log Field Accessor」
  4. 選取「新增 IAM 條件」
  5. 在「標題」和「說明」欄位中輸入標題和說明。
  6. 選取「Condition editor」分頁標籤,然後輸入下列運算式:

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

Identity and Access Management 權限會立即更新。

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 區段中列出的主體,才能存取儲存在指定記錄檔值區中的記錄項目欄位。

    "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 可用的完整格式清單,請參閱「主要識別碼」。在 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
    

Identity and Access Management 權限會立即更新。

範例

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

  • 如果使用者有權存取所有受限制欄位,則可查看記錄項目中的所有欄位。

  • 如果使用者只具備存取受限制的 jsonPayload LogEntry 欄位權限,則所有未受限制的欄位都會顯示,且 jsonPayload 欄位也會顯示。

  • 如果使用者沒有查看任何受限制欄位的權限,則只會顯示未受限制的欄位。

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

列出受限制的欄位

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

gcloud logging buckets describe BUCKET_ID --location=LOCATION

指令範例:

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

配額與限制

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

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

如要進一步瞭解可能適用於 Cloud Logging 用量的限制,請參閱「配額與限制」。