AWS KMS Auto Unsealは、Vaultの起動時にKMSへ復号リクエストを出して自動でアンシールする仕組み。手動アンシールの運用負荷を大きく下げられます。
本稿は、IAMロール・KMSキー・起動パスの設計から、監査・DR・ローテーションまでを実務目線で解説します。バージョン差異が出やすい箇所は注意点として記載します。
Vaultはストレージ暗号化のために内部マスターキーを持ちます。Auto Unseal構成では、このマスターキーをAWS KMSで包み(暗号化)保管し、起動時にKMSの復号APIを用いて自動アンシールします。これにより、Shamir方式の手動アンシールを省略できます。
前提として、対称暗号のKMSキー(カスタマーマネージドキー)、そのキーに対する最小権限のIAMロール、VaultサーバからKMSエンドポイントへの到達性が必要です。権限は一般にkms:Decrypt/kms:Encryptが中核で、環境やバージョンによりkms:DescribeKeyやkms:GenerateDataKey系が参照されることがあります。
Auto Unsealの高レベルフロー
Vaultサーバ設定例(awskmsシール)
seal "awskms" {
region = "ap-northeast-1"
kms_key_id = "arn:aws:kms:ap-northeast-1:111122223333:key/abcd-ef01-2345-6789-abcdef012345"
# 必要に応じてロール引受け
role_arn = "arn:aws:iam::111122223333:role/vault-unseal"
# 誤用防止のための暗号化コンテキスト(推奨)
kms_context = "App=vault-prod"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = 1
}
storage "raft" {
path = "/opt/vault/data"
node_id = "vault-1"
}基本は、Vault実行環境(EC2/VM/コンテナ)にアタッチするIAMロールを用意し、対象KMSキーに対する最小権限を付与します。単一アカウントならIAMポリシー側の許可だけで成立しますが、キー側のキーポリシーにPrincipalsを明示する運用も安定的です。
クロスアカウントでは、VaultアカウントのロールがKMSアカウントのロールをAssumeRoleするか、KMSキーポリシーでVaultアカウントのロールをPrincipalに許可します。どちらにせよ、kms:Decrypt/kms:Encryptが鍵、DescribeKeyは健全性確認に有用です。暗号化コンテキスト(kms_context)を併用し、キー誤用を条件で防ぎます。
最小権限に寄せたIAMポリシー例(暗号化コンテキスト併用)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VaultKmsCore",
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:Encrypt",
"kms:DescribeKey"
],
"Resource": "arn:aws:kms:ap-northeast-1:111122223333:key/abcd-ef01-2345-6789-abcdef012345",
"Condition": {
"StringEquals": {
"kms:EncryptionContext:App": "vault-prod"
}
}
}
]
}Vaultのawskmsシールは、AWS SDKの標準クレデンシャル探索順序を利用します。一般的には、EC2インスタンスプロファイルやEKSのIRSAからのロール認証、もしくは環境変数(AWS_ACCESS_KEY_ID等)を参照します。
起動順制御は実務で重要です。ネットワークスタックとメタデータサービス(IMDS/STS)へ到達できる前にVaultが起動すると、KMS復号に失敗します。systemdの依存関係設定、リトライ(Restart=on-failure)、バックオフなどで安定化します。
systemdユニット例(依存と環境の供給)
[Unit]
Description=HashiCorp Vault Server
After=network-online.target
Wants=network-online.target
[Service]
User=vault
Group=vault
EnvironmentFile=-/etc/vault.d/aws.env
ExecStart=/usr/local/bin/vault server -config=/etc/vault.d/vault.hcl
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
マルチAZは前提として、DRやリージョン障害に備えるならKMSのマルチリージョンキーを検討します。複製キーは同一キーID系統で復号互換を維持しやすく、Vaultクラスタが別リージョンで起動しても同一論理キーでアンシール可能に設計できます。
KMSの自動ローテーション(対称キー)は過去の暗号文の復号互換を保つ設計なので、通常はVault側の再設定は不要です。逆に、キーを無効化・削除保留にするとアンシール不可になるため、変更管理とメンテナンスウィンドウの定義が必須です。
運用で使う代表的CLI(例)
# ローテーション有効化(対称キー)
aws kms enable-key-rotation --key-id arn:aws:kms:ap-northeast-1:111122223333:key/abcd-ef01-2345-6789-abcdef012345
# マルチリージョンキーのレプリカ作成(例)
aws kms replicate-key \
--key-id arn:aws:kms:ap-northeast-1:111122223333:key/abcd-ef01-2345-6789-abcdef012345 \
--replica-region us-west-2暗号化コンテキスト(kms_context)を設定し、IAMやキーポリシーの条件で一致を必須化することで、同一キーを用いた他用途の誤用を抑止できます。Vault側とポリシー側の文字列一致が鍵です。
監査はCloudTrailでkms:Decrypt/kms:Encryptを可視化し、異常頻度や拒否イベントを検出します。Vaultの監査ログと突き合わせると時系列の整合が取りやすく、根因分析に有効です。
KMSキーポリシー例(暗号化コンテキスト必須)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowVaultRoleWithContext",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::111122223333:role/vault-unseal"},
"Action": ["kms:Decrypt", "kms:Encrypt", "kms:DescribeKey"],
"Resource": "*",
"Condition": {
"StringEquals": {
"kms:EncryptionContext:App": "vault-prod"
}
}
}
]
}Auto Unsealは起動自動化と監査容易性で優れますが、KMS到達性と権限に依存します。Shamir手動アンシールは外部依存が少ない反面、運用負荷が高い。Transit Auto-Unseal(Vault Transit)を使うとKMS非依存の自動化も可能ですが、Transit中枢の可用性が新たな前提になります。
既存クラスタからの移行は、事前にテスト環境で同一構成を再現し、KMS権限・疎通・コンテキスト条件を検証してから段階的に適用します。バージョン差異で許可APIが追加される場合があるため、許可アクションは監査ログを見ながら最小化・調整してください。
| 観点 | Shamir手動アンシール | AWS KMS Auto Unseal | Transit Auto-Unseal |
|---|---|---|---|
| 起動運用 | 複数キー保有者による手動手順が必要 | 起動時に自動復号。運用容易 | Transit到達性前提で自動復号 |
| 外部依存 | 最小(人手と手順に依存) | KMS権限・到達性に依存 | Transitクラスタ到達性に依存 |
| 監査 | 手順監査中心(人依存) | CloudTrailでAPI監査が容易 | Vault監査とネットワーク監査 |
| DR/リージョン跨ぎ | 人手計画で対応 | マルチリージョンキーで簡素化 | Transit側のDRが鍵 |
| 権限設計 | 不要(Vault外) | IAM/Key Policy/Context設計が重要 | TransitのACL・ポリシー設計が重要 |
移行前の疎通・権限テスト例(暗号/復号)
# 1) テスト用の暗号化・復号(コンテキスト一致)
aws kms encrypt \
--key-id arn:aws:kms:ap-northeast-1:111122223333:key/abcd-ef01-2345-6789-abcdef012345 \
--plaintext "test" \
--encryption-context App=vault-prod \
--query CiphertextBlob --output text > /tmp/ctxt.b64
aws kms decrypt \
--ciphertext-blob fileb:///tmp/ctxt.b64 \
--encryption-context App=vault-prod \
--query Plaintext --output text | base64 -d
# 2) Vaultの状態確認(起動後)
vault statusOps
問題 1
VaultをAWS KMS Auto Unsealで運用中。再起動後にアンシールに失敗し、CloudTrailにkms:DecryptのAccessDeniedが記録された。最も可能性が高い原因はどれか。
正解: A
AccessDeniedのDecryptは権限・キーポリシー・条件不一致(暗号化コンテキスト含む)が典型。自動ローテーションは互換性を保持する設計であり、それ自体が復号不能の直接原因になる可能性は低い。ストレージやTLS設定はDecryptの拒否とは無関係。
kms_contextは必須か。何を入れるべきか。
必須ではありませんが推奨です。用途がVaultであることと環境識別(例: App=vault-prod)を固定文字列で入れ、IAM/キーポリシーの条件で一致を強制すると誤用リスクを下げられます。
KMSキーの自動ローテーションはVaultに影響するか。
通常は影響しません。KMSは過去の暗号文の復号互換を維持します。変更管理上は運用窓と監視を確保し、誤ってキー無効化・削除保留にしないようガードレールを敷いてください。
クロスアカウントでの設計はどうするのが簡潔か。
KMS側キーポリシーにVaultアカウントのロールをPrincipalとして許可し、Vault側はそのロールを直接使用(もしくはAssumeRole)します。許可アクションはkms:Decrypt/kms:Encrypt/DescribeKeyを最小にし、必要なら暗号化コンテキストの一致を条件化します。
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...