最新の安定バージョンについては、Spring Cloud Config 5.0.5 を使用してください!

Google シークレットマネージャーバックエンド

Spring Cloud Config サーバーは Google クラウドシークレットマネージャー を EnvironmentRepository として使用できます。秘密情報は PropertySource として公開され、そのエントリは秘密ペイロードから構築されます。

バックエンドを有効にする

以下のすべての条件が満たされた場合、リポジトリは登録されます。

  • Spring プロファイル secret-manager はアクティブです。

  • com.google.cloud.secretmanager.v1.SecretManagerServiceClient はクラスパス上にあります (通常は google-cloud-secretmanager を追加することによって)。

pom.xml
<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-secretmanager</artifactId>
</dependency>

spring-cloud-config-server をオプションの Google ライブラリなしで使用する場合は、ビルドに必要なアーティファクトを明示的に追加してください。以下で説明する権限チェックは Cloud Resource Manager API を使用します。この動作に依存する場合は、google-api-services-cloudresourcemanager と google-auth-library-oauth2-http を含めてください。

spring:
  profiles:
    active: secret-manager
  cloud:
    config:
      server:
        gcp-secret-manager:
          order: 0
          application-label: application
          profile-label: profile
          service-account: /path/to/service-account.json
          token-mandatory: true
          version: 1

構成プロパティは spring.cloud.config.server.gcp-secret-manager にバインドされています。

プロパティ デフォルト 説明

order

他の環境リポジトリと同様

複合リポジトリ(org.springframework.core.Ordered)でオーダーします。

application-label

application

構成サーバー {application} 名と一致するために使用される Secret Manager ラベルキー ( マッピングアプリケーションとプロファイルを参照)。

profile-label

profile

シークレットマネージャーのラベルキーは、各アクティブプロファイルを照合するために使用されます(マッピングアプリケーションとプロファイルを参照)。

service-account

空の

Google クラウドサービスアカウントの JSON キーファイルへのパス。設定されている場合、Secret Manager クライアントはこの認証情報を使用します。設定されていない場合、クライアントはアプリケーションのデフォルト認証情報 (たとえば、Google Compute Engine 上のメタデータサーバー)を使用します。

token-mandatory

true

true の場合、シークレットはオプションの権限チェック (token-mandatory) が成功した場合にのみロードされます。false の場合、そのチェックはスキップされ、サーバー側のシークレットマネージャーの認証情報のみを使用してシークレットがロードされます。また、allowed-project-ids がクライアントから提供される X-Project-ID に適用されるかどうかも制御します (下記参照)。

allowed-project-ids

空の

token-mandatory が false の場合: 空でない X-Project-ID の許可リスト。空の場合、クライアントから提供されたプロジェクト ID は拒否されます。token-mandatory が true の場合、このプロパティはヘッダーでは無視されます (代わりにオプションの権限チェック (token-mandatory) が適用されます)。メタデータまたは project-id には適用されません。

project-id

空の

X-Project-ID が存在しない場合、またはメタデータが利用できない場合 (たとえばローカル開発環境) に、Google Cloud プロジェクトをフォールバックします。allowed-project-ids に対しては検証されていません。

version

1

API アクセス戦略バージョン(1 のみサポート)。

マッピングアプリケーションとプロファイル

サーバーは、Google クラウドプロジェクト(Google クラウドプロジェクトの解決を参照)内のシークレットを一覧表示し、各構成クライアントリクエストに対してフィルタリングします。

  • ラベルベースのマッチング (default) : 特定の {application} およびプロファイルに対して、シークレットマネージャーのラベルが、設定済みのキー (application-label および profile-label) 上で大文字小文字を区別せずに一致する場合に、シークレットが含まれます。シークレットにラベルがない場合、コードはそれをそれぞれデフォルトの文字列 application または profile (プロパティ名と同じキー) として扱うため、ラベルのないシークレットはこれらのデフォルト値に準拠します。

  • 接頭辞に基づくマッチング : HTTP リクエストに空でない X-Secret-Prefix ヘッダーが含まれている場合、ショートネーム(projects/…​/secrets/ の後のセグメント)がそのプレフィックスで始まるシークレットも含まれます。プレフィックスはプロパティキーから削除されます。このパスは、同じループ内でラベルフィルタリングロジックと組み合わせることができます(GoogleSecretManagerEnvironmentRepository を参照)。

リポジトリは、他のバックエンドと同様に、default プロファイルが他のプロファイルよりも先に考慮されるように常に保証します。クライアントが最初に default を送信しない場合、サーバーはそれを先頭に追加します。

一致するシークレットごとに、プロパティ値は 最新の有効化されたシークレットバージョンのペイロードになります。「最新」は、数値バージョン ID を比較することによって決定されます(シークレットマネージャーの「最新」エイリアスではありません)。

プロパティソースの名前は gsm:{application}-{profile} です。

Config Server {label} パスセグメントは API で受け入れられますが、このバックエンドではシークレットの選択には使用されません。バージョン選択は、上記で説明したシークレットバージョンに基づいて行われます。

