Azure App ServiceとKey Vaultを連携させて、秘密の情報を安全に管理するには、「マネージドID」を利用する必要がある。2種類のマネージドIDのうち、より便利な「ユーザー割り当てマネージドID」の作り方や注意点を説明する。
対象: ユーザー割り当てマネージドID
Azureの「App Service」では、APIキーや暗号化パスワード、電子証明書の秘密鍵といった秘密にすべき情報を「Key Vault」に保存しつつ、App Serviceのデプロイ時に自動でKey Vaultからそれらをインポートできる。これにより、秘密の情報を安全に保存しつつ、情報の更新を自動化するといった運用の効率化も可能になる。
ただ、App ServiceをKey Vaultと連携させるには、App Service固有のIDである「マネージドID」を有効にする必要がある。
そのマネージドIDのうち、手軽に始められる「システム割り当てマネージドID」だけを利用している人も多いのではないだろうか? 実は、状況によっては、もう1つの「ユーザー割り当てマネージドID」の方が推奨されることがあるのだ。
そこで本Tech TIPSでは、このユーザー割り当てマネージドIDの作り方とその注意点について説明する。
「システム割り当てマネージドID」は、App Serviceなどの特定リソースにひも付く固有のIDで、デプロイ後に有効化できる(ARMテンプレート/Bicepでデプロイ時に自動で有効化することは可能)。App Serviceを削除すると、そのシステム割り当てマネージドIDも自動的に削除される。設定項目はほとんどないので、使い始めるのは簡単だ。
一方、「ユーザー割り当てマネージドID」は、Microsoft Entra IDで事前に作成しておき、それをApp Serviceなどのリソースに割り当てる必要がある。
機能面での両者の大きな違いは、リソースのデプロイ前あるいはデプロイの最中に利用できるかどうかだ。システム割り当てマネージドIDはデプロイ後にしか利用できない。一方、ユーザー割り当てマネージドIDなら、デプロイ前でもデプロイ中でも他のリソースへのアクセスなどに利用できる。
また、同じようなリソースを複数作成する場合、システム割り当てマネージドIDだと個々のリソースごとにロール割り当てなどを管理する必要がある。ユーザー割り当てマネージドIDなら、そのIDにロールを割り当てるといった管理をするだけで、ひも付けた複数のリソース全てに設定を反映できるため、管理の手間を省ける。
両者の使い分けの詳細は、Microsoft Learnの「マネージド ID のベスト プラクティスに関する推奨事項」を参照していただきたい。
いずれにせよシステム割り当てマネージドIDだけを使っているなら、状況によってはユーザー割り当てマネージドIDに切り替えた方がメリットがある、ということだ。それに、ユーザー割り当てマネージドIDの作成は決して難しくない。
さてここからは、実際にユーザー割り当てマネージドIDを作成する手順について説明する。
Azureポータルの場合、ユーザー割り当てマネージドIDは以下のように「マネージドID」ページから作成できる。
注意すべき点としては、リソース名(名前)を24文字以内にしなければならないことが挙げられる(これは他の手段でも同じ)。筆者は、他のリソースで区切り文字に使っているハイフンを取り除いて、英数字のみで指定している。
ユーザー割り当てマネージドIDに固有の設定項目としては、「分離スコープ」がある。これについては後で説明する。
ARMテンプレート/Bicepでユーザー割り当てマネージドIDをデプロイする場合、リソース名やリージョン(ロケーション)、タグの他に設定可能な項目はない。そのため、以下のように非常にシンプルなコードで済む。
param resourceName string // ユーザー割り当てマネージドIDのリソース名
param location string = resourceGroup().location
// リソース生成: ユーザー割り当てマネージドID(User Assigned Managed Identity)
resource userAssignedManagedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2025-01-31-preview' = {
name: resourceName
location: location
// 分離スコープはAzureポータルかREST APIでしか設定できないので、ここでは未設定
}
PowerShellの場合、ユーザー割り当てマネージドIDは「New-AzUserAssignedIdentity」コマンドレットで作成できる。
New-AzUserAssignedIdentity -Name <リソース名> -ResourceGroupName <リソースグループ名> -Location <リージョン名>
Azure CLIの場合、ユーザー割り当てマネージドIDは「az identity create」コマンドで作成できる。
az identity create -n <リソース名> -g <リソースグループ名> -l <リージョン名>
ユーザー割り当てマネージドIDで注意が必要なのは、「分離スコープ」(Isolation Scope)の設定方法である。分離スコープとは、ユーザー割り当てマネージドIDとその割り当て先のリソースを同じリージョン内に限定する、という機能だ。
App ServiceとKey Vaultとの連携を例に挙げてみる。あるユーザー割り当てマネージドIDの分離スコープを有効にした場合、そのIDと同じリージョン内にあるApp Serviceだけに割り当てられる(他のリージョンのApp Serviceには割り当てられない)。
一方、アクセス先であるKey Vaultについては、アクセスさえ許可されていれば、どのリージョンに存在していてもApp Serviceと連携できる。
分離スコープを有効にすると、複数のリージョンでのID濫用を防止できることから、耐障害性やセキュリティを向上できる、というメリットがある。詳細はMicrosoft Learnの「ユーザー割り当てマネージド ID の分離スコープ」を参照していただきたい。
それならば積極的に分離スコープは有効化したいところだ。しかし、分離スコープはデフォルトで無効化されるので、明示的に有効化する必要がある。
ところが、執筆時点で分離スコープを設定できるのは、次の2種類の方法/タイミングに限られる。
つまり、作成後にAzureポータルから設定を変更したり、ARMテンプレート/Bicepでデプロイ時に有効化したり、といったことができない。
Azureポータルで対話的に設定するのは自動化という点で何かと不自由だ。そこで、PowerShellで分離スコープを有効化する方法を紹介しよう。
といっても、対象のユーザー割り当てマネージドIDの管理が許可されているユーザーアカウントでAzureにサインインした状態で、以下のように「Invoke-AzRestMethod」コマンドレットを実行するだけだ(言うまでもなく、対象と同じテナント/サブスクリプションがデフォルトで選択されている必要がある)。
$ResourceGroupName = '<ユーザー割り当てマネージドIDのリソースグループ名>'
$Name = '<ユーザー割り当てマネージドIDのリソース名>'
$ParamsRestAPI = @{
ResourceGroupName = $ResourceGroupName
Name = $Name
ResourceProviderName = 'Microsoft.ManagedIdentity' # マネージドIDのプロバイダ
ResourceType = 'userAssignedIdentities' # 種別はユーザー割り当てID
ApiVersion = '2025-01-31-preview' # APIのバージョン
Payload = '{
"properties": {
"isolationScope": "Regional" # 分離スコープを有効化。「None」なら無効化
}
}'
Method = 'PATCH'
}
Invoke-AzRestMethod @ParamsRestAPI # 上記のパラメーターでREST APIを呼び出し
Get-AzUserAssignedIdentity -ResourceGroupName $ResourceGroupName -Name $Name # 確認
ARMテンプレート/Bicepなどでユーザー割り当てマネージドIDをデプロイした直後、上記のコードも実行するように記述すれば、分離スコープの有効化も含めて自動化できるだろう。
作成したユーザー割り当てマネージドIDを利用するには、ロールの割り当てやApp Serviceなどのリソースへのひも付けなどが必要になる。それらについては別途解説したい。
■関連リンク
Copyright© Digital Advantage Corp. All Rights Reserved.