本文档介绍字段级访问权限控制以及如何在 Logging 存储桶上进行设置。通过字段级访问权限控制,您可以对 Google Cloud 项目的用户隐藏各个 LogEntry
字段,从而提供更精细的方法来控制用户可以访问的数据。
概览
Logging 使用字段级访问权限控制来隐藏
LogEntry
字段,
查看字段的权限。与隐藏整个 LogEntry
的日志视图相比,字段级访问权限控制可以隐藏 LogEntry
的单个字段。您可以对 Logging 存储桶设置字段级访问权限控制和日志视图权限。您可以使用 Google Cloud CLI 限制和管理字段级访问权限控制。
如需限制对日志字段的访问,请执行以下操作:
- 配置日志存储桶的受限
LogEntry
字段。 - 仅为需要查看受限字段的用户提供相应字段路径的
logging.fieldAccessor
IAM 角色或具有类似权限的角色。
当用户查询设置了受限字段的存储桶中的日志时,Logging 会检查 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 项目。 在运行该命令之前,请先进行以下替换:- PROJECT_ID:项目的标识符。
命令:
gcloud config set project PROJECT_ID
验证您拥有以下某个 IAM 该存储桶所属的 Google Cloud 项目的角色:
如需了解如何设置 IAM 角色,请参阅 Logging 访问权限控制指南。
设置字段级访问权限控制
字段级限制在 日志存储桶级别,可应用于现有的 日志存储桶时,或者创建新的日志存储桶时。
限制新存储桶中的字段
如需在创建新日志存储桶时限制日志字段,请运行 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.ssn
和 httpRequest.status
,如果还想要限制对 jsonPayload.data.entryDate
字段的访问,您的命令应如下所示:
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 会对没有 logging.fieldAccessor
角色或没有具有类似权限的角色的用户隐藏所有受限字段。Logging 会向具有查看存储桶中的日志的权限和具有 logging.fieldAccessor
角色的用户公开受限字段。
您可以修改默认行为,以允许特定用户访问受限字段的子集。
授予所有受限字段的权限
如需向用户授予所有受限字段的权限,请为用户提供 logging.fieldAccessor
角色或包含 logging.fieldAccessor
角色的自定义角色。
控制台
如需使用 Google Cloud 控制台为用户授予 logging.fieldAccessor
角色,请执行以下操作:
请完成以下步骤:
-
在 Google Cloud 控制台中,进入 IAM 页面:
如果您使用搜索栏查找此页面,请选择子标题为 IAM 和管理的结果。
- 选择主账号,然后点击修改。
- 在修改权限窗格中,选择日志字段访问器 角色。
- 选择添加 IAM 条件。
- 在标题和说明字段中输入标题和说明。
选择条件编辑器标签页并输入以下表达式:
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:您要验证的主账号的标识符
授予此角色的权限。主账号标识符通常采用以下格式:
PRINCIPAL-TYPE:ID
。 例如user:my-user@example.com
。 如需查看PRINCIPAL
可以采用的格式的完整列表, 请参阅主账号标识符。在members
policy.json
文件,请使用以下格式:"PRINCIPAL-TYPE":"ID"
。 - DESCRIPTION:条件的说明。
- TITLE:条件的标题。
- PRINCIPAL:您要验证的主账号的标识符
授予此角色的权限。主账号标识符通常采用以下格式:
如需应用更新后的
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
限制,则必须配置 IAM 对jsonPayload.foo
的权限,而不是json_payload.foo
的权限。
如需详细了解有效的日志字段类型,请参阅“Logging 查询语言:值和转换”。
控制台
如需通过 Google Cloud 控制台向用户授予对受限字段的访问权限,请执行以下操作: 请完成以下步骤:
-
在 Google Cloud 控制台中,进入 IAM 页面:
如果您使用搜索栏查找此页面,请选择子标题为 IAM 和管理的结果。
- 选择主账号,然后点击修改。
- 在修改权限窗格中,选择日志字段访问器 角色。
- 选择添加 IAM 条件。
- 在标题和说明字段中输入标题和说明。
选择条件编辑器标签页并输入以下表达式:
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
部分中列出的主账号具有 对存储在 Google Cloud 中的 指定的日志存储桶。"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:您要验证的主账号的标识符
授予此角色的权限。主账号标识符通常采用以下格式:
PRINCIPAL-TYPE:ID
。 例如user:my-user@example.com
。 如需查看PRINCIPAL
可以采用的格式的完整列表, 请参阅主账号标识符。在members
policy.json
文件,请使用以下格式:"PRINCIPAL-TYPE":"ID"
。 - DESCRIPTION:条件的说明。
- TITLE:条件的标题。
- PRINCIPAL:您要验证的主账号的标识符
授予此角色的权限。主账号标识符通常采用以下格式:
如需应用更新后的
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 的限制,请参阅配额和限制。