Google が構築した OpenTelemetry Collector 構成でシークレットを管理する

レシーバやエクスポータなどの一部のコンポーネントを構成する場合は、パスワードなどのシークレットを指定する必要があります。これらのシークレットは、コレクタの構成ファイルに平文として含めることが可能です。ただし、これらのシークレットは Collector によって書き込まれたシステムログに含まれ、Cloud Logging に送信されるため、Collector が実行されているノードまたは仮想マシン(VM)の外部にシークレットが公開されます。

Google がビルドした Collector バージョン 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. 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 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 に関連付けられたサービス アカウントのアドレス。
  7. 平文シークレットをマネージド シークレットに置き換える

    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_NAME: シークレットのわかりやすい名前に置き換えます。

    新しいシークレットの完全修飾リソース名の形式は次のとおりです。VERSION1 です。

    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 リポジトリをご覧ください。