首页 > 解决方案 > Azure Function - 保护对存储帐户的访问

问题描述

在我的 Azure 函数中,我IBinder用于将文件写入 blob 存储。我有AzureWebJobsStorage包含帐户名和密钥的连接字符串。我计划将此功能更改为使用托管标识并使用它来访问存储帐户。但似乎 Azure 使用此连接字符串来存储一些 Function 数据,我无法更改或删除它。那么即使我仍然必须保留这个连接字符串,将托管标识分配给这个函数有什么意义吗?

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);
        }

标签: azure-functionsazure-managed-identity

解决方案


更新:

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

在本地,您需要在Valueslocal.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 时,它​​还用于存储函数应用的数据。

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

那么即使我仍然必须保留这个连接字符串,将托管标识分配给这个函数有什么意义吗?

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

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

AzureWebJobsStorage 是设计期间的内置值,必须提供。这是函数应用程序所必需的。AzureWebJobsStorage 与您使用 MSI 无关。一般情况下,我们可能不会访问同一个存储。MSI 允许我们通过服务主体和 RBAC 角色获得对应存储的各种权限。


推荐阅读