<p><!--META
{
"title": "Azure Key VaultとManaged Identityによるセキュアなシークレット管理",
"primary_category": "クラウド>Azure",
"secondary_categories": ["セキュリティ", "DevOps"],
"tags": ["Azure Key Vault", "Managed Identity", "Azure CLI", "Azure AD", "RBAC", "Entra ID", "シークレット管理"],
"summary": "Azure Key VaultとManaged Identityを活用したセキュアなシークレット管理のアーキテクチャ、設定、運用、コスト、注意点を解説。",
"mermaid": true,
"verify_level": "L0",
"tweet_hint": {"text":"Azure Key VaultとManaged Identityでアプリケーションのシークレット管理を劇的に改善。アーキテクチャ、設定、運用、コスト最適化までクラウドアーキテクトが解説。 #Azure #KeyVault #ManagedIdentity"},
"link_hints": ["https://learn.microsoft.com/ja-jp/azure/key-vault/general/overview", "https://learn.microsoft.com/ja-jp/azure/active-directory/managed-identities-azure-resources/overview"]
}
-->
本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">Azure Key VaultとManaged Identityによるセキュアなシークレット管理</h1>
<p>クラウドアプリケーションにおいて、データベース接続文字列、APIキー、証明書といったシークレット情報の管理はセキュリティ上極めて重要です。Azure Key Vaultはこれらのシークレットを安全に保管し、Azure Managed Identityと組み合わせることで、アプリケーションからの安全なアクセスを実現します。これにより、コード内にシークレットをハードコードしたり、構成ファイルに平文で保存したりするリスクを排除し、セキュリティ体制を大幅に強化できます。</p>
<h2 class="wp-block-heading">アーキテクチャ</h2>
<p>Azure Key VaultとManaged Identityを組み合わせた基本的なアーキテクチャは以下のフローで構成されます。アプリケーションは自身のマネージドIDを介してAzure Entra ID(旧 Azure Active Directory)で認証され、Key Vaultへのアクセス権限を取得します。これにより、アプリケーションが直接シークレットを知ることなく、安全に取得できるようになります。</p>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
flowchart TD
A["Azure Application"]|認証要求| -- Azure Entra ID --> B("Managed Identity")
B -- アクセストークン取得 --> C("Azure Entra ID")
C -- アクセストークン返却 --> B
B -- |アクセストークン付与| --> D["Azure Key Vault"]
D -- |シークレット取得| --> A
</pre></div>
<p><strong>構成要素:</strong></p>
<ul class="wp-block-list">
<li><p><strong>Azure Application (A):</strong> Azure App Service, Azure Functions, Azure VM, Azure Container Appsなど、マネージドIDをサポートするあらゆるAzureサービス。</p></li>
<li><p><strong>Managed Identity (B):</strong> Azure Entra IDによって管理される、Azureサービス用の自動管理されるID。システム割り当てマネージドIDとユーザー割り当てマネージドIDの2種類があります。</p></li>
<li><p><strong>Azure Entra ID (C):</strong> AzureのIDおよびアクセス管理サービス。マネージドIDの認証、アクセストークンの発行を行います。</p></li>
<li><p><strong>Azure Key Vault (D):</strong> シークレット、キー、証明書を一元的に安全に管理するサービス。FIPS 140-2 Level 2検証済みのHSMで保護されます。</p></li>
</ul>
<h2 class="wp-block-heading">設定手順</h2>
<p>ここでは、Azure App Serviceがシステム割り当てマネージドIDを使用してAzure Key Vaultからシークレットを取得する手順をAzure CLIで示します。</p>
<ol class="wp-block-list">
<li><p><strong>リソースグループの作成</strong></p>
<div class="codehilite">
<pre data-enlighter-language="generic">az group create --name myResourceGroup --location japaneast
</pre>
</div></li>
<li><p><strong>Azure Key Vaultの作成</strong>
Standard SKUで、ソフトデリートとパージ保護を有効にします。</p>
<div class="codehilite">
<pre data-enlighter-language="generic">az keyvault create \
--name myKeyVault12345 \
--resource-group myResourceGroup \
--location japaneast \
--sku Standard \
--enable-soft-delete true \
--enable-purge-protection true
</pre>
</div></li>
<li><p><strong>シークレットの保存</strong></p>
<div class="codehilite">
<pre data-enlighter-language="generic">az keyvault secret set \
--vault-name myKeyVault12345 \
--name myDbConnectionString \
--value "Server=tcp:mydb.database.windows.net,1433;Database=mydb;User ID=user;Password=password;"
</pre>
</div></li>
<li><p><strong>Azure App Serviceの作成とマネージドIDの有効化</strong>
システム割り当てマネージドIDを有効にしてApp Serviceを作成します。</p>
<div class="codehilite">
<pre data-enlighter-language="generic">az appservice plan create \
--name myAppServicePlan \
--resource-group myResourceGroup \
--sku B1 \
--is-linux
az webapp create \
--name myWebApp12345 \
--resource-group myResourceGroup \
--plan myAppServicePlan \
--runtime "DOTNET|6.0" \
--assign-identity # システム割り当てマネージドIDを有効化
</pre>
</div></li>
<li><p><strong>Key Vaultへのアクセス権限付与</strong>
App ServiceのマネージドIDにKey Vaultの「Key Vault シークレットユーザー」ロールを付与します。</p>
<div class="codehilite">
<pre data-enlighter-language="generic"># App ServiceのマネージドIDのプリンシパルIDを取得
PRINCIPAL_ID=$(az webapp identity show --name myWebApp12345 --resource-group myResourceGroup --query principalId --output tsv)
# Key Vaultにロール割り当て
az role assignment create \
--role "Key Vault シークレットユーザー" \
--assignee $PRINCIPAL_ID \
--scope /subscriptions/$(az account show --query id -o tsv)/resourceGroups/myResourceGroup/providers/Microsoft.KeyVault/vaults/myKeyVault12345
</pre>
</div></li>
</ol>
<p>これで、<code>myWebApp12345</code> は自身のマネージドIDを使用して <code>myKeyVault12345</code> から <code>myDbConnectionString</code> シークレットを安全に取得できるようになります。</p>
<h2 class="wp-block-heading">運用監視</h2>
<ul class="wp-block-list">
<li><p><strong>可観測性:</strong> Azure Monitor for Key Vaultは、メトリック(トランザクション数、レイテンシなど)と診断ログを提供します。これらを活用し、Key Vaultへのアクセス状況、エラー発生、レート制限状況を監視します。</p></li>
<li><p><strong>ログ:</strong> Key Vaultの診断設定を有効にし、監査ログ、アクセスログをAzure Log Analytics Workspaceへ送信します。これにより、誰が、いつ、どのシークレットにアクセスしたか、あるいは失敗したかを詳細に追跡できます。</p></li>
<li><p><strong>SLA:</strong> Azure Key Vaultは、99.99%のSLAを提供しており、高可用性が保証されています。</p></li>
<li><p><strong>バックアップとDR:</strong> Key Vault自体はAzureプラットフォームによる冗長性を持っています。ソフトデリートとパージ保護を有効にすることで、偶発的な削除や悪意のある削除からシークレットを保護し、DR戦略の一部とすることができます。これにより、削除されたシークレットを一定期間内に回復可能です。Key Vault自体に対するバックアップ機能はありませんが、必要に応じてシークレットの内容を安全な場所にエクスポート・インポートする運用も検討可能です(ただし、これは推奨されるベストプラクティスではありません)。</p></li>
</ul>
<h2 class="wp-block-heading">セキュリティ</h2>
<ul class="wp-block-list">
<li><p><strong>アイデンティティと権限境界 (Azure Entra ID):</strong></p>
<ul>
<li><p><strong>Managed Identity:</strong> Azure Entra IDによって管理され、リソースに割り当てられたIDであり、パスワード管理が不要です。システム割り当てIDはリソースのライフサイクルに結合し、ユーザー割り当てIDは独立して管理され複数のリソースに割り当て可能です。</p></li>
<li><p><strong>Azure RBAC:</strong> Key Vaultへのアクセス制御はAzureロールベースアクセス制御(RBAC)を使用します。<code>Key Vault シークレットユーザー</code>ロール(シークレットの読み取り)や<code>Key Vault 管理者</code>ロール(シークレットの管理)など、最小権限の原則に基づき必要な権限のみを付与します。Key Vaultのデータプレーンへのアクセスは、Key VaultアクセスポリシーではなくRBACで管理することが推奨されます。</p></li>
<li><p><strong>条件付きアクセス (Conditional Access):</strong> Key Vaultへの管理者アクセス(ポータルやCLIからの管理操作)に対して、多要素認証(MFA)の強制、特定のIP範囲からのアクセス制限、デバイス準拠の要求など、Entra IDの条件付きアクセス ポリシーを適用することで、管理者のセキュリティを強化できます。アプリケーションのマネージドIDはEntra IDで認証されますが、条件付きアクセスはユーザーベースの認証に適用されるため、マネージドIDには直接適用されません。</p></li>
</ul></li>
<li><p><strong>ネットワーク分離:</strong> Azure Private EndpointをKey Vaultに構成することで、仮想ネットワーク内のプライベートIPアドレスを介してのみKey Vaultにアクセスさせ、パブリックインターネットからのアクセスを完全にブロックできます。</p></li>
<li><p><strong>Azure Defender for Key Vault (Microsoft Defender for Cloud):</strong> Key Vaultを保護するためにDefender for Cloudを有効化することで、異常なシークレットアクセスパターン、不審なVault構成変更などの脅威を検出し、アラートを発します。</p></li>
<li><p><strong>暗号化:</strong> Key Vaultに保存されるシークレットは、Azure Key Vaultによって管理されるキーで暗号化されます。プレミアムSKUを選択すれば、FIPS 140-2 Level 2検証済みのハードウェアセキュリティモジュール (HSM) によって保護されたキーを使用できます。</p></li>
</ul>
<h2 class="wp-block-heading">コスト</h2>
<p>Azure Key Vaultのコストは、主に利用するSKUとトランザクション数によって決定されます。</p>
<ul class="wp-block-list">
<li><p><strong>Key Vault SKU:</strong></p>
<ul>
<li><p><strong>Standard:</strong> ソフトウェアキーとシークレットを保護し、トランザクションあたりの料金が発生します。ほとんどの一般的なユースケースに適しています。</p></li>
<li><p><strong>Premium:</strong> HSM(Hardware Security Module)で保護されたキーとシークレットを使用でき、Standardよりも高価です。FIPS 140-2 Level 2の要件がある場合に選択します。</p></li>
</ul></li>
<li><p><strong>トランザクション料金:</strong> キーの作成/取得、シークレットの保存/取得、証明書の操作など、Key Vaultに対する各操作に対して料金が発生します。</p></li>
<li><p><strong>マネージドID:</strong> マネージドID自体には料金は発生しません。</p></li>
<li><p><strong>関連サービス:</strong> 診断ログを送信するLog Analytics Workspace、Private Endpointの料金などが別途発生します。</p></li>
</ul>
<p><strong>コスト最適化:</strong></p>
<ul class="wp-block-list">
<li><p><strong>SKUの適切な選択:</strong> HSMが必要ない場合は、<code>Standard</code> SKUを選択します。</p></li>
<li><p><strong>アクセスパターンの最適化:</strong> 不要なシークレットへのアクセスを減らし、アプリケーションがシークレットをキャッシュするなどの戦略を検討し、トランザクション数を最小限に抑えます。</p></li>
<li><p><strong>モニタリング:</strong> Azure Monitorでトランザクション数を監視し、想定外のコスト増加がないか確認します。</p></li>
<li><p><strong>リザーブドインスタンス/ライセンス:</strong> Key Vaultにはリザーブドインスタンスや、特別なライセンスモデルはありません。</p></li>
</ul>
<h2 class="wp-block-heading">落とし穴</h2>
<ul class="wp-block-list">
<li><p><strong>RBACの不備:</strong> マネージドIDにKey Vaultへの適切なRBACロール(例: <code>Key Vault シークレットユーザー</code>)が割り当てられていないと、シークレットの取得に失敗します。</p></li>
<li><p><strong>ネットワーク設定の誤り:</strong> Private Endpointを使用している場合、VNetからの名前解決が正しく行われているか、またはKey Vaultファイアウォールで送信元IPアドレスが許可されているか確認が必要です。</p></li>
<li><p><strong>パージ保護の無効化:</strong> ソフトデリートは有効でもパージ保護が無効な場合、悪意のあるユーザーがKey Vaultを即座に削除できてしまいます。常に両方を有効にしてください。</p></li>
<li><p><strong>Key Vaultのレート制限:</strong> 大量のシークレットアクセスが発生すると、Key Vaultはレート制限を適用することがあります。アプリケーション側でリトライロジックを実装するか、Key Vaultの利用設計を見直す必要があります。</p></li>
<li><p><strong>シークレットのローテーション戦略の欠如:</strong> シークレットは定期的にローテーションする必要があります。これに対応する自動化されたプロセスがないと、セキュリティリスクが増大します。</p></li>
<li><p><strong>過剰な権限付与:</strong> 最小権限の原則に反して、マネージドIDに必要以上の権限(例: Key Vault管理者)を付与すると、潜在的なセキュリティリスクとなります。</p></li>
</ul>
<h2 class="wp-block-heading">まとめ</h2>
<p>Azure Key VaultとManaged Identityの組み合わせは、Azure上で動作するアプリケーションのシークレット管理において、最も推奨されるベストプラクティスです。このアプローチにより、開発者はシークレット管理の複雑さから解放され、セキュリティチームは一元化されたシークレット管理と監査機能により、堅牢なセキュリティ体制を維持できます。アーキテクチャ設計、設定、運用監視、セキュリティ、コスト最適化の各側面で適切な考慮を行うことで、安全で効率的なクラウド環境を実現できます。</p>
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
Azure Key VaultとManaged Identityによるセキュアなシークレット管理
クラウドアプリケーションにおいて、データベース接続文字列、APIキー、証明書といったシークレット情報の管理はセキュリティ上極めて重要です。Azure Key Vaultはこれらのシークレットを安全に保管し、Azure Managed Identityと組み合わせることで、アプリケーションからの安全なアクセスを実現します。これにより、コード内にシークレットをハードコードしたり、構成ファイルに平文で保存したりするリスクを排除し、セキュリティ体制を大幅に強化できます。
アーキテクチャ
Azure Key VaultとManaged Identityを組み合わせた基本的なアーキテクチャは以下のフローで構成されます。アプリケーションは自身のマネージドIDを介してAzure Entra ID(旧 Azure Active Directory)で認証され、Key Vaultへのアクセス権限を取得します。これにより、アプリケーションが直接シークレットを知ることなく、安全に取得できるようになります。
flowchart TD
A["Azure Application"]|認証要求| -- Azure Entra ID --> B("Managed Identity")
B -- アクセストークン取得 --> C("Azure Entra ID")
C -- アクセストークン返却 --> B
B -- |アクセストークン付与| --> D["Azure Key Vault"]
D -- |シークレット取得| --> A
構成要素:
Azure Application (A): Azure App Service, Azure Functions, Azure VM, Azure Container Appsなど、マネージドIDをサポートするあらゆるAzureサービス。
Managed Identity (B): Azure Entra IDによって管理される、Azureサービス用の自動管理されるID。システム割り当てマネージドIDとユーザー割り当てマネージドIDの2種類があります。
Azure Entra ID (C): AzureのIDおよびアクセス管理サービス。マネージドIDの認証、アクセストークンの発行を行います。
Azure Key Vault (D): シークレット、キー、証明書を一元的に安全に管理するサービス。FIPS 140-2 Level 2検証済みのHSMで保護されます。
設定手順
ここでは、Azure App Serviceがシステム割り当てマネージドIDを使用してAzure Key Vaultからシークレットを取得する手順をAzure CLIで示します。
リソースグループの作成
az group create --name myResourceGroup --location japaneast
Azure Key Vaultの作成
Standard SKUで、ソフトデリートとパージ保護を有効にします。
az keyvault create \
--name myKeyVault12345 \
--resource-group myResourceGroup \
--location japaneast \
--sku Standard \
--enable-soft-delete true \
--enable-purge-protection true
シークレットの保存
az keyvault secret set \
--vault-name myKeyVault12345 \
--name myDbConnectionString \
--value "Server=tcp:mydb.database.windows.net,1433;Database=mydb;User ID=user;Password=password;"
Azure App Serviceの作成とマネージドIDの有効化
システム割り当てマネージドIDを有効にしてApp Serviceを作成します。
az appservice plan create \
--name myAppServicePlan \
--resource-group myResourceGroup \
--sku B1 \
--is-linux
az webapp create \
--name myWebApp12345 \
--resource-group myResourceGroup \
--plan myAppServicePlan \
--runtime "DOTNET|6.0" \
--assign-identity # システム割り当てマネージドIDを有効化
Key Vaultへのアクセス権限付与
App ServiceのマネージドIDにKey Vaultの「Key Vault シークレットユーザー」ロールを付与します。
# App ServiceのマネージドIDのプリンシパルIDを取得
PRINCIPAL_ID=$(az webapp identity show --name myWebApp12345 --resource-group myResourceGroup --query principalId --output tsv)
# Key Vaultにロール割り当て
az role assignment create \
--role "Key Vault シークレットユーザー" \
--assignee $PRINCIPAL_ID \
--scope /subscriptions/$(az account show --query id -o tsv)/resourceGroups/myResourceGroup/providers/Microsoft.KeyVault/vaults/myKeyVault12345
これで、myWebApp12345
は自身のマネージドIDを使用して myKeyVault12345
から myDbConnectionString
シークレットを安全に取得できるようになります。
運用監視
可観測性: Azure Monitor for Key Vaultは、メトリック(トランザクション数、レイテンシなど)と診断ログを提供します。これらを活用し、Key Vaultへのアクセス状況、エラー発生、レート制限状況を監視します。
ログ: Key Vaultの診断設定を有効にし、監査ログ、アクセスログをAzure Log Analytics Workspaceへ送信します。これにより、誰が、いつ、どのシークレットにアクセスしたか、あるいは失敗したかを詳細に追跡できます。
SLA: Azure Key Vaultは、99.99%のSLAを提供しており、高可用性が保証されています。
バックアップとDR: Key Vault自体はAzureプラットフォームによる冗長性を持っています。ソフトデリートとパージ保護を有効にすることで、偶発的な削除や悪意のある削除からシークレットを保護し、DR戦略の一部とすることができます。これにより、削除されたシークレットを一定期間内に回復可能です。Key Vault自体に対するバックアップ機能はありませんが、必要に応じてシークレットの内容を安全な場所にエクスポート・インポートする運用も検討可能です(ただし、これは推奨されるベストプラクティスではありません)。
セキュリティ
アイデンティティと権限境界 (Azure Entra ID):
Managed Identity: Azure Entra IDによって管理され、リソースに割り当てられたIDであり、パスワード管理が不要です。システム割り当てIDはリソースのライフサイクルに結合し、ユーザー割り当てIDは独立して管理され複数のリソースに割り当て可能です。
Azure RBAC: Key Vaultへのアクセス制御はAzureロールベースアクセス制御(RBAC)を使用します。Key Vault シークレットユーザー
ロール(シークレットの読み取り)やKey Vault 管理者
ロール(シークレットの管理)など、最小権限の原則に基づき必要な権限のみを付与します。Key Vaultのデータプレーンへのアクセスは、Key VaultアクセスポリシーではなくRBACで管理することが推奨されます。
条件付きアクセス (Conditional Access): Key Vaultへの管理者アクセス(ポータルやCLIからの管理操作)に対して、多要素認証(MFA)の強制、特定のIP範囲からのアクセス制限、デバイス準拠の要求など、Entra IDの条件付きアクセス ポリシーを適用することで、管理者のセキュリティを強化できます。アプリケーションのマネージドIDはEntra IDで認証されますが、条件付きアクセスはユーザーベースの認証に適用されるため、マネージドIDには直接適用されません。
ネットワーク分離: Azure Private EndpointをKey Vaultに構成することで、仮想ネットワーク内のプライベートIPアドレスを介してのみKey Vaultにアクセスさせ、パブリックインターネットからのアクセスを完全にブロックできます。
Azure Defender for Key Vault (Microsoft Defender for Cloud): Key Vaultを保護するためにDefender for Cloudを有効化することで、異常なシークレットアクセスパターン、不審なVault構成変更などの脅威を検出し、アラートを発します。
暗号化: Key Vaultに保存されるシークレットは、Azure Key Vaultによって管理されるキーで暗号化されます。プレミアムSKUを選択すれば、FIPS 140-2 Level 2検証済みのハードウェアセキュリティモジュール (HSM) によって保護されたキーを使用できます。
コスト
Azure Key Vaultのコストは、主に利用するSKUとトランザクション数によって決定されます。
Key Vault SKU:
トランザクション料金: キーの作成/取得、シークレットの保存/取得、証明書の操作など、Key Vaultに対する各操作に対して料金が発生します。
マネージドID: マネージドID自体には料金は発生しません。
関連サービス: 診断ログを送信するLog Analytics Workspace、Private Endpointの料金などが別途発生します。
コスト最適化:
SKUの適切な選択: HSMが必要ない場合は、Standard
SKUを選択します。
アクセスパターンの最適化: 不要なシークレットへのアクセスを減らし、アプリケーションがシークレットをキャッシュするなどの戦略を検討し、トランザクション数を最小限に抑えます。
モニタリング: Azure Monitorでトランザクション数を監視し、想定外のコスト増加がないか確認します。
リザーブドインスタンス/ライセンス: Key Vaultにはリザーブドインスタンスや、特別なライセンスモデルはありません。
落とし穴
RBACの不備: マネージドIDにKey Vaultへの適切なRBACロール(例: Key Vault シークレットユーザー
)が割り当てられていないと、シークレットの取得に失敗します。
ネットワーク設定の誤り: Private Endpointを使用している場合、VNetからの名前解決が正しく行われているか、またはKey Vaultファイアウォールで送信元IPアドレスが許可されているか確認が必要です。
パージ保護の無効化: ソフトデリートは有効でもパージ保護が無効な場合、悪意のあるユーザーがKey Vaultを即座に削除できてしまいます。常に両方を有効にしてください。
Key Vaultのレート制限: 大量のシークレットアクセスが発生すると、Key Vaultはレート制限を適用することがあります。アプリケーション側でリトライロジックを実装するか、Key Vaultの利用設計を見直す必要があります。
シークレットのローテーション戦略の欠如: シークレットは定期的にローテーションする必要があります。これに対応する自動化されたプロセスがないと、セキュリティリスクが増大します。
過剰な権限付与: 最小権限の原則に反して、マネージドIDに必要以上の権限(例: Key Vault管理者)を付与すると、潜在的なセキュリティリスクとなります。
まとめ
Azure Key VaultとManaged Identityの組み合わせは、Azure上で動作するアプリケーションのシークレット管理において、最も推奨されるベストプラクティスです。このアプローチにより、開発者はシークレット管理の複雑さから解放され、セキュリティチームは一元化されたシークレット管理と監査機能により、堅牢なセキュリティ体制を維持できます。アーキテクチャ設計、設定、運用監視、セキュリティ、コスト最適化の各側面で適切な考慮を行うことで、安全で効率的なクラウド環境を実現できます。
ライセンス:本記事のテキスト/コードは特記なき限り
CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。
コメント