web-dev-qa-db-ja.com

KeyVaultErrorException:操作が無効なステータスコード「Forbidden」を返しました

AzureでホストされているWebアプリをセットアップして、Azure KeyVaultから設定を読み取ろうとしています。

私はこのガイドに従っています: https://anthonychu.ca/post/secrets-aspnet-core-key-vault-msi/

この例は、設定を使用してKeyVaultからアプリの設定にアクセスする方法を示しています。

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
     .ConfigureAppConfiguration((ctx, builder) =>
     {
         var keyVaultEndpoint = Environment.GetEnvironmentVariable("KEYVAULT_ENDPOINT");
         if (!string.IsNullOrEmpty(keyVaultEndpoint))
         {
             var azureServiceTokenProvider = new AzureServiceTokenProvider();
             var keyVaultClient = new KeyVaultClient(
                 new KeyVaultClient.AuthenticationCallback(
                     azureServiceTokenProvider.KeyVaultTokenCallback));
             builder.AddAzureKeyVault(
                 keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());
         }
     })
    .UseApplicationInsights()
    .UseStartup<Startup>()
    .Build();

KEYVAULT_ENDPOINT環境変数をアプリケーション設定に追加しました。アプリサービスでMSIを有効にし、Key VaultアクセスポリシーからAzureユーザーとアプリケーションを承認しました。

enter image description here

GetおよびList操作の場合:

enter image description here

そして、私は秘密をKey Vaultに追加しました。ローカルで実行すると、シークレットにアクセスできます。

しかし、私のASP .NET Coreサイトは、stdoutログに次のように起動時に失敗します。

Unhandled Exception: Microsoft.Azure.KeyVault.Models.KeyVaultErrorException: Operation returned an invalid status code 'Forbidden'
   at Microsoft.Azure.KeyVault.KeyVaultClient.GetSecretsWithHttpMessagesAsync(String vaultBaseUrl, Nullable`1 maxresults, Dictionary`2 customHeaders, CancellationToken cancellationToken)
   at Microsoft.Azure.KeyVault.KeyVaultClientExtensions.GetSecretsAsync(IKeyVaultClient operations, String vaultBaseUrl, Nullable`1 maxresults, CancellationToken cancellationToken)
   at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.LoadAsync()
   at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.Load()
   at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
   at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
   at Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices(AggregateException& hostingStartupErrors)
   at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
   at Blog.Program.BuildWebHost(String[] args) in D:\a\1\s\[csproj name]\Program.cs:line 22
   at [csproj name].Program.Main(String[] args) in D:\a\1\s\[csproj name]\Program.cs:line 16

デバッグコンソールからSETを呼び出して、MSI_ENDPOINTおよびMSI_SECRET環境変数が存在することを確認しました。 enter image description here

KEYVAULT_ENDPOINT変数も確認できます。

何が間違っているのか、次に何を試すのかについての提案はありますか?ローカルで機能するため、認証の問題である必要がありますが、Azure App Serviceとしてではなく、Key Vaultで承認したAzureユーザーでローカルに認証していると考えています。

12
zola25

危険ですが、セットアップの問題は、KeyValutのアクセスポリシーを作成したときに「承認済みアプリケーション」を有効にしたことです。

スクリーンショットに「アプリケーション+アプリケーション」があるので、それを見ることができます。私は、webappがプリンシパルと認証アプリケーションの両方であるポリシーを作成したと思います。この種はループを作成します。

このセットアップを機能させるには、既存のポリシーを削除して新しいポリシーを作成します。ここでは、プリンシパルのみを選択します。

enter image description here

19
JleruOHeP

この問題を解決するには、「信頼されたMicrosoftサービスを許可する...」を選択したときにすべてが追加されるわけではないため、WebアプリのIPアドレスをファイアウォールに追加する必要がありました。

outbound ips of the web app

Azure Key Vault firewall settings

おかげで: https://azidentity.azurewebsites.net/post/2019/01/03/key-vault-firewall-access-by-Azure-app-services

2
Mark Szabo

使用しているサービスプリンシパルが追加され、実行する操作(キー/シークレットなど)に適切な権限があることを確認してください。

enter image description here

KeyVaultのネットワークアクセスが制限されているかどうかを確認し、これが問題かどうかをテストするために切り替えます。

enter image description here

1
Ralph Willgoss

プリンシパルを選択してWebアプリを追加するだけで、承認済みアプリケーションを選択しないでください enter image description here

1
Viral Jain

環境変数を扱うときに開発システムと実稼働システムが同じように動作しないという問題を以前に見ました。

これらのシナリオで検討する最初の領域は、実稼働システムで環境変数にASPNETCORE_を適切にプレフィックスしたかどうかを確認することです。このプレフィックスは、ASP.NET Core Webホストのデフォルトのプレフィックスです。

| Key                                |  Value                     |
|====================================|============================|
| ASPNETCORE_KEYVAULT_ENDPOINT       |  xxxxxxxxxxxxxxxx          |
| ASPNETCORE_MSI_ENDPOINT**          |  xxxxxxxxxxxxxxxx          |
| ASPNETCORE_MSI_SECRET**            |  xxxxxxxxxxxxxxxx          |

**あなたのコードでは、MSI_ENDPOINTMSI_SECRETを使用しているのを見たことがないことに注意してください。 KEYVAULT_ENDPOINTを使用しているだけです

明示的に別のプレフィックスを設定する場合は、設定を使用してWebホストを初期化するときに、使用するプレフィックスを引数として渡すことができます。

.AddEnvironmentVariables("ASPNETCORE_"); // choose your own prefix here
0
Svek