web-dev-qa-db-ja.com

ローカルで実行されているドッカーコンテナーからAzure Keyvaultにアクセスする方法

Azure Key Vaultを使用して接続文字列などにアクセスするASP.NET Coreアプリを含むDockerイメージがあります。イメージをローカルで実行すると、次のエラーが発生します。

Unhandled Exception: Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: Parameters: Connection String: [No connection string specified], Resource: https://vault.Azure.net, Authority: https://login.windows.net/[guid]. Exception Message: Tried the following 3 methods to get an access token, but none of them worked.
Parameters: Connection String: [No connection string specified], Resource: https://vault.Azure.net, Authority: https://login.windows.net/[guid]. Exception Message: Tried to get token using Managed Service Identity. Unable to connect to the Managed Service Identity (MSI) endpoint. Please check that you are running on an Azure resource that has MSI setup.
Parameters: Connection String: [No connection string specified], Resource: https://vault.Azure.net, Authority: https://login.windows.net/[guid]. Exception Message: Tried to get token using Visual Studio. Access token could not be acquired. Environment variable LOCALAPPDATA not set.
Parameters: Connection String: [No connection string specified], Resource: https://vault.Azure.net, Authority: https://login.windows.net/[guid]. Exception Message: Tried to get token using Azure CLI. Access token could not be acquired. /bin/bash: az: No such file or directory

私が理解していることから、最初にアクセストークンをマネージドサービスIDとして取得しようとします。 Azureクラウドで実行されていないため、これを行うことはできず、ビジュアルスタジオ接続サービスを介して取得しようとします。これはDockerイメージにはないため、Azure CLIを使用しようとしますが、Dockerイメージにはインストールされません。

そのため、DockerイメージにAzure CLIをインストールする必要があります。 DockerfileのベースイメージがFROM Microsoft/dotnet:2.1-aspnetcore-runtimeであるとすると、これはどのように行われますか?

このベースイメージはアルパインOSイメージですか?アルパインでAzure CLIをインストールすることを検討する必要がありますか?

Azure CLIがインストールされている場合、Dockerfileソースコードに資格情報を保存したり、プレーンテキストでコンテナーに渡したりせずにKey Vaultにアクセスする方法はありますか?

より一般的には、ここでの最良のアプローチは何ですか。

17
zola25

ソリューション(本番用ではありません)

問題の可能な解決策は、サービスプリンシパル([〜#〜] sp [〜#〜])を生成し、このサービスプリンシパルアクセスを許可することですキーコンテナー(RBACまたはIAM経由)。 [〜#〜] sp [〜#〜]の作成に関するMicrosoftドキュメント

[〜#〜] sp [〜#〜]の認証情報をclient-idおよびclient-secretランダムな例 )次に、ボールトにログインしてシークレットを取得できます。

懸念

  • このアプローチでは、シークレットをコードに導入します(おそらくキーコンテナーを使用する正確な理由)。ローカルのDockerイメージは開発専用です。したがって、別のKevaultを使用しながら、開発のためだけにKeyvaultを作成する(そして[〜#〜] sp [〜#〜]を使用してアクセスする)ことをお勧めします確立された秘密のない認証方式の1つが使用される本番環境。
  • Key VaultでAzureクラウドの外部からのアクセスが許可されていることを確認する必要があります(portal.Azure.comのアクセスポリシーを参照してください)。
4
fox918

これは、Dockerコンテナーがrootユーザーとして実行されており、Key Vaultに登録されているユーザーが他のユーザー([email protected])であるためです。

0
Abhi