<p><!-- META: {"style": "cloud_architect_draft", "target_audience": "enterprise_engineers", "tech_stack": ["azure", "key_vault", "rbac", "bicep", "cli"]} -->
本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">Azure Key VaultのRBAC移行:大規模環境・複数チーム運用を支えるアクセス制御基盤の構築</h1>
<h2 class="wp-block-heading">【導入】</h2>
<p>従来のアクセス制御ポリシーからAzure RBACへ移行し、複数チーム・大規模環境における最小権限の原則と統合管理を実現します。</p>
<h2 class="wp-block-heading">【アーキテクチャ設計】</h2>
<p>Azure Key Vaultのアクセスモデルを従来の「保管庫アクセス ポリシー(Vault-level Access Policies)」から「Azure RBAC(Role-Based Access Control)」へ移行することで、Microsoft Entra IDに基づく一元的なIdentity and Access Management(IAM)統制が可能になります。</p>
<p>従来のアクセスポリシーでは保管庫全体(Vaultレベル)に対してしか権限を付与できず、シークレットごとの個別制御や管理権限の委任が困難でした。Azure RBACモデルを採用することにより、管理プレーンとデータプレーンの権限分離を明確化し、リソースグループ、個別Key Vault、さらには特定のシークレット/キー/証明書単位(オブジェクトレベル)での細粒度なアクセス制御が実現します。</p>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph TD
subgraph EntraID["Microsoft Entra ID("Identity Platform")"]
UserGroup["App Dev Team (Group)"]
WorkloadID["App Managed Identity"]
AdminGroup["Security Admin (Group)"]
end
subgraph Scope["Azure Resource Management Scope"]
subgraph RG["Resource Group: rg-app-prod"]
KV["Azure Key Vault("RBAC Enabled")"]
subgraph DataPlane["Data Plane Objects"]
Sec1["Secret: DB-Conn-String"]
Sec2["Secret: API-Key"]
end
end
end
AdminGroup -->|Key Vault Administrator| KV
UserGroup -->|Key Vault Secrets Officer| Sec2
WorkloadID -->|Key Vault Secrets User| Sec1
KV --- DataPlane
</pre></div>
<p>構成要素の役割と相互作用は以下の通りです。</p>
<ul class="wp-block-list">
<li><p><strong>Microsoft Entra ID</strong>: ユーザー、グループ、マネージドアイデンティティ(Workload ID)の認証基盤。PIM(Privileged Identity Management)と連携したジャストインタイムアクセスを提供します。</p></li>
<li><p><strong>管理プレーン(Management Plane)</strong>: Key Vaultリソース自体の作成、更新、削除、ネットワークルールの変更を行います(<code>Microsoft.KeyVault/vaults/*</code>)。</p></li>
<li><p><strong>データプレーン(Data Plane)</strong>: Vault内部のキー、シークレット、証明書の読み取り、書き込み、暗号化処理を実行します(<code>Microsoft.KeyVault/vaults/secrets/*</code> 等)。</p></li>
</ul>
<h2 class="wp-block-heading">【実装・デプロイ手順】</h2>
<p>移行手順は「既存アクセス権の調査」「RBAC有効化とロール割り当て(IaC)」「動作確認」の順で進めます。</p>
<h3 class="wp-block-heading">1. BicepによるKey VaultのRBAC移行構成</h3>
<p>Key Vaultのプロパティ <code>enableRbacAuthorization</code> を <code>true</code> に設定してデプロイします。</p>
<pre data-enlighter-language="generic">@description('デプロイ先のロケーション')
param location string = resourceGroup().location
@description('Key Vault名')
param keyVaultName string = 'kv-app-prod-eastasia-01'
@description('開発チームグループのPrincipal ID')
param devGroupPrincipalId string
// Key Vaultの定義(RBAC有効化)
resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' = {
name: keyVaultName
location: location
properties: {
sku: {
family: 'A'
name: 'standard'
}
tenantId: subscription().tenantId
enableRbacAuthorization: true // Azure RBACを有効化
enableSoftDelete: true
softDeleteRetentionInDays: 90
publicNetworkAccess: 'Disabled'
}
}
// 組み込みロール定義ID: Key Vault Secrets User
var secretsUserRoleId = '46330053-77cd-44a1-b563-f83d37468945'
// 特定のシークレットに対するロール割り当て(スコープの限定)
resource secret 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
parent: keyVault
name: 'DatabaseConnectionString'
properties: {
value: 'Server=tcp:sql.database.windows.net;Database=appdb;'
}
}
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(keyVault.id, devGroupPrincipalId, secretsUserRoleId)
scope: secret
properties: {
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', secretsUserRoleId)
principalId: devGroupPrincipalId
principalType: 'Group'
}
}
</pre>
<h3 class="wp-block-heading">2. Azure CLIによる移行コマンド</h3>
<p>既存のKey Vaultのアクセスポリシーを無効化し、RBACモデルへ切り替えます。</p>
<div class="codehilite">
<pre data-enlighter-language="generic">#!/bin/bash
RESOURCE_GROUP="rg-app-prod"
VAULT_NAME="kv-app-prod-eastasia-01"
DEV_GROUP_ID="<Entra-ID-Group-ObjectID>"
# 1. Key VaultのアクセスモデルをAzure RBACに変更
az keyvault update \
--name $VAULT_NAME \
--resource-group $RESOURCE_GROUP \
--enable-rbac-authorization true
# 2. 開発チームグループへ「Key Vault Secrets User」ロールをキーバルト全体に付与
az role assignment create \
--assignee-object-id $DEV_GROUP_ID \
--assignee-principal-type Group \
--role "Key Vault Secrets User" \
--scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.KeyVault/vaults/$VAULT_NAME"
</pre>
</div>
<h2 class="wp-block-heading">【アイデンティティとセキュリティ】</h2>
<p>Azure RBAC移行に伴い、適切な組み込みロールの選定とアクセス境界の強化を実施します。</p>
<h3 class="wp-block-heading">1. 組み込みRBACロールの設計原則</h3>
<p>用途に応じて最小権限の組み込みロールを選択します。カスタムロールの作成はメンテナンスコストが増加するため、極力組み込みロールを利用します。</p>
<figure class="wp-block-table"><table>
<thead>
<tr>
<th style="text-align:left;">ロール名</th>
<th style="text-align:left;">対象プレーン</th>
<th style="text-align:left;">主な用途</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;"><strong>Key Vault Administrator</strong></td>
<td style="text-align:left;">データプレーン全般</td>
<td style="text-align:left;">セキュリティ管理者(全キー/シークレット/証明書の操作)</td>
</tr>
<tr>
<td style="text-align:left;"><strong>Key Vault Secrets Officer</strong></td>
<td style="text-align:left;">データプレーン(シークレット)</td>
<td style="text-align:left;">CI/CDパイプラインによるシークレットの登録・更新</td>
</tr>
<tr>
<td style="text-align:left;"><strong>Key Vault Secrets User</strong></td>
<td style="text-align:left;">データプレーン(シークレット)</td>
<td style="text-align:left;">アプリケーション(Managed Identity)によるシークレット参照</td>
</tr>
<tr>
<td style="text-align:left;"><strong>Key Vault Crypto User</strong></td>
<td style="text-align:left;">データプレーン(キー)</td>
<td style="text-align:left;">App Service/VM等でのEnvelope Encryption(復号・暗号化)</td>
</tr>
</tbody>
</table></figure>
<h3 class="wp-block-heading">2. アクセス境界と多層防御</h3>
<ul class="wp-block-list">
<li><p><strong>Entra ID PIM (Privileged Identity Management)</strong>: 「Key Vault Administrator」等の上位権限は常時割り当て(Active Assignment)を行わず、申請・承認ベースでの「対象可能(Eligible)」割り当てにします。</p></li>
<li><p><strong>条件付きアクセス(Conditional Access)</strong>: Key Vaultへのデータプレーンアクセスに対し、特権アクセスワークステーション(PAW)やMFA、合致したネットワークIPからの要求のみを許可するポリシーを適用します。</p></li>
<li><p><strong>ネットワークセキュリティ</strong>: <code>publicNetworkAccess: Disabled</code> を設定し、プライベートエンドポイント(Private Link)経由でのみVNet内部からアクセスを許可します。</p></li>
</ul>
<h2 class="wp-block-heading">【運用・コスト最適化】</h2>
<h3 class="wp-block-heading">1. 可観測性(Log Analytics連携)</h3>
<p>データプレーンのアクセスログおよびRBAC拒否イベントを検出するため、診断設定(Diagnostic Settings)を構成します。</p>
<div class="codehilite">
<pre data-enlighter-language="generic"># Log Analyticsワークスペースへの診断設定追加
WORKSPACE_ID=$(az monitor log-analytics workspace show --resource-group rg-ops --workspace-name law-prod --query id -o tsv)
KV_ID=$(az keyvault show --name kv-app-prod-eastasia-01 --query id -o tsv)
az monitor diagnostic-settings create \
--name "ds-keyvault-audit" \
--resource $KV_ID \
--workspace $WORKSPACE_ID \
--logs '[{"categoryGroup": "allLogs", "enabled": true}]' \
--metrics '[{"category": "AllMetrics", "enabled": true}]'
</pre>
</div>
<p>Log AnalyticsでのRBACアクセス拒否(HTTP 403)監視クエリ:</p>
<div class="codehilite">
<pre data-enlighter-language="generic">AzureDiagnostics
| where ResourceProvider == "MICROSOFT.KEYVAULT"
| where ResultSignature == "Forbidden"
| project TimeGenerated, Resource, OperationName, identity_claim_oid_s, clientInfo_s
</pre>
</div>
<h3 class="wp-block-heading">2. コスト最適化(SKU選定)</h3>
<ul class="wp-block-list">
<li><p><strong>Standard SKU</strong>: 大部分のシークレット、ソフトウェア保護キー、証明書の管理に最適です(APIリクエスト1万回あたり約0.03 USD)。</p></li>
<li><p><strong>Premium SKU</strong>: HSM(ハードウェアセキュリティモジュール)保護キー(HSM-protected keys)が必要な場合のみ使用します。HSM保護キーは追加の月額コストが発生するため、要件に応じて厳格に使い分けます。</p></li>
<li><p><strong>APIトランザクション最適化</strong>: アプリケーション側でシークレットのインメモリキャッシュ(例: Azure SDKの自動キャッシュ機構)を有効化し、不要なKey Vaultへのリクエスト頻度を抑えます。</p></li>
</ul>
<h2 class="wp-block-heading">【まとめ】</h2>
<ol class="wp-block-list">
<li><p><strong>アクセスモデル切替に伴う「既存アクセス瞬断」の注意点</strong>
<code>enableRbacAuthorization: true</code> へ変更した瞬間、既存のアクセスポリシーは即座に無効化されます。移行時は事前に対象のユーザーやManaged IdentityへRBACロールを割り当ててからモードを変更してください。</p></li>
<li><p><strong>スコープを限定した細粒度な権限管理の徹底</strong>
Key Vault全体への権限付与(Vault Scope)ではなく、特定のシークレットやキーに対する個別ロール割り当て(Object Scope)を活用し、複数チーム間でのセキュリティ境界を確保してください。</p></li>
<li><p><strong>監査ログの常時監視とPIMの活用</strong>
RBAC移行後はLog Analyticsへ監査ログを出力し、403エラーの監視を行うとともに、管理権限にはEntra ID PIMによるJIT(Just-In-Time)アクセスを導入して特権リスクを低減させてください。</p></li>
</ol>
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
Azure Key VaultのRBAC移行:大規模環境・複数チーム運用を支えるアクセス制御基盤の構築
【導入】
従来のアクセス制御ポリシーからAzure RBACへ移行し、複数チーム・大規模環境における最小権限の原則と統合管理を実現します。
【アーキテクチャ設計】
Azure Key Vaultのアクセスモデルを従来の「保管庫アクセス ポリシー(Vault-level Access Policies)」から「Azure RBAC(Role-Based Access Control)」へ移行することで、Microsoft Entra IDに基づく一元的なIdentity and Access Management(IAM)統制が可能になります。
従来のアクセスポリシーでは保管庫全体(Vaultレベル)に対してしか権限を付与できず、シークレットごとの個別制御や管理権限の委任が困難でした。Azure RBACモデルを採用することにより、管理プレーンとデータプレーンの権限分離を明確化し、リソースグループ、個別Key Vault、さらには特定のシークレット/キー/証明書単位(オブジェクトレベル)での細粒度なアクセス制御が実現します。
graph TD
subgraph EntraID["Microsoft Entra ID("Identity Platform")"]
UserGroup["App Dev Team (Group)"]
WorkloadID["App Managed Identity"]
AdminGroup["Security Admin (Group)"]
end
subgraph Scope["Azure Resource Management Scope"]
subgraph RG["Resource Group: rg-app-prod"]
KV["Azure Key Vault("RBAC Enabled")"]
subgraph DataPlane["Data Plane Objects"]
Sec1["Secret: DB-Conn-String"]
Sec2["Secret: API-Key"]
end
end
end
AdminGroup -->|Key Vault Administrator| KV
UserGroup -->|Key Vault Secrets Officer| Sec2
WorkloadID -->|Key Vault Secrets User| Sec1
KV --- DataPlane
構成要素の役割と相互作用は以下の通りです。
Microsoft Entra ID: ユーザー、グループ、マネージドアイデンティティ(Workload ID)の認証基盤。PIM(Privileged Identity Management)と連携したジャストインタイムアクセスを提供します。
管理プレーン(Management Plane): Key Vaultリソース自体の作成、更新、削除、ネットワークルールの変更を行います(Microsoft.KeyVault/vaults/*)。
データプレーン(Data Plane): Vault内部のキー、シークレット、証明書の読み取り、書き込み、暗号化処理を実行します(Microsoft.KeyVault/vaults/secrets/* 等)。
【実装・デプロイ手順】
移行手順は「既存アクセス権の調査」「RBAC有効化とロール割り当て(IaC)」「動作確認」の順で進めます。
1. BicepによるKey VaultのRBAC移行構成
Key Vaultのプロパティ enableRbacAuthorization を true に設定してデプロイします。
@description('デプロイ先のロケーション')
param location string = resourceGroup().location
@description('Key Vault名')
param keyVaultName string = 'kv-app-prod-eastasia-01'
@description('開発チームグループのPrincipal ID')
param devGroupPrincipalId string
// Key Vaultの定義(RBAC有効化)
resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' = {
name: keyVaultName
location: location
properties: {
sku: {
family: 'A'
name: 'standard'
}
tenantId: subscription().tenantId
enableRbacAuthorization: true // Azure RBACを有効化
enableSoftDelete: true
softDeleteRetentionInDays: 90
publicNetworkAccess: 'Disabled'
}
}
// 組み込みロール定義ID: Key Vault Secrets User
var secretsUserRoleId = '46330053-77cd-44a1-b563-f83d37468945'
// 特定のシークレットに対するロール割り当て(スコープの限定)
resource secret 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
parent: keyVault
name: 'DatabaseConnectionString'
properties: {
value: 'Server=tcp:sql.database.windows.net;Database=appdb;'
}
}
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(keyVault.id, devGroupPrincipalId, secretsUserRoleId)
scope: secret
properties: {
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', secretsUserRoleId)
principalId: devGroupPrincipalId
principalType: 'Group'
}
}
2. Azure CLIによる移行コマンド
既存のKey Vaultのアクセスポリシーを無効化し、RBACモデルへ切り替えます。
#!/bin/bash
RESOURCE_GROUP="rg-app-prod"
VAULT_NAME="kv-app-prod-eastasia-01"
DEV_GROUP_ID="<Entra-ID-Group-ObjectID>"
# 1. Key VaultのアクセスモデルをAzure RBACに変更
az keyvault update \
--name $VAULT_NAME \
--resource-group $RESOURCE_GROUP \
--enable-rbac-authorization true
# 2. 開発チームグループへ「Key Vault Secrets User」ロールをキーバルト全体に付与
az role assignment create \
--assignee-object-id $DEV_GROUP_ID \
--assignee-principal-type Group \
--role "Key Vault Secrets User" \
--scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.KeyVault/vaults/$VAULT_NAME"
【アイデンティティとセキュリティ】
Azure RBAC移行に伴い、適切な組み込みロールの選定とアクセス境界の強化を実施します。
1. 組み込みRBACロールの設計原則
用途に応じて最小権限の組み込みロールを選択します。カスタムロールの作成はメンテナンスコストが増加するため、極力組み込みロールを利用します。
| ロール名 |
対象プレーン |
主な用途 |
| Key Vault Administrator |
データプレーン全般 |
セキュリティ管理者(全キー/シークレット/証明書の操作) |
| Key Vault Secrets Officer |
データプレーン(シークレット) |
CI/CDパイプラインによるシークレットの登録・更新 |
| Key Vault Secrets User |
データプレーン(シークレット) |
アプリケーション(Managed Identity)によるシークレット参照 |
| Key Vault Crypto User |
データプレーン(キー) |
App Service/VM等でのEnvelope Encryption(復号・暗号化) |
2. アクセス境界と多層防御
Entra ID PIM (Privileged Identity Management): 「Key Vault Administrator」等の上位権限は常時割り当て(Active Assignment)を行わず、申請・承認ベースでの「対象可能(Eligible)」割り当てにします。
条件付きアクセス(Conditional Access): Key Vaultへのデータプレーンアクセスに対し、特権アクセスワークステーション(PAW)やMFA、合致したネットワークIPからの要求のみを許可するポリシーを適用します。
ネットワークセキュリティ: publicNetworkAccess: Disabled を設定し、プライベートエンドポイント(Private Link)経由でのみVNet内部からアクセスを許可します。
【運用・コスト最適化】
1. 可観測性(Log Analytics連携)
データプレーンのアクセスログおよびRBAC拒否イベントを検出するため、診断設定(Diagnostic Settings)を構成します。
# Log Analyticsワークスペースへの診断設定追加
WORKSPACE_ID=$(az monitor log-analytics workspace show --resource-group rg-ops --workspace-name law-prod --query id -o tsv)
KV_ID=$(az keyvault show --name kv-app-prod-eastasia-01 --query id -o tsv)
az monitor diagnostic-settings create \
--name "ds-keyvault-audit" \
--resource $KV_ID \
--workspace $WORKSPACE_ID \
--logs '[{"categoryGroup": "allLogs", "enabled": true}]' \
--metrics '[{"category": "AllMetrics", "enabled": true}]'
Log AnalyticsでのRBACアクセス拒否(HTTP 403)監視クエリ:
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.KEYVAULT"
| where ResultSignature == "Forbidden"
| project TimeGenerated, Resource, OperationName, identity_claim_oid_s, clientInfo_s
2. コスト最適化(SKU選定)
Standard SKU: 大部分のシークレット、ソフトウェア保護キー、証明書の管理に最適です(APIリクエスト1万回あたり約0.03 USD)。
Premium SKU: HSM(ハードウェアセキュリティモジュール)保護キー(HSM-protected keys)が必要な場合のみ使用します。HSM保護キーは追加の月額コストが発生するため、要件に応じて厳格に使い分けます。
APIトランザクション最適化: アプリケーション側でシークレットのインメモリキャッシュ(例: Azure SDKの自動キャッシュ機構)を有効化し、不要なKey Vaultへのリクエスト頻度を抑えます。
【まとめ】
アクセスモデル切替に伴う「既存アクセス瞬断」の注意点
enableRbacAuthorization: true へ変更した瞬間、既存のアクセスポリシーは即座に無効化されます。移行時は事前に対象のユーザーやManaged IdentityへRBACロールを割り当ててからモードを変更してください。
スコープを限定した細粒度な権限管理の徹底
Key Vault全体への権限付与(Vault Scope)ではなく、特定のシークレットやキーに対する個別ロール割り当て(Object Scope)を活用し、複数チーム間でのセキュリティ境界を確保してください。
監査ログの常時監視とPIMの活用
RBAC移行後はLog Analyticsへ監査ログを出力し、403エラーの監視を行うとともに、管理権限にはEntra ID PIMによるJIT(Just-In-Time)アクセスを導入して特権リスクを低減させてください。
コメント