本文件將說明欄位層級存取權控管,以及如何在記錄 值區中設定這些控管機制。欄位層級的存取權控管機制可讓您隱藏個別 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.ssn
和 httpRequest.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.ssn
和 httpRequest.status
都會移除為受限制欄位。
管理受限制欄位的存取權
根據預設,如果使用者沒有 logging.fieldAccessor
角色或類似權限的角色,系統就會隱藏所有受限制的欄位。記錄功能會向同時擁有查看 bucket 記錄檔權限和 logging.fieldAccessor
角色的使用者,公開受限制的欄位。
您可以修改預設行為,將受限制欄位的子集限制在特定使用者。
授予所有受限制欄位的權限
如要將所有受限制欄位的權限授予使用者,請將 logging.fieldAccessor
角色或包含 logging.fieldAccessor
角色的自訂角色授予使用者。
主控台
如要使用 Google Cloud 控制台為使用者指派 logging.fieldAccessor
角色,請完成下列步驟:
-
前往 Google Cloud 控制台的「IAM」頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「IAM 與管理」的結果。
- 選取主體,然後按一下「編輯」。
- 在「Edit permissions」窗格中,為角色選取「Log Field Accessor」。
- 選取「新增 IAM 條件」。
- 在「標題」和「說明」欄位中輸入標題和說明。
選取「Condition editor」分頁標籤,然後輸入下列運算式:
resource.name.extract("locations/global/buckets/{bucket}/") == "BUCKET_ID"
選取「儲存」。
Identity and Access Management 權限會立即更新。
gcloud
如要使用 gcloud CLI 為使用者授予 logging.fieldAccessor
角色,請完成下列步驟:
如要將目前的 IAM 政策資訊儲存至檔案中,請執行
gcloud projects get-iam-policy
指令,並將輸出內容儲存至檔案:gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
先前的指令會將資訊儲存在名為
policy.json
的檔案中。更新
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:條件的標題。
- PRINCIPAL:您要授予角色的主體 ID。主體 ID 通常採用以下格式:
如要套用更新的
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)。
舉例來說,
logName
是LogEntry
protobuf 中的欄位;log_name
則是指同一個欄位。jsonPayload.fooBar
欄位參照的欄位與jsonPayload.foo_bar
不同,因為jsonPayload
下方的欄位名稱是對應字串鍵;不過,它確實參照json_payload.fooBar
。即使欄位路徑是相同欄位的有效參照,您在設定限制和 IAM 權限時,也必須符合拼寫、大小寫和大小寫規則。舉例來說,如果您對
jsonPayload.foo
指定限制,就必須為jsonPayload.foo
設定 IAM 權限,而非json_payload.foo
。
如要進一步瞭解有效的記錄欄位類型,請參閱「記錄查詢語言:值和轉換」。
主控台
如要使用 Google Cloud 控制台授予使用者存取受限欄位的權限,請完成下列步驟:
-
前往 Google Cloud 控制台的「IAM」頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「IAM 與管理」的結果。
- 選取主體,然後按一下「編輯」。
- 在「Edit permissions」窗格中,為角色選取「Log Field Accessor」。
- 選取「新增 IAM 條件」。
- 在「標題」和「說明」欄位中輸入標題和說明。
選取「Condition editor」分頁標籤,然後輸入下列運算式:
resource.name.extract("locations/global/buckets/BUCKET_ID/fields/{field}") == "RESTRICTED_FIELDS"
選取「儲存」。
Identity and Access Management 權限會立即更新。
gcloud
如要使用 gcloud CLI 授予使用者存取受限欄位的權限,請完成下列步驟:
如要將 IAM 資訊儲存在檔案中,請執行
gcloud projects get-iam-policy
指令,並將輸出內容儲存在檔案中:gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
先前的指令會將資訊儲存在名為
policy.json
的檔案中。更新
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:條件的標題。
- PRINCIPAL:您要授予角色的主體 ID。主體 ID 通常採用以下格式:
如要套用更新的
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 用量的限制,請參閱「配額與限制」。