【问题标题】:Azure Function - securing access to storage accountAzure Function - 保护对存储帐户的访问
【发布时间】:2020-10-22 13:16:02
【问题描述】:

在我的 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-functions azure-managed-identity


    【解决方案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需要在环境变量中设置。

    在本地,需要在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 函数的内置所需值。它用于一些触发器运行。当你将函数应用部署到 Azure 时,它​​也用于存储函数应用的数据。

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

    那么将托管标识分配给此功能是否有意义 即使我仍然需要保留这个连接字符串?

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

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

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

    【讨论】:

    • 但是如果我使用 IBinder 不需要 AzureWebJobsStorage 吗?我没有看到一种方法来指定使用 IBinder 时要使用的 conn 字符串。
    • 最重要的是。连接字符串在门户中仍然可见并被我的应用程序使用,所以如果它被破坏它可能会泄漏它?
    • 1, But if Im using IBinder doesnt it need AzureWebJobsStorage? 如果不指定连接字符串,默认使用 AzureWebJobsStorage。但是您可以在新建 BlobAttribute 时提供连接字符串。(请检查 BlobAttribute 类。)这不是 MSI 身份验证,我认为您需要在代码中编写 MSI 身份验证逻辑。看看api参考:docs.microsoft.com/en-us/dotnet/api/…
    • 2, Connection string is still visible in portal and used by my app so if it's compromised it can leak it? 是的,对于您担心的这一点,通常的做法是将此连接字符串指向 keyvault 的 sercret。这样可以避免无关人员的访问。
    • 即使AzureWebJobsStorage也可以这样做?我可以将它指向 KeyVault 吗?
    猜你喜欢
    • 2022-10-23
    • 2021-10-12
    • 2018-08-03
    • 2019-12-24
    • 2020-05-23
    • 1970-01-01
    • 2019-09-28
    • 2023-03-23
    • 2018-10-24
    相关资源
    最近更新 更多