授权 Ops Agent

本指南介绍如何确保您在虚拟机 (VM) 实例上安装的 Ops Agent 获得将遥测数据发送到 Logging 的授权。

授权概览

授权过程用于确定经过身份验证的客户端对一组资源具有哪些权限。Google Cloud 使用应用默认凭据 (ADC) 向 Compute Engine 虚拟机实例上的 Ops Agent 授权。

Ops Agent 支持使用 ADC 对虚拟机的关联服务账号或服务账号密钥进行身份验证。

  • 关联的服务账号是指特定于给定资源(例如虚拟机)的服务账号。该服务账号具有自己的唯一凭据。ADC 使用虚拟机的元数据服务器来获取服务的凭据。
  • 服务账号密钥是指用于向项目中的服务账号的密钥对进行授权的私钥,可让您创建访问令牌。您可以使用该令牌提供身份,以便代表服务账号与 Google Cloud API 进行交互。
  • Ops Agent 不支持使用 gcloud auth 进行授权。为防止意外行为,您必须撤销使用 gcloud auth 创建的所有凭据。

我们建议您尽可能将 ADC 配置为对关联的服务账号进行身份验证,因为私钥需要本地存储,该存储可能会被破解。如需详细了解服务账号密钥,请参阅管理服务账号密钥的最佳实践

验证您的访问权限范围

在您创建 Compute Engine 虚拟机实例时,系统会为这些实例分配访问权限范围。新的 Compute Engine 虚拟机具有足够的 Ops Agent 访问权限范围,但旧虚拟机或范围经过修改的虚拟机可能没有足够的访问权限范围。如需详细了解访问权限范围和服务账号,请参阅 Compute Engine 文档中的授权

如需验证访问权限范围,请执行以下操作:

  1. 通过在 Compute Engine 实例上运行以下命令来查询访问权限范围:
    curl --silent --connect-timeout 1 -f -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/scopes
  2. 在命令输出中,如果列出了访问权限范围 https://www.googleapis.com/auth/cloud-platform,则表明您拥有足够的授权。

    如果未列出 https://www.googleapis.com/auth/cloud-platform,则您将需要两个访问权限范围,即以下每个“Logging”和“Monitoring”对中的一个范围:

    • https://www.googleapis.com/auth/logging.write
      https://www.googleapis.com/auth/logging.admin
    • https://www.googleapis.com/auth/monitoring.write
      https://www.googleapis.com/auth/monitoring.admin

如需修改访问权限范围,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面:

    前往虚拟机实例

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

  2. 如有必要,点击 Google Cloud 项目的下拉列表,然后选择您项目的名称。
  3. 从导航菜单中选择虚拟机实例,选择实例标签页,然后选择虚拟机的名称。
  4. 点击 停止以关停该虚拟机。
  5. 虚拟机停止后,点击 修改
  6. 在页面的身份和 API 访问权限部分,找到访问权限范围,然后选择针对每个 API 设置访问权限
  7. 对于 Stackdriver Logging APIStackdriver Monitoring API 条目,请选择只写
  8. 点击保存,然后点击  启动/恢复以重启虚拟机。

使用服务账号

身份验证是指确定客户端身份的过程。 如果您要进行身份验证,建议使用服务账号,这种特殊的账号通常由应用或工作负载(而非真人)使用。如需了解详情,请参阅服务账号概览

无论代码在何处(Compute Engine、App Engine 或本地)运行,您都可以使用服务账号进行身份验证。有关详情,请参阅 Google 身份验证

本部分介绍如何创建新的服务账号并向其授予必要的角色,以及如何更新现有服务账号(如果它没有必要的角色)。

创建服务账号

如需创建服务账号,请完成创建服务账号过程并提供以下信息:

  • 选择要在其中创建服务账号的 Google Cloud 项目。

    • 对于 Compute Engine 实例,请选择您在其中创建了实例的项目。

  • 角色下拉菜单中,选择以下角色:

    • Monitoring > Monitoring Metric Writer

    • Logging > Logs Writer

  • 如果您计划使用服务账号密钥进行身份验证,请选择 JSON 作为密钥类型,然后点击创建

    点击创建时,系统会将包含服务账号密钥的文件下载到您的本地系统。如需了解详情,请参阅创建和删除服务账号密钥

接下来,根据您是使用关联的服务账号还是使用服务账号私钥进行授权来配置服务账号和设置。

验证并修改现有服务账号的角色

