VaultのAuto Unsealは、起動時に外部KMSへ依存してマスターキーを自動復号することで、手動Unsealの運用負荷を下げます。GCPではCloud KMSを用いたgcpckmsシールが公式にサポートされます。
本稿はOps視点で、GCP KMS Auto Unseal時のサービスアカウント(SA)設計にフォーカスします。試験対策としての要点(最小権限、キーマテリアルの取り扱い、Workload Identity推奨)と、実務でハマりがちな権限・ロケーション不一致・ログ監査の落とし穴を整理します。
Vaultのgcpckmsシールは、Cloud KMSの対称鍵(purpose=encryption)を用いてVaultのマスターキーをラップ/アンラップします。Vaultプロセスは起動時に付与されたSAのADC(Application Default Credentials)でCloud KMSに対してEncrypt/Decrypt APIを呼び、復号に成功するとストレージ(RaftやGCS等)からデータを読み出せる状態になります。
設計上のポイントは、Auto Unsealに必要なのはKMSのEncrypt/Decrypt権限のみであり、KMSキーの作成・ローテーション・ポリシー変更といった管理系権限は別SAに分離することです。これにより、万一Vault実行SAが侵害されても鍵管理面の被害を抑えられます。
GCP KMS Auto Unsealの呼び出しフロー(高レベル)
Auto Unseal要件は限定的です。運用で混同されがちな「Vault実行SA(Unseal用)」と「KMS管理SA(鍵ライフサイクル)」は必ず分けましょう。さらに、Vaultのデータストレージや監査ログ出力先に必要な権限も別途切り出すと、障害切り分けと権限境界が明確になります。
試験対策メモ: Unseal用SAに管理者ロール(Owner/Editor、KMS Admin)を付与しない。KMSキー単位スコープでroles/cloudkms.cryptoKeyEncrypterDecrypterを付ける、が鉄則です。
| SA区分 | 主要用途 | 必要ロール(推奨) | 付与スコープ |
|---|---|---|---|
| Vault実行SA(Unseal) | 起動時のKMS Encrypt/Decrypt | roles/cloudkms.cryptoKeyEncrypterDecrypter | 対象のcryptoKeyリソースのみ |
| KMS管理SA | キー作成/ローテ/ポリシー更新 | roles/cloudkms.admin(もしくは最小権限の組合せ) | プロジェクトまたはキーリング |
| Vault運用SA(ストレージ) | GCS/Raft等のI/O, 監査ログ出力 | roles/storage.objectAdmin等 必要最小 | 対象バケット/リソースのみ |
| CI/CDブートストラップSA | 最初のキー/リング作成・IAM付与 | 一時的に高権限、実行後剥奪 | プロジェクト(期間限定) |
Vaultのgcpckmsシールに必要な権限は、cloudkms.cryptoKeyVersions.useToEncrypt と cloudkms.cryptoKeyVersions.useToDecrypt を内包するプリンシパルロール roles/cloudkms.cryptoKeyEncrypterDecrypter です。これを対象cryptoKeyにだけ付与します。プロジェクトやキーリングに広く付けると、意図せぬ鍵利用が混入しやすくなります。
Workload Identityを使う場合は、KSA→GSAのバインドでGSA側に上記ロールを付与します。GCEの場合はインスタンス/テンプレートに対象GSAをアタッチし、不要なデフォルトEditorロール等が付いていないことを確認します。
GCE: インスタンス(またはMIG)にVault実行SAをアタッチ。メタデータ経由でADCが供給されます。鍵ファイルは不要です。
GKE Workload Identity: KSAにGSAを関連付け、PodはKSAで実行。GSAにKMSロールを付与。Autopilotでも同様の流れですが、ノードSAの直接編集は不要です。
監査では、KMSのEncrypt/Decrypt呼び出しをCloud Audit Logsで常時記録し、Vault起動時刻やスケールイベントと突合します。異常な頻度や時間帯のDecryptがあれば即時検知できるようにSIEM通知を設定しましょう。
鍵のローテーションはKMSで行い、Vaultは新バージョンで自動的にEncrypt/Decryptできます(Decrypterは旧バージョンにも有効)。ローテ周期と有効期限のSLOを明文化し、バックアップ/DRサイトにも同等の権限設計を反映させます。
以下は最小権限での手順例です。locationはサンプルとしてglobalを用いています。実運用ではレイテンシ・レギュレーション要件に合わせて選定してください。
典型的な失敗は、location不一致、SAの付け間違い、KMSロールのスコープ過不足、Workload Identityのバインド不備です。エラー文言と監査ログの突合で早期に切り分けましょう。
手順例(gcloud + Vault設定)
# 0) 変数
PROJECT_ID="my-project"
LOCATION="global"
KEYRING="vault-unseal"
KEY="vault-unseal-key"
UNSEAL_SA_NAME="vault-unseal-sa"
UNSEAL_SA="${UNSEAL_SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
# 1) SA作成(Unseal用)
gcloud iam service-accounts create ${UNSEAL_SA_NAME} \
--project=${PROJECT_ID} \
--description="Vault Auto Unseal runtime SA" \
--display-name="Vault Unseal SA"
# 2) KMSキーリングとキー(対称鍵)
gcloud kms keyrings create ${KEYRING} \
--location=${LOCATION} --project=${PROJECT_ID}
gcloud kms keys create ${KEY} \
--location=${LOCATION} --keyring=${KEYRING} \
--purpose=encryption --project=${PROJECT_ID}
# 3) 最小権限の付与(cryptoKeyスコープ)
gcloud kms keys add-iam-policy-binding ${KEY} \
--location=${LOCATION} --keyring=${KEYRING} \
--member=serviceAccount:${UNSEAL_SA} \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project=${PROJECT_ID}
# 4) GCEにアタッチ(例)
# インスタンステンプレートで --service-account ${UNSEAL_SA}
# GKEの場合はWorkload IdentityでGSA:${UNSEAL_SA}をKSAにバインド
# 5) Vaultサーバ設定(gcpckmsシール)
# region はKMSのlocationに合わせる(例: global, us-east1 など)
cat >/etc/vault.d/vault.hcl <<'EOF'
ui = true
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = 1
}
storage "raft" {
path = "/opt/vault/data"
}
seal "gcpckms" {
project = "my-project"
region = "global" # = KMS location
key_ring = "vault-unseal"
crypto_key = "vault-unseal-key"
}
EOF
# 6) 起動と初期化
# systemctl enable --now vault
# vault operator init -key-shares=1 -key-threshold=1
# -> Auto Unsealのため、起動時にKMSへ自動Decrypt呼び出し
# トラブルシュートの要点
# - permission denied: iamPolicyBindingの対象が"cryptoKey"か再確認
# - location mismatch: vault.hclのregionとKMSキーlocationが同一か
# - Workload Identity: KSA<->GSAバインド、トークンのAudience設定を再確認
# - 429 / rate limit: 再試行間隔、起動のスロットリング、KMS割当の見直しOps
問題 1
VaultのGCP KMS Auto UnsealをGKE上で運用する。最小権限で設計したい。正しい構成はどれか?
正解: A
最小権限の原則では、GSAに対して対象cryptoKeyスコープでroles/cloudkms.cryptoKeyEncrypterDecrypterのみを付与し、GKEではWorkload IdentityでKSAをGSAに関連付ける。鍵ファイル配布や過大なadmin/editorロール付与、location不一致は不適切。
KMS鍵をローテーションするとVaultのAuto Unsealは影響を受ける?
Cloud KMSの鍵ローテーションは新バージョンの有効化で行われ、roles/cloudkms.cryptoKeyEncrypterDecrypterがあれば旧バージョンのDecryptも可能です。Vaultは自動的に新バージョンでEncrypt/Decryptを継続できます。ローテ後の起動で問題がないか、監査ログと合わせて確認すると安全です。
複数のVaultクラスターで同じKMSキーを共有してよい?
技術的には可能ですが推奨しません。運用・監査上の分離と blast radius の限定のため、クラスターごとに専用のcryptoKey(少なくとも専用のキーリングまたはcryptoKey)を用意し、SAも分離するのが望ましいです。
サービスアカウント鍵JSONを使ってもよい?
可能ですが非推奨です。鍵ファイル配布は漏洩リスクとローテ手間を生みます。GCEならインスタンスにSAをアタッチ、GKEならWorkload IdentityでKSA→GSAを関連付ける方法が公式推奨に沿った安全な実装です。
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...