Соединение BlobTrigger с функцией Azure из KeyVault - PullRequest
0 голосов
/ 29 апреля 2018

Сводка: Могу ли я использовать KeyVault для предоставления функции строку подключения для привязки хранилища BLOB-объектов?

Недавно я переместил все свои строки подключения и секреты из настроек приложения-функции Azure в KeyVault. Это включает строки подключения к различным учетным записям хранения, на которые я ссылаюсь. Сейчас я работаю над привязкой хранилища BLOB-объектов Azure, но кажется ( для документов ), что все способы ссылки на строку подключения разрешаются на уровне приложения.

Я бы хотел, чтобы не было этого секрета в двух разных местах. Есть ли способ указать строку подключения учетной записи хранения аля KeyVault?

Ответы [ 3 ]

0 голосов
/ 02 августа 2018

Я могу быть по другому, но я думаю, что согласен с @ThatCreole, потому что это боль. Централизованная настройка и удаление секретов из развернутого кода - это не только то, где вы заменяете его в своем конвейере CI / CD. Если файловая система будет скомпрометирована, доступ к файлам конфигурации позволит еще больше скомпрометировать вашу инфраструктуру. С Azure у нас есть возможность использовать Managed Service Identity, которая создает доверие на базовом оборудовании с работающей системой и активным каталогом Azure. Это устраняет необходимость хранить какие-либо секреты в конфигурациях в любой точке, включая те, которые используются для доступа к хранилищу ключей. Функции Azure могут использовать это, но это помогает только во время запуска / выполнения приложения. Триггер все еще используется для запуска функции и даже для достижения этой точки, что вызывает небольшую поверхность экспонирования.

Единственный бит, который мне удалось сделать, - это создать RBAC для триггера, который чрезвычайно ограничен в своем наборе разрешений. Добавьте это как триггер в функцию, а затем загрузите расширенное разрешение RBAC через хранилище ключей при запуске. Это неудачный обходной путь, но я не вижу другого способа сделать это, поддерживая безопасность наших систем.

0 голосов
/ 08 октября 2018

Я создал пакет nuget, который интегрирует Azure KeyVault в функции Azure с поддержкой строк подключения и так далее. На самом деле это теперь возможно с помощью функции Azure v2, поскольку она использует Microsoft.Extensions.Configuration внутренне. Мы можем использовать это и расширить конфигурацию с помощью Azure Key Vault. Для этого вам необходимо создать класс WebJobsStartup, получить IConfiguration от поставщика услуг WebjobsBuuder и дополнительно создать его с помощью Azure KeyVault.

static IWebJobsBuilder AddAzureKeyVault(this IWebJobsBuilder builder, 
    Func<ConfigurationBuilder, IKeyVaultClient> configure)
{
    var configurationBuilder = new ConfigurationBuilder();
    var descriptor = builder.Services.FirstOrDefault(d => d.ServiceType == typeof(IConfiguration));
    if (descriptor?.ImplementationInstance is IConfigurationRoot configuration)
    {
        configurationBuilder.AddConfiguration(configuration);
    }

    configurationBuilder.AddAzureKeyVault(....);

    var config = configurationBuilder.Build();
    builder.Services.Replace(ServiceDescriptor.Singleton(typeof(IConfiguration), config));
    return builder;
}

Вы можете найти источник для этого в https://github.com/BorisWilhelms/azure-function-keyvault.

0 голосов
/ 30 апреля 2018

Если вы спрашиваете, можете ли вы сделать следующее:

[FunctionName("ResizeImage")]
public static void Run(
   [BlobTrigger("sample-images/{name}", Connection = "StorageConnectionAppSetting")] Stream image, 
   [Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageSmall)
{
   ....
}

И затем сохранение StorageConnectionAppSetting, чтобы оно указывало на экземпляр KeyVault (и не легко доступную строку подключения), тогда я боюсь, что в настоящее время это невозможно.

Конечно, можно получить строку подключения вручную, например:

var azureServiceTokenProvider = new AzureServiceTokenProvider();
var kvClient = new KeyVaultClient(new  KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback), client);                
string blobConectionString = (await 
kvClient.GetSecretAsync("some"secret")).Value;

А затем подключиться к Blob «вручную» (чтобы привязка не использовалась), но я думаю, это может быть бесполезным для вас.

Другой вопрос - зачем хранить строку подключения в КВ? Это потому, что вы боитесь, что кто-то посмотрит на него, когда хранится в настройках приложения функционального приложения? Или это потому, что вы не хотите хранить его в своем конвейере CI / CD?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...