本文說明欄位層級存取權控管,以及如何在 Logging bucket 中設定這類控管機制。透過欄位層級的存取權控管機制,您可以向 Google Cloud 專案使用者隱藏個別 LogEntry 欄位,更精細地控管使用者可存取的記錄資料。
總覽
記錄會使用欄位層級的存取控管,向沒有查看欄位必要權限的專案使用者隱藏LogEntry欄位。 Google Cloud 相較於記錄檢視畫面會隱藏整個 LogEntry,欄位層級的存取權控管機制會隱藏 LogEntry 的個別欄位。您可以在記錄值區中設定欄位層級存取權控管機制和記錄檢視權限。您可以使用 Google Cloud CLI 限制及管理欄位層級的存取權控管。
如要限制記錄檔欄位的存取權,請執行下列操作:
- 設定記錄檔 bucket 的受限制
LogEntry欄位。 - 只授予需要查看受限欄位的使用者該欄位路徑的
logging.fieldAccessorIAM 角色,或包含類似權限的角色。
當使用者查詢設有受限欄位的值區記錄時,記錄功能會檢查 IAM 權限。如果欄位已設定存取控制清單,沒有相應 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確認您在包含 bucket 的 Google Cloud 專案中,具備下列其中一個 IAM 角色:
如要瞭解如何設定 IAM 角色,請參閱 Logging 存取權控管指南。
設定欄位層級存取權控管
您可以在記錄檔 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.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 & Admin」(IAM 與管理) 的結果。
- 選取主體,然後按一下「編輯」。
- 在「編輯權限」窗格中,為角色選取「記錄檔欄位存取者」。
- 選取「新增 IAM 條件」。
- 在「標題」和「說明」欄位中輸入標題和說明。
選取「條件編輯器」分頁標籤,然後輸入下列運算式:
resource.name.extract("locations/global/buckets/{bucket}/") == "BUCKET_ID"選取「儲存」。
身分與存取權管理權限會立即更新。
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」欄位只列出記錄檔 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:條件的標題。
- PRINCIPAL:要授予角色的主體 ID。主體 ID 通常採用以下格式:
如要套用更新的
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) 表示。
舉例來說,
logName是LogEntryprotobuf 中的欄位;log_name則是指同一個欄位。欄位jsonPayload.fooBar是指與jsonPayload.foo_bar不同的欄位,因為jsonPayload下方的欄位名稱是對應字串鍵;不過,欄位jsonPayload.fooBar是指json_payload.fooBar。即使欄位路徑是相同欄位的有效參照,設定限制和 IAM 權限時,也必須符合拼字、大寫和大小寫。舉例來說,如果您指定
jsonPayload.foo的限制,則必須為jsonPayload.foo設定 IAM 權限,而非json_payload.foo。
如要進一步瞭解有效的記錄檔欄位類型,請參閱記錄查詢語言:值和轉換。
控制台
如要使用 Google Cloud 控制台授予使用者受限制欄位的存取權,請完成下列步驟:
-
前往 Google Cloud 控制台的「IAM」頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「IAM & Admin」(IAM 與管理) 的結果。
- 選取主體,然後按一下「編輯」。
- 在「編輯權限」窗格中,為角色選取「記錄檔欄位存取者」。
- 選取「新增 IAM 條件」。
- 在「標題」和「說明」欄位中輸入標題和說明。
選取「條件編輯器」分頁標籤,然後輸入下列運算式:
resource.name.extract("locations/global/buckets/BUCKET_ID/fields/{field}") == "RESTRICTED_FIELDS"選取「儲存」。
身分與存取權管理權限會立即更新。
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」部分列出的主體,才能存取儲存在指定記錄檔 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:條件的標題。
- PRINCIPAL:要授予角色的主體 ID。主體 ID 通常採用以下格式:
如要套用更新的
policy.json檔案,請執行gcloud projects set-iam-policy指令:gcloud projects set-iam-policy PROJECT_ID policy.json
身分與存取權管理權限會立即更新。
範例
假設記錄檔 bucket 限制了 jsonPayload 欄位、特定標籤和特定 httpRequest 子欄位。使用者檢查記錄項目時,會發生下列情況
如果使用者有權存取所有受限制的欄位,記錄項目中的所有欄位都會顯示。
如果使用者只能存取受限制的
jsonPayloadLogEntry欄位,則會看到所有不受限制的欄位,以及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 的使用限制,請參閱「配額與限制」。