在 Google 建構的 OpenTelemetry 收集器設定中管理密鑰

設定某些元件 (例如接收器或匯出工具) 時,可能需要提供密鑰,例如密碼。您可以在收集器的設定檔中,以純文字形式加入這些密鑰。不過,這些密碼會納入 Collector 寫入的系統記錄,並傳輸至 Cloud Logging,因此會暴露在 Collector 執行的節點或虛擬機器 (VM) 之外。

從 Google 建構的收集器 0.126.0 版開始,您可以使用與 Secret Manager 整合的 OpenTelemetry 供應商,消除設定檔中的明文密鑰。

供應器是 OpenTelemetry 設定元件,類似於接收器和處理器元件。每個供應商都有類型,且每種供應商類型都會將設定中的特定 ID 對應至值。

googlesecretmanager 供應器會將 Secret Manager 識別碼對應至您儲存在 Secret Manager 中的密鑰,例如密碼、權杖和 API 金鑰。使用 googlesecretmanager 供應器可享有下列好處:

  • 強化安全性:設定檔不含密碼等私密資訊。實際密鑰會儲存在 Secret Manager 中,這項服務專門用於安全地儲存、存取及管理機密資料。
  • 降低曝光風險:Secret Manager 會在初始化 Google 建構的 OpenTelemetry Collector 時擷取密鑰,避免純文字密鑰意外記錄在記錄中。

事前準備

如要使用 googlesecretmanager 提供者,請按照下列步驟啟用 Secret Manager API 並允許存取該 API:

  1. 安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:

    gcloud init

    如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

  2. 設定 Google Cloud CLI 的預設專案:

    gcloud config set project PROJECT_ID
    

    執行上述指令前,請將 PROJECT_ID 變數替換為專案的 Google Cloud ID。

  3. 啟用 Secret Manager API (如果尚未啟用):

    啟用 API 所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    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:虛擬機器的 ID。
    • SERVICE_ACCT_EMAIL:與 VM 相關聯的服務帳戶地址。

    詳情請參閱「 存取 Secret Manager API」。

  5. 授予管理 Google 內建 OpenTelemetry Collector 設定的使用者,建立及管理密鑰所需的權限。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 專案的 ID。
    • USER_EMAIL:要授予角色的使用者地址。
  6. 授予與 VM 相關聯的服務帳戶存取密鑰所需的權限。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 ID。
    • SERVICE_ACCT_EMAIL:與 VM 相關聯的服務帳戶地址。

將明文密鑰替換為代管密鑰

如要使用 Secret Manager 和 googlesecretmanager 提供者,避免在設定檔中使用純文字密鑰,請按照下列步驟操作:

  1. 在 Secret Manager 中,為設定檔中的每個純文字密鑰建立密鑰。
  2. 將設定檔案中的每個純文字密鑰,替換為 Secret Manager 中對應密鑰的參照。

舉例來說,如果您使用 http 匯出工具,設定檔可能包含類似下列的項目:

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

在本例中,您要將 plaintext-secret 字串放入 Secret Manager,然後將純文字密鑰替換為受管理密鑰的參照。

為純文字密鑰建立 Secret Manager 密鑰

如要建立包含純文字密鑰 plaintext-secret 的 Secret Manager 密鑰,請執行下列指令:
echo -n "plaintext-secret" | gcloud secrets create SECRET_NAME \
    --replication-policy="automatic" \
    --data-file=-

執行上述指令前,請先替換下列變數:

  • plaintext-secret:替換為明文 Secret。
  • SECRET_NAME:請將此名稱替換為有意義的名稱。

新密鑰的完整資源名稱格式如下,其中 VERSION 為 1:

projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION

如要進一步瞭解如何在 Secret Manager 中儲存、版本化及存取密鑰,請參閱「建立密鑰」。

取代純文字密鑰

如要更新設定檔,請將每個純文字密鑰替換為對 googlesecretmanager 提供者和受管理密鑰資源名稱的參照,如下列範例所示:

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 存放區。