在 Google 构建的 OpenTelemetry 收集器配置中管理 Secret

配置某些组件(例如接收器或导出器)时,您可能需要提供密码等 Secret。您可以在收集器的配置文件中以明文形式包含这些 Secret。不过,这些 Secret 包含在收集器写入的系统日志中,并传输到 Cloud Logging,从而会在运行收集器的节点或虚拟机 (VM) 之外公开 Secret。

从 Google 构建的收集器版本 0.126.0 开始,您可以使用与 Secret Manager 集成的 OpenTelemetry 提供程序来消除配置文件中的明文 Secret。

提供程序是 OpenTelemetry 配置组件,类似于接收器和处理器组件。每个提供程序都有一种类型,并且每种类型的提供程序都会将配置中的特定标识符映射到一个值。

googlesecretmanager 提供程序会将 Secret Manager 标识符映射到您存储在 Secret Manager 中的 Secret(例如密码、令牌和 API 密钥)。使用 googlesecretmanager 提供程序具有以下优势:

  • 增强安全性:您的配置文件不包含密码等敏感信息。实际的 Secret 存储在 Secret Manager 中(这是专门用于安全地存储、访问和管理敏感数据的服务)。
  • 降低泄露风险:Secret Manager 会在 Google 构建的 OpenTelemetry 收集器初始化期间提取 Secret,从而防止明文 Secret 意外记录在日志中。

准备工作

如需使用 googlesecretmanager 提供程序,您必须按照以下步骤所述启用 Secret Manager API 并允许访问该 API:

  1. After installing the Google Cloud CLI, initialize it by running the following command:

    gcloud init

    If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  2. 设置 Google Cloud CLI 的默认项目:

    gcloud config set project PROJECT_ID
    

    在运行上述命令之前,请将 PROJECT_ID 变量替换为您的 Google Cloud 项目的标识符。

  3. Enable the Secret Manager API:

    gcloud services enable secretmanager.googleapis.com
  4. 更新实例的 OAuth 访问权限范围,以包含 Secret Manager 所需的范围 https://www.googleapis.com/auth/cloud-platform
    gcloud compute instances set-service-account "INSTANCE_ID" \
      --service-account "SERVICE_ACCT_EMAIL" \
      --scopes "https://www.googleapis.com/auth/cloud-platform"
    

    在运行上述命令之前,请替换以下变量:

    • INSTANCE_ID:虚拟机的标识符。
    • SERVICE_ACCT_EMAIL:与虚拟机关联的服务账号的地址。

    如需了解详情,请参阅访问 Secret Manager API

  5. 向管理 Google 构建的 OpenTelemetry 收集器配置的用户授予创建和管理 Secret 所需的权限。Identity and Access Management 角色 roles/secretManager.secretAdmin 可提供必要的权限:
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="user:USER_EMAIL" \
      --role=roles/secretManager.secretAdmin
    

    在运行上述命令之前,请替换以下变量:

    • PROJECT_ID:您的 Google Cloud 项目的标识符。
    • USER_EMAIL:被授予该角色的用户的地址。
  6. 向与虚拟机关联的服务账号授予访问 Secret 所需的权限。Identity and Access Management 角色 roles/secretManager.secretAccessor 可提供必要的权限:
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:SERVICE_ACCT_EMAIL" \
      --role=roles/secretManager.secretAccessor
    

    在运行上述命令之前,请替换以下变量:

    • PROJECT_ID:您的 Google Cloud 项目的标识符。
    • SERVICE_ACCT_EMAIL:与虚拟机关联的服务账号的地址。
  7. 将明文 Secret 替换为托管式 Secret

    如需通过 Secret Manager 和 googlesecretmanager 提供程序在配置文件中不再使用明文 Secret,请执行以下操作:

    1. 在 Secret Manager 中为配置文件中的每个明文 Secret 创建一个 Secret。
    2. 将配置文件中的每个明文 Secret 替换为对 Secret Manager 中相应 Secret 的引用。

    例如,如果您使用的是 http 导出器,则配置文件可能包含如下所示的条目:

    exporters:
      logging:
        loglevel: debug
      http:
        endpoint: "https://example.com/api/metrics"
        headers:
          X-API-Key: plaintext-secret
    

    在此示例中,您要将 plaintext-secret 字符串放入 Secret Manager 中,然后将明文 Secret 替换为对托管式 Secret 的引用。

    为明文 Secret 创建 Secret Manager Secret

    如需创建包含明文 Secret plaintext-secret 的 Secret Manager Secret,请运行以下命令:
    echo -n "plaintext-secret" | gcloud secrets create SECRET_NAME \
        --replication-policy="automatic" \
        --data-file=-
    

    在运行上述命令之前,请替换以下变量:

    • plaintext-secret:替换为明文 Secret。
    • SECRET_NAME:替换为 Secret 的含义明确的名称。

    新 Secret 的完全限定资源名称采用以下格式,其中 VERSION1

    projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION

    如需详细了解如何在 Secret Manager 中对 Secret 进行存储、版本控制和访问,请参阅创建 Secret

    替换明文 Secret

    如需更新配置文件,请将每个明文 Secret 替换为对 googlesecretmanager 提供程序和托管式 Secret 的资源名称的引用,如以下示例所示:

    exporters:
      logging:
        loglevel: debug
      http:
        endpoint: "https://example.com/api/metrics"
        headers:
          X-API-Key: ${googlesecretmanager:projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION}
    

    了解详情

    如需详细了解如何使用 googlesecretmanager 提供程序,请访问 opentelemetry-collector-contrib 代码库