配置字段级访问权限

本文档介绍字段级访问权限控制以及如何在 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 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. 修改权限窗格中,选择日志字段访问器 角色。
  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 可以采用的格式的完整列表, 请参阅主账号标识符。在members policy.json 文件,请使用以下格式: "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 限制,则必须配置 IAM 对 jsonPayload.foo 的权限,而不是 json_payload.foo 的权限。

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

控制台

如需通过 Google Cloud 控制台向用户授予对受限字段的访问权限,请执行以下操作: 请完成以下步骤:

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

    前往 IAM

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

  2. 选择主账号,然后点击修改
  3. 修改权限窗格中,选择日志字段访问器 角色。
  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 部分中列出的主账号具有 对存储在 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:条件的标题。
  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 的限制,请参阅配额和限制