配置某些组件(例如接收器或导出器)时,您可能需要提供密码等 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:
-
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.
设置 Google Cloud CLI 的默认项目:
gcloud config set project PROJECT_ID
在运行上述命令之前,请将 PROJECT_ID 变量替换为您的 Google Cloud 项目的标识符。
-
Enable the Secret Manager API:
gcloud services enable secretmanager.googleapis.com
- 更新实例的 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。
- 向管理 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:被授予该角色的用户的地址。
- 向与虚拟机关联的服务账号授予访问 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:与虚拟机关联的服务账号的地址。
- 在 Secret Manager 中为配置文件中的每个明文 Secret 创建一个 Secret。
- 将配置文件中的每个明文 Secret 替换为对 Secret Manager 中相应 Secret 的引用。
- plaintext-secret:替换为明文 Secret。
- SECRET_NAME:替换为 Secret 的含义明确的名称。
将明文 Secret 替换为托管式 Secret
如需通过 Secret Manager 和 googlesecretmanager
提供程序在配置文件中不再使用明文 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
如需创建包含明文 Secretplaintext-secret
的 Secret Manager Secret,请运行以下命令:
echo -n "plaintext-secret" | gcloud secrets create SECRET_NAME \ --replication-policy="automatic" \ --data-file=-
在运行上述命令之前,请替换以下变量:
新 Secret 的完全限定资源名称采用以下格式,其中 VERSION 为 1
:
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
代码库。