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

設定接收器或匯出程式等元件時,可能需要提供密碼等機密資訊。您可以在 Collectors 的設定檔中,以明文形式加入這些機密資料。不過,這些機密資料會包含在收集器寫入的系統記錄中,並傳送至 Cloud Logging,因此會在收集器執行的節點或虛擬機器 (VM) 之外洩漏機密資料。

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

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

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

  • 強化安全性:設定檔案不會包含密碼等機密資訊。實際的密鑰會儲存在 Secret Manager 中,這是一項專門用於安全儲存、存取及管理機密資料的服務。
  • 降低暴露風險:Secret Manager 會在 Google 建構的 OpenTelemetry 收集器初始化期間擷取密鑰,避免純文字密鑰意外記錄在記錄檔中。

事前準備

如要使用 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 專案的 ID。

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

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

  5. 授予管理 Google 內建 OpenTelemetry 收集器設定的使用者,建立及管理密鑰所需的權限。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 相關聯的服務帳戶地址。
  7. 將明文密鑰替換為受管理的密鑰

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

    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_NAME:請用有意義的名稱取代此值,用於 Secret。

    新機密的完整資源名稱採用以下格式,其中 VERSION1

    projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION

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

    替換純文字密鑰

    如要更新設定檔,請將每個純文字 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 存放區