Azure の権限を必要とするワークロードに、長期保存のクライアントシークレットを配布する運用はリスクが高い。Vault の Azure シークレットエンジンを使えば、必要な時だけ短命の Service Principal を発行し、TTL 経過やリース取り消しで自動失効させられる。
この記事では、最小権限での権限設計、セットアップから発行・失効、運用の落とし穴までを一気通貫で解説する。Associate / Ops レベルの資格対策ポイントも併記した。
Vault Azure シークレットエンジンは、Azure AD にアプリ登録と対応する Service Principal を作成し、指定スコープに Azure RBAC を付与したうえでクライアントID・シークレットを払い出す。払い出された認証情報にはリースが付与され、TTL 経過や明示的な取り消しで自動的に無効化される。
運用上の主な利点は、短命クレデンシャルによる露出時間の最小化、RBAC の自動付与・自動剥奪、Vault 監査ログによるトレーサビリティだ。Key Vault のような保管型ではなく、発行とライフサイクル管理に強い点が特徴となる。
| 観点 | Vault Azure シークレットエンジン | Azure Key Vault | 手動 Service Principal 管理 |
|---|---|---|---|
| 認証情報の寿命 | TTL 付き短命。自動失効と取り消しが可能 | 基本は長期保管。ローテーションは別途実装 | 長期になりやすく、失効漏れのリスク |
| RBAC 付与の自動化 | ロール定義で scope に自動割当 | RBAC 付与は対象外(秘密の保管が主) | 都度ポータル/CLIで手動付与 |
| 失効・取り消し | リース取り消しで即時無効化と権限剥奪 | シークレットの無効化/削除を手動で実施 | アプリ/SPやロール割当の手動削除 |
| 監査可能性 | Vault 監査ログに払い出し・失効が記録 | Key Vault 監査は保管操作中心 | 担保しづらく分散しがち |
| 試験観点 | azure/creds/<role> の読み取りで発行 | 発行ではなく保管用途 | 資格試験では非推奨パターンとして問われがち |
Vault が Azure 側でアプリ登録/Service Principal 作成やロール割当を行うため、構成用の Azure アプリ(Vault 側から利用するクレデンシャル)にはディレクトリとRBAC双方の権限が必要となる。加えて、Vault から Microsoft Graph と Azure Resource Manager へ到達できるネットワーク環境を用意する。
実務では、作成と割当の権限を最小化し、スコープを限定することが肝要。試験でも、どの権限がどの操作に必要かが頻出で問われる。
最初にシークレットエンジンを有効化し、tenant_id と構成用の client_id/client_secret を保存する。環境(AzurePublicCloud 等)を明示することでエンドポイントが適切に選択される。続いて、TTL ポリシーを調整する。
ロール定義と発行は次のセクションで扱う。ここでは最短経路で動作確認できる CLI/HTTP API と、運用自動化のための Terraform 定義例を示す。
CLI/HTTP と Terraform による初期設定と疎通確認
#!/usr/bin/env bash
set -euo pipefail
# 1) 有効化と Azure クレデンシャル設定
vault secrets enable azure || true
vault write azure/config \
tenant_id="$AZURE_TENANT_ID" \
client_id="$AZURE_CLIENT_ID" \
client_secret="$AZURE_CLIENT_SECRET" \
environment="AzurePublicCloud"
# (任意)デフォルトのリース設定
vault write azure/config/lease ttl=1h max_ttl=24h
# 2) ロール定義(resource group 範囲に Contributor を付与する例)
cat > role-dev.json <<'JSON'
{
"azure_roles": [
{
"role_name": "Contributor",
"scope": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/app-rg"
}
],
"ttl": "1h",
"max_ttl": "24h"
}
JSON
curl \
--silent \
--header "X-Vault-Token: $VAULT_TOKEN" \
--request POST \
--data @role-dev.json \
"$VAULT_ADDR/v1/azure/roles/dev" | jq '.'
# 3) 認証情報の発行(出力に client_id, client_secret, tenant_id, lease_id など)
vault read -format=json azure/creds/dev | jq '.'
# 4) 取り消し(即時失効)
# vault lease revoke <lease_id>
# ------------------------------
# Terraform 例(抜粋)
# ------------------------------
# provider "vault" {}
# resource "vault_azure_secret_backend" "az" {
# path = "azure"
# tenant_id = var.tenant_id
# client_id = var.client_id
# client_secret = var.client_secret
# environment = "AzurePublicCloud"
# }
# resource "vault_azure_secret_backend_role" "dev" {
# backend = vault_azure_secret_backend.az.path
# role = "dev"
# ttl = "1h"
# max_ttl = "24h"
# azure_roles = [{
# role_name = "Contributor"
# scope = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/app-rg"
# }]
# }ロールは、払い出される Service Principal に対してどのスコープにどの Azure RBAC を付与するか、さらに TTL/Max TTL を定義する。スコープはサブスクリプション、リソースグループ、特定リソース単位まで絞り込める。1ロールに複数の role_name/scope を含めることも可能だが、最小権限の原則に従い、環境・用途ごとにロールを分けると運用が安定する。
発行時は azure/creds/<role> を read するだけで、Vault が Azure AD にアプリ登録と Service Principal を作成し、定義済みスコープにロール割当を行う。応答には client_id、client_secret、tenant_id とリース情報が含まれ、TTL を超えると自動失効する。明示的に失効させたい場合は lease_id を指定して取り消しを行う。
Vault による Service Principal 発行フロー
TTL はロール単位やデフォルトの lease 設定で管理する。長時間ジョブの場合はクライアント側からリース更新を行う設計にする。失敗時は取り消しで直ちに失効させ、再発行する。監査は Vault 側の audit デバイスを必ず有効化し、払い出しと失効の責任追跡を担保する。
実運用での落とし穴としては、ロール割当のスコープ過大、Graph API のレート制限、権限不足による作成失敗がある。CI からの利用時は Vault への認証(AppRole/OIDC)とロールの対応関係を明確化し、誤用を防ぐ。
作成や割当が失敗する典型原因は権限不足だ。アプリ登録・SP 作成はディレクトリ権限、ロール割当は対象スコープの Owner か User Access Administrator が必要となる。メッセージで Insufficient privileges が出たらまず権限とスコープを確認する。
試験では、エンジンの主要パス、ロールとスコープの関係、リースの概念が頻出。azure/creds/<role> は read 操作である点、取り消しは lease revoke である点を押さえておきたい。
Associate / Ops
問題 1
Vault の Azure シークレットエンジンで、特定のリソースグループに Contributor を付与した短命の Service Principal を 1 時間だけ発行したい。最も直接的な手順はどれか。
正解: A
Azure シークレットエンジンでは、azure/config で Azure 側クレデンシャルを登録し、azure/roles で role_name と scope、ttl などを定義する。発行は azure/creds/<role> の read 操作で行い、リース付きのクレデンシャルが返る。Key Vault は保管用途であり、AppRole は Vault への認証であって Azure 認証ではない。ttl はロール/リース側で管理するのが正しい。
ロール割当のために Azure 側で必要な権限は何か。
割当対象スコープ(サブスクリプション/リソースグループ/リソース)で Owner または User Access Administrator が必要。加えて、アプリ登録/Service Principal 作成にはディレクトリ側の権限(例: Application Administrator など)が要る。
スコープをリソースグループ単位に限定したい。どう書くか。
azure/roles の azure_roles 配列で scope に完全なリソースIDを指定する。例: /subscriptions/<subId>/resourceGroups/<rgName>。role_name は最小権限のロールを選定する。
証明書ベースの認証情報も発行できるか。
Azure シークレットエンジンの主用途は Service Principal とクライアントシークレットの発行・ライフサイクル管理である。証明書ベース運用を行う場合は、別途の発行・保管フロー(例: Key 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...