Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

管理対象サービスID で簡単にAzure Key Vaultにアクセスする

管理対象サービスID 「 Managed Service Identity (MSI)」というのを使うとAzure Key Vaultへのアクセスが簡単になるので、その備忘録。

MSI(インストーラではありません)は、VMやWebAppsなど各種Azure プラットフォーム(VMやWebAppsなど)でサポートしており、ADと連携しているリソースへのアクセスが簡単になります。

これを有効にしておくと、アプリからKey Vaultへのアクセスすると楽になります。

現時点でPreviewですが以下のパッケージを入れます(とKey Vaultも)

例えばアクセスする側のプログラムは以下。

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をオンにします。構成という汎用度の高いメニュー名なので、よく見失います。

f:id:StateMachine:20180310105153p:plain

これを設定すると、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名を指定します。アクセス許可する範囲は適宜。

f:id:StateMachine:20180310105834p:plain

選択したのち最後に保存します。(よく保存を忘れるので気を付けて)

実行

ここまで設定すると先ほどのアプリが実行できるようになります。

つづく