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が取得できます。