GCP上のワークロードがVaultに安全に接続し、必要なときだけGCPの短期資格情報(アクセストークンや一時鍵)を取得できる構成は、ゼロトラストと最小権限を両立させるうえで定番です。
本稿では、VaultのGCP Auth MethodとGCP Secrets Engineを中心に、サービスアカウント連携の設計・構築・運用の勘所を、Associateレベルの試験対策目線で要点化します。
Vaultでは、認証(誰か)とシークレット発行(何を渡すか)を明確に分離します。GCP連携では、Auth Methodとしての「GCP Auth」と、動的資格情報を発行する「GCP Secrets Engine」を組み合わせるのが基本です。
GCP Authは、GCEインスタンスのアイデンティティやサービスアカウントの署名付きJWTを用いて、クライアントをVaultにログインさせます。GCP Secrets Engineは、指定されたロールに基づき、短期のアクセストークンやサービスアカウント鍵を動的に払い出します。
最小ポリシー例(VaultでGCP秘密の読み出しを許可)
path "gcp/token/app-role" {
capabilities = ["read"]
}
GCP Auth Methodは2系統に大別できます。GCEタイプはGCEやGKEノードのメタデータサーバから入手できるインスタンスアイデンティティを用います。IAMタイプはサービスアカウントが署名したJWT(もしくはIAM Credentials APIで署名)を用います。どちらもVaultはGoogleの署名・公開鍵に基づく検証と、ロールの境界条件(bound_service_accountsなど)で厳格に照合します。
アプリケーションはVaultにログインしてクライアントトークンを取得し、そのトークンでGCP Secrets Engineから短命なアクセストークン等を取得する流れが基本です。長期のJSON鍵ファイルを配布せずに済む構成が実務でも推奨されます。
IAMタイプのログイン例(概念)
# 1) サービスアカウントでJWTを署名(IAM Credentials API など)
# 例: gcloud iam service-accounts sign-jwt payload.json signed.jwt --iam-account SA_EMAIL
# payload.json には iss/sub/aud/iat/exp 等の標準クレームを含める(audはVaultロールに合わせる)
# 2) Vaultにログイン
vault write auth/gcp/login \
role="app-iam-role" \
[email protected]
# 3) 返却された client_token を使用してGCPトークン取得
vault read gcp/token/app-role
まずGCP Auth Methodを有効化し、ロールを作成してGCPのサービスアカウントやプロジェクト境界を定義します。次にGCP Secrets Engineを有効化し、必要なスコープやインパーソネーション対象をロールで制御します。最後にロールに紐づくポリシーを用意して、アプリが読み出せるパスを限定します。
GCP Secrets EngineはVaultがGCPに対して代理でトークンや鍵を発行するため、Vault自体がGCPへ認証できる必要があります。これはApplication Default Credentials(例: Vaultサーバが付与されたサービスアカウント)や、明示的な資格情報をSecrets Engine構成に設定して実現します。
代表的なCLI手順(例)
# 1) GCP Auth Method を有効化
vault auth enable gcp
# 2) IAMタイプのロールを作成(特定SAのみ許可、TTLを短く)
vault write auth/gcp/role/app-iam-role \
type="iam" \
bound_service_accounts="app-sa@PROJECT_ID.iam.gserviceaccount.com" \
bound_projects="PROJECT_ID" \
ttl="15m" \
max_ttl="1h" \
policies="app-gcp-read"
# 3) GCP Secrets Engine を有効化
vault secrets enable gcp
# 4) Secrets Engine の構成(ADCを利用する例: VaultがGCPへ認証できる環境で動作)
# credentials を省略するとADCが使われる構成が一般的
vault write gcp/config \
ttl="3600s" \
max_ttl="43200s"
# 5) アクセストークン発行ロール(特定SAに対して所定スコープ)
vault write gcp/roleset/app-role \
project="PROJECT_ID" \
secret_type="access_token" \
[email protected] \
token_scopes="https://www.googleapis.com/auth/cloud-platform"
# bindings.hcl の例(SAインパーソネーション許可)
# resource "//iam.googleapis.com/projects/PROJECT_ID/serviceAccounts/target-sa@PROJECT_ID.iam.gserviceaccount.com" {
# roles = ["roles/iam.serviceAccountTokenCreator"]
# }
# 6) ポリシー(Secrets Engineの読み取りのみを許可)
cat <<'EOF' | vault policy write app-gcp-read -
path "gcp/token/app-role" {
capabilities = ["read"]
}
EOF
IAMタイプの認証では、署名に用いるサービスアカウント(クライアント側)がJWTを署名できる必要があります。IAM Credentials APIを用いる場合、呼び出し主体には対象SAへの roles/iam.serviceAccountTokenCreator 権限が必要です。鍵ファイルを配布せず、API署名を使うのが実務では推奨です。
Secrets Engineでアクセストークンを発行する場合、Vault(サーバ側)が対象のサービスアカウントをインパーソネートできる必要があります。Vaultが稼働するインスタンスのサービスアカウント、あるいはVaultに設定したADCに、対象SAへの roles/iam.serviceAccountTokenCreator 等を付与しておきます。
gcloudによる代表的な設定例
# クライアントが署名に使うSA
CLIENT_SA="app-sa@PROJECT_ID.iam.gserviceaccount.com"
# Vaultがインパーソネーションに使うSA(Vaultサーバに割り当て)
VAULT_SA="vault-sa@PROJECT_ID.iam.gserviceaccount.com"
# ターゲットSA(実際にトークンを取得したい主体)
TARGET_SA="target-sa@PROJECT_ID.iam.gserviceaccount.com"
# 1) クライアント側:CLIENT_SAに自身のJWT署名を許可(必要に応じて)
# signJwtを呼ぶ主体にTokenCreatorを付与
gcloud iam service-accounts add-iam-policy-binding ${CLIENT_SA} \
--member="serviceAccount:${CLIENT_SA}" \
--role="roles/iam.serviceAccountTokenCreator"
# 2) Vault側:VAULT_SAにTARGET_SAへのインパーソネーション権限
gcloud iam service-accounts add-iam-policy-binding ${TARGET_SA} \
--member="serviceAccount:${VAULT_SA}" \
--role="roles/iam.serviceAccountTokenCreator"
ロールの境界条件とTTLは、侵害時の影響範囲を小さく保つための第一手段です。GCP Authのロールでは、少なくとも bound_service_accounts と bound_projects は明示し、audiencesやリージョン・ゾーン境界(GCE)も可能な範囲で絞り込みます。
Secrets Engineでは、長期のサービスアカウント鍵より、短期のアクセストークン発行を優先します。どうしても鍵が必要な場合はTTLと自動破棄の仕組みを有効化し、監査ログと併せて期限前ローテーションを運用に組み込みます。
境界条件を強めたロール構成(例)
# IAMタイプのロールで複数条件を指定
vault write auth/gcp/role/app-iam-role \
type="iam" \
bound_service_accounts="app-sa@PROJECT_ID.iam.gserviceaccount.com" \
bound_projects="PROJECT_ID" \
audiences="vault-app" \
ttl="10m" \
max_ttl="30m" \
policies="app-gcp-read"
Associateレベルでは、Auth MethodとSecrets Engineの役割分担、ロールとポリシーの関係、TTLの意味が頻出です。GCP特有の実装細部ではなく、境界条件と短命資格情報という設計原則を説明できることが重要です。
また、同じ目的(クラウド上のワークロード認証)でも、AppRoleやKubernetes Authなど他方式とのトレードオフを問う設問が出ます。どの認証方式が前提条件や信頼境界に合うかを選べるように、観点別に整理しておきましょう。
| 認証方式 | 主な用途/前提 | 証明手段 | 認可の単位 |
|---|---|---|---|
| GCP Auth(IAM/GCE) | GCP上のワークロード。GCE/GKE/CloudRunなどGCPアイデンティティが前提 | GCEインスタンスIDトークン or SA署名JWT | Vaultロール→Vaultポリシー→Secrets Engineロール |
| Kubernetes Auth | K8s上のPodからの認証(KSA/ServiceAccountトークン) | K8sサーバが署名するSAトークン(JWT) | K8sのns/saバインド→Vaultロール→ポリシー |
| AppRole | 汎用的なマシン認証。外部ID基盤不要 | RoleID + SecretID(配布/取り扱いに注意) | AppRoleロール→ポリシー |
| OIDC/JWT Auth | 外部IdPと統合(人/マシン混在) | OIDCトークン(IdP署名) | クレームマッピング→ポリシー |
Associate
問題 1
VaultでGCPサービスアカウントを用いたIAMタイプの認証を、鍵ファイルを配布せずに実現したい。最も適切なアプローチはどれか。
正解: A
IAM Credentials APIでサービスアカウントがJWTを署名し、GCP Authにログインするのが推奨。長期鍵の配布やrootトークン配布はセキュリティ上不適切。AppRoleは外部IDが使えない場合の選択肢であり、GCPのネイティブアイデンティティが使える環境ではGCP Authが適合する。
audiencesは何に合わせればよいですか?
ロールで設定したaudiencesと一致させます。Vault側ロールで複数値を許可する場合も、クライアントが署名するJWTのaudクレームはそのいずれかに一致させる必要があります。
Secrets Engineでサービスアカウント鍵を発行するのは避けるべきですか?
可能であれば短期アクセストークンの発行を優先してください。鍵発行が必要な場合はTTLを短くし、自動破棄とローテーションを徹底します。監査ログで鍵の利用を継続的に確認することも重要です。
VaultサーバはどのようにGCPへ認証しますか?
VaultはGCP Secrets Engineの構成でADC(Application Default Credentials)または明示的な資格情報を使用します。GCE上でVaultを動かす場合は、Vaultサーバのインスタンスに付与したサービスアカウントの権限でインパーソネーション等を行う構成が一般的です。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Vault のコア概念を最短距離で理解する:Secret / Auth / Policy / Token
HashiCorp Vault Associate レベルで押さえるべきコア概念(Secret Engine、Auth ...
Vault Operations Professional: 上位資格としての範囲を実務目線で押さえる
HashiCorp Vault Operations Professional(Ops Pro)の出題範囲を、Assoc...
Vaultにおけるパスベースのルーティング: マウントとAPI構造を読み解く
HashiCorp Vaultのパスベースのルーティングを、マウント設計とAPIパスの観点から整理。Associateレ...
Vault Tokens の基礎: 認証の起点となる概念
HashiCorp Vault におけるトークンの役割、種類、ライフサイクル、ポリシー連携、設計パターンをAssocia...
Vault のトークン種類を正しく使い分ける: service / batch 実践
HashiCorp Vault Associate 向けの試験対策と実務運用を両立させた、service トークンと b...