管理対象サービスID 「 Managed Service Identity (MSI)」というのを使うとAzure Key Vaultへのアクセスが簡単になるので、その備忘録。
MSI(インストーラではありません)は、VMやWebAppsなど各種Azure プラットフォーム(VMやWebAppsなど)でサポートしており、ADと連携しているリソースへのアクセスが簡単になります。
これを有効にしておくと、アプリからKey Vaultへのアクセスすると楽になります。
現時点でPreviewですが以下のパッケージを入れます(とKey Vaultも)
- NuGet Gallery | Microsoft.Azure.Services.AppAuthentication 1.1.0-preview
- NuGet Gallery | Microsoft.Azure.KeyVault 2.3.2
例えばアクセスする側のプログラムは以下。
var azureServiceTokenProvider = new AzureServiceTokenProvider(); var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback)); var keys = client.GetKeysAsync("https://hogekeyvault.vault.azure.net/").Result; foreach(var key in keys) { Debug.WriteLine(key.Kid); }
Tokenとってきて、Key Vaultに投げてアクセスさえてもらうという感じになりますが、VMに何も設定してないと当然エラーになるわけですが。
VM側の設定
構成から管理対象サービスIDをオンにします。構成という汎用度の高いメニュー名なので、よく見失います。
これを設定すると、ADにこのVMのサービスプリンシパルが登録されます。そして(というこもともと)、localhostに以下のリクエストを投げるとTokenが取得できるようになります。
Invoke-WebRequest -Uri http://localhost:50342/oauth2/token -Method GET -Body @{resource="https://vault.azure.net"} -Headers @{Metadata="true"}
このTokenをKey Vaultに投げて承認してもらうと、Key Vaultへのアクセスが可能になるわけです。
Key Vaultの設定
アクセスポリシーからアクセスポリシーを追加します。プリンシパルには、VM名を指定します。アクセス許可する範囲は適宜。
選択したのち最後に保存します。(よく保存を忘れるので気を付けて)
実行
ここまで設定すると先ほどのアプリが実行できるようになります。
つづく