Google クラウドプロジェクトの解決

Secret Manager API 呼び出しはプロジェクト ID にスコープされます。解決は、GoogleSecretManagerV1AccessStrategy 内部の GcpProjectResolutionSupport によって、現在の HTTP リクエストヘッダー、オプションのメタデータ、構成情報を使用して実行されます。

プロジェクトは以下の順序で選ばれます。

  1. 空でない X-Project-ID ヘッダー(トリミング後)。token-mandatory が true の場合、ヘッダー値は許可リストのチェックなしで受け入れられ、そのプロジェクトへのアクセスはオプションの権限チェック (token-mandatory) によって強制されます。token-mandatory が false の場合、プロジェクトは allowed-project-ids に存在する必要があります。このリストが空の場合、クライアントから提供されたプロジェクト ID は許可されません。

  2. GCE メタデータ : GET metadata.google.internal/computeMetadata/v1/project/project-id (英語) 、ヘッダー Metadata-Flavor: Google。インスタンスのプロジェクトを使用します(クライアントはこのパスを介して操作できません)。許可リストは適用されません。

  3. project-id プロパティ : spring.cloud.config.server.gcp-secret-manager.project-id が設定され、メタデータからプロジェクトが生成されなかった場合。サーバー管理者設定のみ。許可リストは適用されません。

プロジェクトが解決できない場合、getSecrets() はシークレットがない (GSM で裏付けられたエントリがない) かのように動作し、token-mandatory が true の場合、checkRemotePermissions() は false を返します。そのため、リポジトリはそのリクエストに対して GSM PropertySource を提供しません。これは、権限チェックの失敗と一致します。

token-mandatory を false に設定すると、クライアントは allowed-project-ids リストにある任意のプロジェクトからシークレットをロードできるようになります。token-mandatory を false に設定しないことを推奨します。そうすることで、シークレットをロードする前にオプションの権限チェック (token-mandatory) が実行されるようになります。
token-mandatory false を使用する場合、X-Project-ID に依存するクライアントは、allowed-project-ids で許可されたプロジェクト ID をリストする必要があります。

秘密を一覧表示および閲覧するための認証情報

秘密情報の一覧表示と秘密値へのアクセスには、SecretManagerServiceClient のみが使用されます。

  • service-account が設定されている場合: その JSON ファイルから取得した認証情報。

  • それがなければ: アプリケーションのデフォルト認証情報。

X-Config-Token における OAuth アクセストークンは、シークレットマネージャークライアントには渡されません。これらの認証情報は、クライアントトークンとは関係なく、常にサーバー(またはキーファイル)のものです。

オプションの権限チェック (token-mandatory)

token-mandatory が true (デフォルト)の場合、サーバーはシークレットをロードする前に、アクセス戦略に対して checkRemotePermissions() を呼び出します。このメソッドは、シークレットマネージャーの呼び出し(Google クラウドプロジェクトの解決を参照)と同じ方法でターゲットプロジェクトを解決し、その後、次の処理を実行します。

  1. X-Config-Token HTTP ヘッダーからアクセストークンを読み取ります(このチェックには必須です。ヘッダーが欠落しているか無効な場合、チェックは失敗します)。

  2. プロジェクトが解決できなかった場合、チェックは失敗します。

  3. そのプロジェクトに対して、権限 secretmanager.versions.access で Cloud Resource Manager REST API projects.testIamPermissions を使用します。

  4. トークンに対してその権限が報告されている場合、チェックは成功し、シークレットがロードされます。そうでない場合、または API 呼び出しが失敗した場合、チェックは失敗し、そのリクエストに対して GSM ベースのプロパティソースは追加されません。

つまり、X-Config-Token のトークンは、token-mandatory が true の場合に GSM データが返されるかどうかのゲートとして機能し、一方、シークレットの読み取りには引き続きサーバーのシークレットマネージャー認証情報が使用されます。IAM テストに合格したプリンシパルと、シークレットマネージャー API 呼び出しに使用されるプリンシパルは異なる場合があります。

token-mandatory が false の場合、このリモートチェックは実行されず、シークレットはサーバーの認証情報とシークレットマネージャーのデータアクセスのみに基づいてロードされます(X-Project-ID を使用する場合は、プロジェクトの解決と allowed-project-ids に依存します)。

HTTP ヘッダー (設定クライアントから設定サーバーへ)

ヘッダー 必要な場合 目的

X-Config-Token

token-mandatory is true for the permission check

Bearer-style access token used only for Cloud Resource Manager testIamPermissions.

X-Project-ID

メタデータを使用して GCP 上で実行しない場合に推奨

Google は、シークレットマネージャーおよび IAM チェック用のクラウドプロジェクト ID です。

X-Secret-Prefix

オプション

名前プレフィックスによるマッチング時に、どのシークレットがプロパティに貢献するかを制限します(マッピングアプリケーションとプロファイルを参照)。

HTTP の規則ではヘッダー名は大文字小文字を区別しません。実装では X-Config-Token、X-Project-ID、X-Secret-Prefix を使用します。