配置字段级访问权限

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

概览

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

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

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

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

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

受限字段

您可以限制对以下 LogEntry 字段的任意组合的访问权限:

LogEntry 字段 父级 LogEntry 字段的嵌套字段
jsonPayload 用户定义
textPayload
protoPayload 特定于服务
httpRequest httpRequest 嵌套字段
labels 用户定义
sourceLocation sourceLocation 嵌套字段

限制对包含嵌套字段(例如 jsonPayload 或特定 jsonPayload 子路径)的访问权限也会限制对其任何嵌套路径的访问权限。

准备工作

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

设置字段级访问权限控制

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

限制新存储桶中的字段

如需在创建新的日志存储桶时限制日志字段,请运行以下 gcloud CLI 命令

gcloud logging buckets create BUCKET_NAME --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 CLI 命令

gcloud logging buckets update BUCKET_NAME --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. 修改权限窗格中,选择 Log Field Accessor
  2. 选择添加条件

    添加 Log Field Accessor 权限。

  3. 标题说明字段中输入标题和说明。

  4. 选择条件编辑器标签页并输入以下表达式:

    resource.name.extract("locations/global/buckets/{bucket}/") == "BUCKET_NAME"
    

    向权限添加条件。

  5. 选择保存

Identity and Access Management 权限会立即更新。

gcloud

如需使用 gcloud CLI 向用户授予 logging.fieldAccessor 角色,请完成以下步骤:

  1. 修改 policy.json 文件:

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    
  2. 使用其他绑定更新 policy.json 文件:

    "bindings": [
        {
          "condition": {
            "description": "DESCRIPTION",
            "expression": "resource.name.extract(\"locations/global/buckets/{bucket}/\") == 'BUCKET_NAME'",
            "title": "TITLE"
          },
          "members": [
            "user":"USER_ID@DOMAIN.com"
          ],
          "role": "roles/logging.fieldAccessor"
        }
    ]
    

    绑定示例:

    "bindings": [
      {
        "condition": {
          "description": "Grants access to all restricted fields in a log bucket",
          "expression": "resource.name.extract(\"locations/global/buckets/{bucket}/\") == 'log-bucket-with-sensitive-data'",
          "title": "Log bucket condition for restricted fields"
        },
        "members": [
          "user":"222larabrown@gmail.com"
        ],
        "role": "roles/logging.fieldAccessor"
      }
    ]
    

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. 修改权限窗格中,选择 Log Field Accessor
  2. 选择添加条件

    添加 Log Field Accessor 权限。

  3. 标题说明字段中输入标题和说明。

  4. 选择条件编辑器标签页并输入以下表达式:

    resource.name.extract("locations/global/buckets/BUCKET_ID /fields/{field}") == "RESTRICTED_FIELD"
    

    添加受限字段的子集。

  5. 选择保存

Identity and Access Management 权限会立即更新。

gcloud

如需使用 gcloud CLI 向用户授予对受限字段的访问权限,请完成以下步骤:

  1. 修改 policy.json 文件:

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    
  2. 使用其他绑定更新 policy.json 文件:

    "bindings": [
        {
          "condition": {
            "description": "DESCRIPTION",
            "expression": "resource.name.extract(\"locations/global/buckets/BUCKET_NAME/fields/{field}\") == 'RESTRICTED_FIELD'",
            "title": "TITLE"
          },
          "members": [
            "user":"USER_ID@DOMAIN.com"
          ],
          "role": "roles/logging.fieldAccessor"
        }
    ]
    

    绑定示例:

    "bindings": [
      {
        "condition": {
          "description": "Give access to one restricted field that contains sensitive information",
          "expression": "resource.name.extract(\"locations/global/buckets/my-log-bucket/fields/{field}\") == 'jsonPyaload.data.ssn'",
          "title": "Access to restricted field"
        },
        "members": [
          "user":"222larabrown@gmail.com"
        ],
        "role": "roles/logging.fieldAccessor"
      }
    ]
    

Identity and Access Management 权限会立即更新。

输出示例

以下示例展示了 LogEntry 对于被限制访问 LogEntry 字段子集的用户是如何显示的。

假设某个存储桶限制了以下字段:

  • jsonPayload
  • httpRequest
  • labels

对于有权访问所有受限字段的用户,LogEntry 如下所示:

显示所有日志字段。

对于仅有权访问 jsonPayload LogEntry 受限字段的用户,LogEntry 如下所示:

仅显示 jsonPayload 字段。

对于无权查看任何受限字段的用户,LogEntry 如下所示:

所有字段均受限。

如果用户输入的全局限制会返回包含受限字段的 LogEntry,则 Logging 会隐藏整个 LogEntry(而不仅仅是该字段)。

列出受限字段

如需列出日志存储桶上的受限字段,请运行以下 gcloud CLI 命令

gcloud logging buckets describe  BUCKET_ID  --location=LOCATION

示例命令:

gcloud logging buckets describe my-log-bucket --location=global

配额和限制

设置和使用字段级访问权限控制时,请注意以下事项:

  • 受限字段的数量:您最多可以为每个日志存储桶限制 20 个字段。
  • 受限字段的大小:受限字段路径的长度必须小于 800 位。

如需详细了解可能适用于 Cloud Logging 的限制,请参阅配额和限制