配置某些第三方集成时,您需要为 Ops Agent 指标接收器提供 Secret(例如密码)。默认情况下,这些 Secret 以明文形式存储在代理的 config.yaml
文件中。这些 Secret 包含在由代理写入并传输到 Cloud Logging 的系统日志中,从而会在运行 Ops Agent 的虚拟机 (VM) 之外公开 Secret。
从 Ops Agent 2.57.0 版开始,您可以使用集成了 Secret Manager 的 OpenTelemetry 提供程序来消除配置文件中的明文 Secret。
提供程序是 OpenTelemetry 配置组件,类似于接收器和处理器组件。每个提供程序都有一种类型,并且每种类型的提供程序都会将配置中的特定标识符映射到一个值。
googlesecretmanager
提供程序会将 Secret Manager 标识符映射到您存储在 Secret Manager 中的 Secret(例如密码、令牌和 API 密钥)。使用 googlesecretmanager
提供程序具有以下优势:
- 增强安全性:您的配置文件不包含密码等敏感信息。实际的 Secret 存储在 Secret Manager 中(这是专门用于安全地存储、访问和管理敏感数据的服务)。
- 降低泄露风险:Secret Manager 会在 Ops Agent 初始化期间提取 Secret,从而防止明文 Secret 意外记录在日志中。
您只能在自定义 Ops Agent 配置的指标收集配置中使用 googlesecretmanager
。请勿使用该提供程序替换日志收集配置中的 Secret。
准备工作
如需使用 googlesecretmanager
提供程序,您必须按照以下步骤所述启用 Secret Manager API 并允许访问该 API:
-
安装 Google Cloud CLI。 安装完成后,运行以下命令来初始化 Google Cloud CLI:
gcloud init
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
设置 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。
- 向管理 Ops Agent 配置的用户授予创建和管理 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 的含义明确的名称。
- 要重启代理,请在您的实例上运行以下命令:
sudo systemctl restart google-cloud-ops-agent
- 如需确认代理已重启,请运行以下命令并验证“Metrics Agent”和“Logging Agent”组件是否已启动:
sudo systemctl status "google-cloud-ops-agent*"
- 使用 RDP 或类似工具连接到您的实例,然后登录到 Windows。
- 右键点击 PowerShell 图标并选择 Run as Administrator,以管理员权限打开 PowerShell 终端
- 如需重启代理,请运行以下 PowerShell 命令:
Restart-Service google-cloud-ops-agent -Force
- 如需确认代理已重启,请运行以下命令并验证“Metrics Agent”和“Logging Agent”组件是否已启动:
Get-Service google-cloud-ops-agent*
将明文 Secret 替换为托管式 Secret
如需通过 Secret Manager 和 googlesecretmanager
提供程序在配置文件中不再使用明文 Secret,请执行以下操作:
例如,如果您使用的是 mysql
指标接收器,则配置文件可能包含如下所示的条目:
receivers: mysql: type: mysql username: root password: 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 的资源名称的引用,如以下示例所示:
receivers: mysql: type: mysql username: root password: ${googlesecretmanager:projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION}