最新の安定バージョンについては、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を追加することによって)。
<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 にバインドされています。
| プロパティ | デフォルト | 説明 |
|---|---|---|
| 他の環境リポジトリと同様 | 複合リポジトリ( |
|
| 構成サーバー |
|
| シークレットマネージャーのラベルキーは、各アクティブプロファイルを照合するために使用されます(マッピングアプリケーションとプロファイルを参照)。 |
| 空の | Google クラウドサービスアカウントの JSON キーファイルへのパス。設定されている場合、Secret Manager クライアントはこの認証情報を使用します。設定されていない場合、クライアントはアプリケーションのデフォルト認証情報 (たとえば、Google Compute Engine 上のメタデータサーバー)を使用します。 |
|
|
|
| 空の |
|
| 空の |
|
|
| API アクセス戦略バージョン( |
マッピングアプリケーションとプロファイル
サーバーは、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 リクエストヘッダー、オプションのメタデータ、構成情報を使用して実行されます。
プロジェクトは以下の順序で選ばれます。
空でない
X-Project-IDヘッダー(トリミング後)。token-mandatoryがtrueの場合、ヘッダー値は許可リストのチェックなしで受け入れられ、そのプロジェクトへのアクセスはオプションの権限チェック (token-mandatory) によって強制されます。token-mandatoryがfalseの場合、プロジェクトはallowed-project-idsに存在する必要があります。このリストが空の場合、クライアントから提供されたプロジェクト ID は許可されません。GCE メタデータ : GET
metadata.google.internal/computeMetadata/v1/project/project-id (英語)、ヘッダーMetadata-Flavor: Google。インスタンスのプロジェクトを使用します(クライアントはこのパスを介して操作できません)。許可リストは適用されません。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 クラウドプロジェクトの解決を参照)と同じ方法でターゲットプロジェクトを解決し、その後、次の処理を実行します。
X-Config-TokenHTTP ヘッダーからアクセストークンを読み取ります(このチェックには必須です。ヘッダーが欠落しているか無効な場合、チェックは失敗します)。プロジェクトが解決できなかった場合、チェックは失敗します。
そのプロジェクトに対して、権限
secretmanager.versions.accessで Cloud Resource Manager REST APIprojects.testIamPermissionsを使用します。トークンに対してその権限が報告されている場合、チェックは成功し、シークレットがロードされます。そうでない場合、または API 呼び出しが失敗した場合、チェックは失敗し、そのリクエストに対して GSM ベースのプロパティソースは追加されません。
つまり、X-Config-Token のトークンは、token-mandatory が true の場合に GSM データが返されるかどうかのゲートとして機能し、一方、シークレットの読み取りには引き続きサーバーのシークレットマネージャー認証情報が使用されます。IAM テストに合格したプリンシパルと、シークレットマネージャー API 呼び出しに使用されるプリンシパルは異なる場合があります。
token-mandatory が false の場合、このリモートチェックは実行されず、シークレットはサーバーの認証情報とシークレットマネージャーのデータアクセスのみに基づいてロードされます(X-Project-ID を使用する場合は、プロジェクトの解決と allowed-project-ids に依存します)。
HTTP ヘッダー (設定クライアントから設定サーバーへ)
| ヘッダー | 必要な場合 | 目的 |
|---|---|---|
|
|
Bearer-style access token used only for Cloud Resource Manager |
| メタデータを使用して GCP 上で実行しない場合に推奨 | Google は、シークレットマネージャーおよび IAM チェック用のクラウドプロジェクト ID です。 |
| オプション | 名前プレフィックスによるマッチング時に、どのシークレットがプロパティに貢献するかを制限します(マッピングアプリケーションとプロファイルを参照)。 |
HTTP の規則ではヘッダー名は大文字小文字を区別しません。実装では X-Config-Token、X-Project-ID、X-Secret-Prefix を使用します。