Функция Azure — защита доступа к учетной записи хранилища

#azure-functions #azure-managed-identity

#azure-функции #azure-managed-identity

Вопрос:

В моей функции Azure я использую IBinder для записи файлов в хранилище больших двоичных объектов. У меня есть строка подключения AzureWebJobsStorage , содержащая имя учетной записи и ключ. Я планировал изменить эту функцию, чтобы использовать управляемую идентификацию и использовать ее для доступа к учетной записи хранилища с ее помощью. Но, похоже, что эта строка подключения используется Azure для хранения некоторых данных функции, и я не могу ее изменить или удалить. Итак, есть ли смысл назначать управляемую идентификацию этой функции, даже если мне все равно придется сохранить эту строку подключения?

 public async Task<IActionResult> ReceiveEmail([HttpTrigger(AuthorizationLevel.Function, "post")]
     HttpRequestMessage req,
     IBinder binder,
     [ServiceBus("%responseQueueName%", Connection = "SbConnString")] ICollector<Message> outMessages)
     {
        ...
        using (var outputStream = await binder.BindAsync<Stream>(new BlobAttribute(emailFileLocation, FileAccess.Write)))
        {
            await inputStream.CopyToAsync(outputStream);
        }
  

Ответ №1:

Обновить:

 using (var outputStream = await binder.BindAsync<Stream>(new BlobAttribute("test/20201023.txt", FileAccess.Write) { Connection="str"}))
{
      await req.Body.CopyToAsync(outputStream);
}
return new OkObjectResult("This is a test.");
  

str необходимо установить в переменной среды.

Для локального вам необходимо установить его в Values разделе local.settings.json:

 {
    "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "str": "DefaultEndpointsProtocol=https;AccountName=0730bowmanwindow;AccountKey=xxxxxx;EndpointSuffix=core.windows.net"
  }
}
            
  

В Azure это необходимо было установить в настройках конфигурации.

Оригинальный ответ:

Да, AzureWebJobsStorage это встроенное необходимое значение функции Azure. Она использовалась для запуска некоторых триггеров. При развертывании функционального приложения в Azure оно также будет использоваться для хранения данных функционального приложения.

Вы должны сохранить это значение, иначе приложение функции не будет работать.(Это необходимо для хранения файлов приложения функции, журналов и многого другого.)

Итак, есть ли смысл назначать управляемую идентификацию этой функции, даже если мне все равно придется сохранить эту строку подключения?

По-прежнему имеет смысл использовать идентификатор хостинга. Поскольку хранилище, подлежащее обработке, и хранилище для хранения журналов и файлов функций не обязательно совпадают каждый раз.

Когда мы хотим иметь дело с хранилищем, нам всегда нужно сообщать Azure, что у нас есть доступ к определенному ресурсу. Функция обычно проходит базовую проверку, то есть предоставляет строку подключения. Этот метод небезопасен, поскольку строка подключения будет доступна в коде или конфигурации. MSI — хороший способ. Когда базовая аутентификация не используется, мы можем использовать MSI, чтобы избежать явного сохранения строки подключения в коде или конфигурации для обеспечения безопасности.

Значение AzureWebJobsStorage является встроенным значением при проектировании и должно быть предоставлено. Это требуется для функционального приложения. AzureWebJobsStorage не имеет никакого отношения к использованию MSI. При обычных обстоятельствах мы не можем посещать одно и то же хранилище. MSI позволяет нам получать различные разрешения на соответствующее хранилище через участника службы и роль RBAC.

Комментарии:

1. Но если я использую IBinder, разве ему не нужен AzureWebJobsStorage? Я не вижу способа указать, какую строку conn использовать при использовании IBinder.

2. И самое главное. Строка подключения по-прежнему отображается на портале и используется моим приложением, поэтому, если она скомпрометирована, она может ее пропустить?

3. 1, But if Im using IBinder doesnt it need AzureWebJobsStorage? Если вы не укажете строку подключения, по умолчанию будет использоваться AzureWebJobsStorage. Но вы можете указать строку подключения при создании атрибута BlobAttribute. (Пожалуйста, проверьте класс BlobAttribute.) Это не MSI auth, я думаю, вам нужно написать логику MSI auth в вашем коде. Взгляните на ссылку на api: learn.microsoft.com/en-us/dotnet/api /…

4. 2, Connection string is still visible in portal and used by my app so if it's compromised it can leak it? Да, для этого момента, о котором вы беспокоитесь, обычной практикой является указание этой строки подключения на sercret из keyvault. Это позволяет избежать доступа постороннего персонала.

5. это можно сделать даже для AzureWebJobsStorage ? Я могу указать на KeyVault?