Azure App ServiceでKeyVaultからSecretを取得する方法

基本的に https://docs.microsoft.com/ja-jp/azure/key-vault/tutorial-net-create-vault-azure-web-app の記載通りにやれば、権限を与えられたApp ServiceからKeyVaultに保存したSecretを取得することは可能です。

ここでは、各種設定で利用する値は以下の通りとします。

パラメータ名
リソースグループ名 MyGroup
ロケーション Japan East
KeyVault名 MyVault
Secret名 AppSecret
Secret値 MySecret

Azure CLI で実行するときに、コピペで行けるように環境変数にセットしておきます。

export RG_NAME="MyGroup"
export LOCATION="Japan East"
export KV_NAME="MyVault"
export SEC_NAME="AppSecret"
export SEC_VAL="MySecret"
export APP_NAME="MyApp"

リソースグループの作成

az group create --name $RG_NAME --location $LOCATION

KeyVaultの作成

az keyvault create --name $KV_NAME --resource-group $RG_NAME --location $LOCATION

キーコンテナにシークレットを追加

az keyvault secret set --vault-name $KV_NAME --name $SEC_NAME --value $SEC_VAL

値が正しく設定されていることを確認します。

az keyvault secret show --name $SEC_NAME --vault-name $KV_NAME

KeyVaultから値を取得するアプリケーションの実装

ここでは、C# を利用して Azure Function のアプリケーションを作成します。 完全なアプリケーションは https://docs.microsoft.com/ja-jp/azure/key-vault/tutorial-net-create-vault-azure-web-app#open-and-edit-the-solution を参照してください。

  • AzureServiceTokenProvider - トークンをメモリ内にキャッシュし、有効期限の直前に Azure AD から取得します。
  • KeyVaultClient - Key Vaultサービスに対して暗号化キー操作とボールト操作を実行するクライアントクラス

トークンを保持するインスタンスを生成します。

AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();

KeyVaultClientインスタンスを生成します。

KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));

KeyVaultのURLを指定して、シークレットを取得します。 KeyVault名とシークレット名は、自分の環境に合わせて編集します。

var secret = await keyVaultClient.GetSecretAsync("https://<KeyVault名>.vault.azure.net/secrets/<シークレット名>").ConfigureAwait(false);
Message = secret.Value;

アプリケーションをAzureにデプロイします。

KeyVaultのポリシーを設定

アプリケーションがKeyVaultからSecretを取得できるようにします。

デプロイしたアプリケーションのアプリケーションIDを生成します。

az webapp identity assign --name $APP_NAME --resource-group $RG_NAME

コマンドの実行結果として、アプリケーションID(principalId)が出力されます。

{
  "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "type": "SystemAssigned",
  "userAssignedIdentities": null
}

アプリケーションにKeyVaultへのアクセス(get, list)を許可します。

export SP_ID=<コマンドで出力された principalId>

az keyvault set-policy --name $KV_NAME --object-id $SP_ID --secret-permissions get list

アプリケーションを実行すると、KeyVaultからSecretが取得できます。