如何使用 Azure Keyvault 保护 Azure Functions

问题描述 投票:0回答:1

我目前正在编写一个 .NET 7 隔离的 Azure 函数。我想配置该函数及其调用方以使用 Azure Key Vault。

我已经让密钥保管库正常工作,一切都已连接,并且可以从应用程序访问密钥。

我不明白的是如何保护端点。我已经按照文档设置了

AuthorizationLevel.Function

public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req)
{
    Console.WriteLine(Environment.GetEnvironmentVariable("FunctionApiKey"));
    Console.WriteLine((getSecretAsync().GetAwaiter().GetResult()).Value);
    _logger.LogInformation("C# HTTP trigger function processed a request.");

    var response = req.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("Content-Type", "text/plain; charset=utf-8");

    response.WriteString("Welcome to Azure Functions!");

    return response;
}

现在,当我在开发环境中调用我的应用程序时,我只需在邮递员中使用简单的 URL 即可触发它,甚至无需提供密钥。所以我不知道授权是否按预期工作,或者 Azure Function 框架是否提供了某种机制来在开发环境中不需要它。

此外,我不明白如何将授权 API 密钥指向 keyvault 密钥。我在

appsettings.local
中设置了以下内容:

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "AzureWebJobsSecretStorageType": "keyvault",
        "AzureWebJobsSecretStorageKeyVaultUri": "https://<vaultURI>.vault.azure.net/",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
    }
}

这是根据此处的文档设置的。但他们没有描述如何将应用程序指向特定的秘密以进行授权。

编辑: 看起来这个问题的答案部分就在我面前:

AzureWebJobsSecretStorageKeyVaultClientSecret    <CLIENT_SECRET>

但是我仍然不明白为什么端点在我的开发环境中未经授权运行。

azure-functions azure-keyvault azure-functions-runtime
1个回答
0
投票

这里有两个独立的东西。

  1. AuthorizationLevel
    供消费者使用端点。当您将函数应用程序部署到 Azure 时,它会在不同范围内创建一些初始函数 API 密钥,您可以通过 Azure 门户或 Azure CLI 管理函数应用程序实例上的这些密钥。

当您在本地运行此程序时,我不认为函数主机模拟器会强制执行 AuthorizationLevel 或可能使用众所周知的开发人员 API 密钥,就像访问存储帐户模拟器的

UseDeveloperStorage=true
设置一样。我不相信这是可配置的,我不需要尝试。

  1. 消费者不直接与函数主机运行的存储帐户交互,也不应该使用函数应用程序从中获取机密的密钥保管库,例如数据库连接字符串。

您部署的函数应用程序可以使用Key Vault 参考

在本地模拟的主机中,上面的密钥保管库引用作为本地 appsettings 文件中提供的两个

AzureWebJobsSecretStorageKeyVaultClient*
设置公开(仍然不要将其签入源代码管理!)。

Aaa,以防万一您遇到身份验证问题..

向密钥库进行身份验证并检索秘密的方式是

DefaultAzureCredential()
机制。因此,如果您从 Visual Studio 运行它,它可能会落到您的
VisualStudioCredential
。如果您使用
dotnet
从命令提示符运行它,您可能会通过浏览器获得交互式登录。

© www.soinside.com 2019 - 2024. All rights reserved.