配置字段级访问权限

本文档介绍字段级访问权限控制以及如何在 Logging 存储桶上进行设置。通过字段级访问权限控制,您可以对 Google Cloud 项目的用户隐藏各个 LogEntry 字段,从而提供更精细的方法来控制用户可以访问的数据。

概览

Logging 使用字段级访问权限控制向没有所需权限查看这些字段的 Google Cloud 项目的用户隐藏 LogEntry 字段。与隐藏整个 LogEntry日志视图相比,字段级访问权限控制可以隐藏 LogEntry 的单个字段。您可以对 Logging 存储桶设置字段级访问权限控制和日志视图权限。您可以使用 Google Cloud CLI 限制和管理字段级访问权限控制。

如需限制对日志字段的访问,请执行以下操作:

  • 配置日志存储桶的受限 LogEntry 字段。
  • 仅为需要查看受限字段的用户提供相应字段路径的 logging.fieldAccessor IAM 角色或具有类似权限的角色。

当用户查询设置了受限字段的存储桶中的日志时,Logging 会检查 IAM 权限。对于配置了 ACL 的任何字段,如果用户没有该字段的相应 logging.FieldAccessor,则系统会拒绝其访问该字段,也就是说:

  • 如果用户尝试直接查询受限字段,则会收到权限遭拒错误。
  • 全局搜索不会考虑被拒绝字段的内容。
  • 任何返回的 LogEntry 结果都会省略受限字段。

受限字段

您可以限制对 jsonPayload 字段的访问权限,这也会限制对其嵌套路径的访问权限。

您还可以限制对以下各项的叶级字段的访问权限:

例如,您可以限制对 labels.check_id 字段的访问权限。

准备工作

在开始设置字段级访问权限控制之前,请执行以下操作:

设置字段级访问权限控制

字段级限制是在日志存储桶级别配置,并且可以应用于现有日志存储桶或者在创建新的日志存储桶时应用。

限制新存储桶中的字段

如需在创建新日志存储桶时限制日志字段,请运行 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.ssnhttpRequest.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.ssnhttpRequest.status 将不再作为受限字段。

管理对受限字段的访问权限

默认情况下,Logging 会对没有 logging.fieldAccessor 角色或没有具有类似权限的角色的用户隐藏所有受限字段。Logging 会向具有查看存储桶中的日志的权限和具有 logging.fieldAccessor 角色的用户公开受限字段。

您可以修改默认行为,以允许特定用户访问受限字段的子集。

授予所有受限字段的权限

如需向用户授予所有受限字段的权限,请为用户提供 logging.fieldAccessor 角色或包含 logging.fieldAccessor 角色的自定义角色。

控制台

如需使用 Google Cloud 控制台为用户提供 logging.fieldAccessor 角色,请完成以下步骤:

  1. 在 Google Cloud 控制台中,进入 IAM 页面:

    前往 IAM

    如果您使用搜索栏查找此页面,请选择子标题为 IAM 和管理的结果。

  2. 选择主账号,然后点击修改
  3. 修改权限窗格中,为该角色选择 Log Field Accessor
  4. 选择添加 IAM 条件
  5. 标题说明字段中输入标题和说明。
  6. 选择条件编辑器标签页并输入以下表达式:

    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:您要授予该角色的主账号的标识符。主账号标识符通常采用以下格式: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(而不是 json_payload.foo)配置 IAM 权限。

如需详细了解有效的日志字段类型,请参阅“Logging 查询语言:值和转换”

控制台

如需使用 Google Cloud 控制台为用户提供受限字段的访问权限,请完成以下步骤:

  1. 在 Google Cloud 控制台中,进入 IAM 页面:

    前往 IAM

    如果您使用搜索栏查找此页面,请选择子标题为 IAM 和管理的结果。

  2. 选择主账号,然后点击修改
  3. 修改权限窗格中,为该角色选择 Log Field Accessor
  4. 选择添加 IAM 条件
  5. 标题说明字段中输入标题和说明。
  6. 选择条件编辑器标签页并输入以下表达式:

    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:您要授予该角色的主账号的标识符。主账号标识符通常采用以下格式: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 的限制,请参阅配额和限制