Azure 函数 - 保护对存储帐户的访问

Azure Function - securing access to storage account

在我的 Azure 函数中,我使用 IBinder 将文件写入 blob 存储。我在 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);
        }

更新:

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需要在环境变量中设置。

在本地,需要在local.settings.json的Values部分设置:

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

在azure上,需要在配置设置里设置。

原答案:

是的,AzureWebJobsStorage 是 azure 函数的 built-in 所需值。它用于某些触发器 运行。当你将函数应用部署到Azure时,它也被用来存储函数应用的数据。

您必须保留此值,否则函数应用程序将损坏。(您需要它来存储函数应用程序文件、日志和许多其他内容。)

So is there a point in assigning Managed Identity to this Function even if I will still have to keep this connection string?

使用托管身份仍然有意义。因为每次要处理的存储和存储Function日志和文件的存储不一定相同。

当我们要处理存储时,总是需要告诉Azure我们可以访问某个资源。该函数一般通过基本验证,即提供连接字符串。此方法不安全,因为连接字符串将暴露在代码或配置中。 MSI 是个好方法。当不使用基本身份验证时,我们可以使用 MSI 来避免在代码或配置中显式存储连接字符串以确保安全。

AzureWebJobsStorage 是设计期间的 built-in 值,必须提供。这是函数应用程序所必需的。 AzureWebJobsStorage 与您对 MSI 的使用无关。一般情况下,我们可能不会访问同一个存储。 MSI允许我们通过service principal和RBAC role获取对应存储的各种权限。