使用用户代管式服务账号配置日志回流

本页介绍了如何通过创建使用用户代管式服务账号进行配置的接收器来路由日志。默认情况下,日志记录功能会为资源中的所有接收器使用一个日志记录服务账号。不过,如果您的日志回流位于不同的项目中,您可以创建和管理自己的用户代管式服务账号,以便从包含用户管理的服务账号的项目集中管理 Identity and Access Management 权限。

只有当接收器目的地是日志存储桶或 Google Cloud 项目时,您才能创建使用用户代管式服务账号的接收器。本文档中的示例展示了如何设置使用用户代管式服务账号的接收器,其中目的地是日志存储桶。

准备工作

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 确保您拥有一个用户代管式服务账号,然后将以下变量设置为用户代管式服务账号的适当值:

    • CUSTOM_SA_PROJECT_ID:包含用户代管式服务账号的项目的项目 ID。

    • CUSTOM_SA:用户代管式服务账号的电子邮件地址。

    如需了解如何创建服务账号,请参阅创建服务账号

  3. 确保您有一个可用作日志接收器目标位置的日志存储桶,然后将以下变量设置为适合您的日志存储桶的值。如有必要,请创建日志存储桶

    • LOG_BUCKET_PROJECT_ID:包含日志存储桶的项目的项目 ID。

    • LOCATION:日志存储桶的位置。

    • BUCKET_NAME:日志存储桶的名称。

  4. 确定您计划在其中创建日志分流的项目中存在的 Logging 服务账号的名称,然后将以下变量设置为适当的值:

    • SINK_PROJECT_ID:您计划创建日志接收器的项目的项目 ID。

    • LOGGING_SA:默认日志记录服务账号的电子邮件地址。如需获取此地址,请运行以下命令:

      gcloud logging settings describe --project=SINK_PROJECT_ID
      

      在响应中,以 loggingServiceAccountId 开头的行会列出您的服务账号的电子邮件地址。

  5. 在包含用户代管式服务账号的项目中,确保未强制执行组织政策布尔值限制条件 iam.disableCrossProjectServiceAccountUsage。默认情况下,系统会强制执行此限制条件。如需停用此限制条件,以便将服务账号附加到另一个项目中的资源,请运行以下命令:

    gcloud resource-manager org-policies disable-enforce \
    iam.disableCrossProjectServiceAccountUsage \
    --project=CUSTOM_SA_PROJECT_ID
    

    如需详细了解如何跨项目启用服务账号,请参阅允许跨项目关联服务账号

授予 IAM 角色

本部分介绍了创建使用用户代管式服务账号的接收器的前提条件。

允许用户代管式服务账号将日志条目写入接收器目标位置

向用户代管式服务账号授予将日志条目写入您将在后续步骤中创建的接收器目标所需的权限。接收器的目标位置将是存储在名为 LOG_BUCKET_PROJECT_ID 的项目中的日志存储桶。

如需向用户代管式服务账号授予所需权限,请在包含日志存储桶的项目中向其授予 Logs Bucket Writer 角色 (roles/logging.bucketWriter):

gcloud projects add-iam-policy-binding LOG_BUCKET_PROJECT_ID \
--member='serviceAccount:CUSTOM_SA' \
--role='roles/logging.bucketWriter'

如需详细了解上述命令,请参阅 gcloud projects add-iam-policy-binding

配置服务账号模拟

配置默认的 Cloud Logging 服务账号 LOGGING_SA,以便其可以模拟用户代管式服务账号 CUSTOM_SA。默认的 Cloud Logging 服务账号存在于您要创建使用用户代管式服务账号的日志接收器的 Google Cloud 项目中。

如需配置服务账号模拟,请向用户代管式服务账号中的 Cloud Logging 服务账号授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator):

gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
--project=CUSTOM_SA_PROJECT_ID \
--member='serviceAccount:LOGGING_SA' \
--role='roles/iam.serviceAccountTokenCreator'

服务账号模拟涉及两个主账号:缺少访问资源权限的服务账号,以及具有访问资源权限的具有特权的服务账号。在本例中,用户代管式服务账号是具有特权的账号,因为它能够将日志条目写入接收器目标位置(即名为 LOG_BUCKET_PROJECT_ID 的项目中的日志存储桶)。Logging 服务账号具有路由日志的权限。

如需详细了解“服务账号令牌创建者”角色,请参阅用于管理和冒充服务账号的角色:服务账号令牌创建者角色

如需详细了解服务账号模拟,请参阅服务账号模拟简介

允许主账号以用户代管式服务账号身份运行操作

向将创建接收器的主账号授予以用户代管式服务账号身份运行操作所需的权限。

如需授予所需权限,请在存储用户代管式服务账号 CUSTOM_SA_PROJECT_ID 的 Google Cloud 项目中向主账号授予 Service Account User 角色 (roles/iam.serviceAccountUser)。

在运行以下命令之前,请先进行以下替换:

  • PRINCIPAL:您要授予该角色的主账号的标识符。主账号标识符通常采用以下格式:PRINCIPAL-TYPE:ID。例如 user:my-user@example.com。 如需查看 PRINCIPAL 可采用的格式的完整列表,请参阅主账号标识符

执行 gcloud iam service-accounts add-iam-policy-binding 命令:

gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
--project=CUSTOM_SA_PROJECT_ID \
--member='PRINCIPAL' \
--role='roles/iam.serviceAccountUser'

如果您使用的是自定义角色,则主账号需要拥有 iam.serviceAccounts.actAs 权限。

如需详细了解“服务账号用户”角色,请参阅用于管理和冒充服务账号的角色:服务账号用户角色

创建使用用户代管式服务账号的日志回流

如需使用用户代管式服务账号创建接收器,请运行 gcloud logging sinks create 命令并添加 --custom-writer-identity 选项。

在运行以下命令之前,请先进行以下替换:

  • SINK_NAME:日志接收器的名称。

执行 gcloud logging sinks create 命令:

gcloud logging sinks create SINK_NAME \
logging.googleapis.com/projects/LOG_BUCKET_PROJECT_ID/locations/LOCATION/buckets/BUCKET_NAME \
--custom-writer-identity=serviceAccount:CUSTOM_SA \
--project=SINK_PROJECT_ID

验证接收器是否正在路由日志

在本部分中,您将使用 gcloud CLI 写入和读取日志条目,以验证您的接收器是否正确路由日志。

如需验证接收器是否正确路由日志,请执行以下操作:

  1. 运行 gcloud logging write 命令:

    在运行以下命令之前,请先进行以下替换:

    • LOG_NAME:日志的名称。例如,您可以将此字段设置为 mylog

    执行 gcloud logging write 命令:

    gcloud logging write LOG_NAME "Test log entry" --project=SINK_PROJECT_ID
    

    上述命令会返回以下消息:Created log entry.

  2. 如需读取您刚刚写入的日志条目,请运行以下命令:

    gcloud logging read 'textPayload="Test log entry"' \
    --bucket=BUCKET_NAME --location=LOCATION \
    --view=_AllLogs --project=SINK_PROJECT_ID
    

后续步骤