您可以使用 Google Cloud 控制台来确定现有服务账号具有哪些角色,并添加任何缺少的必要角色:

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

    前往 IAM

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

  2. 如有必要,点击 Google Cloud 项目的下拉列表,然后选择您项目的名称。

  3. 如果您没有看到 IAM 主账号(用户和服务账号)的列表,请选择权限标签页。

  4. 按主账号查看列表中,找到服务账号的条目。角色列列出了授予该服务账号的角色。

  5. 如果您的服务账号没有 Ops Agent 所需的必要角色,请按照以下步骤添加创建服务账号部分所述的角色:

    1. 点击服务账号条目中的 修改
    2. 点击添加其他角色以添加任何缺少的必要角色。
    3. 点击保存

使用关联的服务账号进行授权

如需向具有关联的服务账号的 Compute Engine 虚拟机实例上安装的 Ops Agent 进行授权,请执行以下操作:

  1. 确保您已验证虚拟机的访问权限范围

  2. 尽可能向服务账号授予最小权限的 IAM 角色。 如需了解所需角色,请参阅本页面的创建服务账号部分。

  3. 关联服务账号到运行代理的虚拟机。

  4. 如果您尚未安装代理,请安装代理。如需了解如何安装代理,请参阅安装代理

使用服务账号密钥进行授权

如需使用服务账号私钥向虚拟机实例上安装的 Ops Agent 授权,请执行以下操作:

  1. 将服务账号密钥文件从本地系统转移到您的虚拟机实例:

    1. 创建环境变量以指向本地系统上的服务账号密钥文件。以下示例创建一个名为 CREDS 的变量:

      CREDS=~/Downloads/PROJECT-NAME-KEY-ID.json
      
    2. 完成下表中显示的步骤:

      Compute Engine

      1. 在 Google Cloud 控制台中,转到虚拟机实例页面:

        前往虚拟机实例

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

        确定虚拟机的 INSTANCE_NAMEINSTANCE_ZONE

      2. 在本地系统上,运行 Google Cloud CLI 命令以将密钥文件从本地系统复制到虚拟机实例:

        REMOTE_USER="$USER"
        INSTANCE="INSTANCE_NAME"
        ZONE="INSTANCE_ZONE"
        gcloud compute scp "$CREDS" "$REMOTE_USER@$INSTANCE:~/temp.json" --zone "$ZONE"
        
      3. 在 Compute Engine 实例上,将服务账号密钥文件从临时位置移动到永久位置;对于 Linux,确保只有 root 可以读取服务账号密钥文件。

        您还必须将环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置为指向服务账号密钥文件的位置,并且该变量必须对代理的进程可见。如需了解配置信息,请参阅设置 GOOGLE_APPLICATION_CREDENTIALS

        例如,在 Linux 上,您可以运行以下脚本,将服务账号密钥文件移动到默认位置,然后设置适当的权限:

        CREDENTIALS_FILE_LOCATION="/etc/google/auth/application_default_credentials.json"
        sudo mkdir -p /etc/google/auth
        sudo mv "$HOME/temp.json" "$CREDENTIALS_FILE_LOCATION"
        sudo chown root:root "$CREDENTIALS_FILE_LOCATION"
        sudo chmod 0400 "$CREDENTIALS_FILE_LOCATION"
        

  2. 虚拟机实例现在有了代理需要的服务账号密钥文件。接下来,请安装或重启代理:

设置 GOOGLE_APPLICATION_CREDENTIALS

本部分介绍如何设置环境变量 GOOGLE_APPLICATION_CREDENTIALS,以使其对代理的进程可见。

Linux

  1. 修改以下配置文件,或创建该文件(如果该文件尚不存在):

    /etc/systemd/system.conf
    
  2. 将以下内容添加到配置文件中:

    DefaultEnvironment="GOOGLE_APPLICATION_CREDENTIALS=PATH_TO_CREDENTIAL_FILE"
    
  3. 重新加载环境变量:

    sudo systemctl daemon-reload
    
  4. 通过在虚拟机实例上运行以下命令来重启该代理。

    sudo systemctl restart google-cloud-ops-agent
    

Windows

  1. 在 PowerShell 中,以管理员身份运行以下命令,以设置 Ops Agent 要使用的 GOOGLE_APPLICATION_CREDENTIALS 系统环境变量:

    [Environment]::SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", "PATH_TO_CREDENTIAL_FILE", "Machine")
    
  2. 通过在虚拟机实例上运行以下命令来重启该代理。

    Restart-Service -Name google-cloud-ops-agent -Force