web-dev-qa-db-ja.com

Key VaultからAzure Functionsのシークレットを自動的にマップする方法

Azureコンテナーから読み取られる接続文字列からキュートリガーまたはBLOBトリガーを初期化できるかどうか疑問に思っていました。

現在、ブレードのプロパティを介して環境設定を介してこれらのデータ接続を設定する必要があります。ただし、サービスプリンシパルを使用してAzureキーコンテナーのトークンを取得し、これらすべての接続文字列を取得したいと思っていました。

私はこれをJavaで動作させる方法を理解しようとしています。

ありがとう、デレク

6
darewreck

この機能は追跡され、ここで進行中です:

EDIT 28/11/2018:現在プレビュー中です

以前の回答2018年7月10日このソリューションは、消費プランを使用するトリガーに対しては機能しません。

その間、私はあなたの問題についていくつかの調査を行いました、そして、Azure Function v2を使用している場合、キーコンテナーから構成を読み取ることが可能です。

Visual StudioからAzure Functions v2(.NET Standard)を作成しました。

それは使用しています:

  • NETStandard.Library v2.0.3
  • Microsoft.NET.Sdk.Functions v1.0.22
  • Microsoft.Azure.WebJobs v3.0.0
  • Microsoft.Azure.WebJobs.Extensions.Storage v3.0.0

Azure Functions v2はASP.NETコアを使用しているため、このリンクを参照して、Azure Key Vaultを使用するように機能アプリを構成できました。

ASP.NET CoreのAzure Key Vault構成プロバイダー

  1. このnugetパッケージを追加しました:

このnugetパッケージを使用するようにアプリを構成しました。

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Linq;

[Assembly: WebJobsStartup(typeof(FunctionApp1.WebJobsExtensionStartup), "A Web Jobs Extension Sample")]
namespace FunctionApp1
{
    public class WebJobsExtensionStartup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {
            // Gets the default configuration
            var serviceConfig = builder.Services.FirstOrDefault(s => s.ServiceType.Equals(typeof(IConfiguration)));
            var rootConfig = (IConfiguration)serviceConfig.ImplementationInstance;

            // Creates a new config based on the default one and adds the keyvault configuration builder
            var keyvaultName = rootConfig["keyVaultName"];
            var config = new ConfigurationBuilder()
                .AddConfiguration(rootConfig).AddAzureKeyVault($"https://{keyvaultName}.vault.Azure.net/").Build();

            // Replace the existing config
            builder.Services.AddSingleton<IConfiguration>(config);
        }
    }
}

My Azure関数はMSIを使用します。

Azure Functions - Managed Service Identity

Key Vaultの関数アプリにシークレットの読み取り/一覧のアクセス許可を付与しました。

小さなキュートリガー機能があります:

public static class Function2
{
    [FunctionName("Function2")]
    public static void Run([QueueTrigger("%queueName%", Connection = "queueConnectionString")]string myQueueItem, ILogger log)
    {
        log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    }
}

queueNamelocal.settings.jsonファイルで定義されています(展開されたアプリ設定ブレード):

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "keyVaultName": "thomastestkv",
    "queueName": "myqueue"
  }
}

queueConnectionStringはkeyvaultで設定されています:

Azure Key Vault - Secrets

8
Thomas

これは数日前にpreviewとしてリリースされたばかりです。

この機能には、アプリにシステムが割り当てた管理対象IDが必要です。この投稿の後半では、ユーザーが割り当てたIDについて説明しますが、ここではこれらのプレビューを個別に保持します。

次に、アプリケーションにシークレットのGET権限を付与するKey Vaultのアクセスポリシーを構成する必要があります。アクセスポリシーを構成する方法について説明します。

最後に、アプリケーション設定の値を次の形式の参照に設定します。

@ Microsoft.KeyVault(SecretUri = secret_uri_with_version)

ここで、secret_uri_with_versionはKey Vaultのシークレットの完全なURIです。たとえば、次のようになります。 https://myvault.vault.Azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931

関数ランタイム内でKeyvault統合を使用

1
MrBrooks

上記ですでに私の回答を示しましたが、この回答は@Matt Sandersのコメントに対するものです。Azure環境でMSIがどのように機能するかを説明したいだけです。

"2人のユーザーにIDが割り当てられていますが、1人はKeyVaultへのアクセス許可があり、もう1人はそうではありません。シークレットの取得に使用するIDが割り当てられている正しいユーザーを指定するにはどうすればよいですか?回答にリストされていても、ユーザー割り当てIDはサポートされていません。– Matt Sanders "

azure Manage Identity Serviceを使用する場合、アプリケーションはAzure ADに登録する必要があります。たとえば、Webアプリケーションにアクセスしている複数のユーザーが、Webアプリケーション内でvVaultのシークレットにアクセスしようとしているとします。 、ボールトはアプリケーションを使用するユーザーを気にしません。アプリケーションを気にします。

下の画像を参照してください、

enter image description here

画像を表示しているように、Azure FunctionのみがIDとしてボールトに追加され、他のアプリケーションはそうではありません。

したがって、Azure関数を使用するユーザーは誰でもボールトのシークレットにアクセスできます。この例では、シークレットにアクセスできるのはAとBだけです。

私はそれをJava以下の2つの参照に従って実装しました。

  1. https://docs.Microsoft.com/en-us/Azure/app-service/app-service-key-vault-references

  2. https://medium.com/statuscode/getting-key-vault-secrets-in-Azure-functions-37620fd20a0b

Java use System.getenv( "SECRET_KEY")を使用して、アプリの設定から値を読み取ります。

さらにサポートが必要な場合はサポートさせていただきます。

0
T D