在 Azure Functions 中使用访问密钥
Azure Functions 支持使用密钥来加大访问函数终结点的难度。 本文介绍 Functions 支持的各种访问密钥,以及如何使用访问密钥。
虽然访问密钥针对不需要的访问提供了一些缓解措施,但你应考虑使用其他选项来保护生产环境中的 HTTP 终结点。 例如,最好不要在公共应用中分发共享机密。 如果从公共客户端调用函数,则应考虑实施以下或其他安全机制:
访问密钥为 HTTP 触发的函数中的 HTTP 授权提供了基础。 有关详细信息,请参阅授权级别。
了解密钥
访问密钥的范围及其支持的操作取决于访问密钥的类型。
key 类型 | 项名 | HTTP 身份验证级别 | 说明 |
---|---|---|---|
Function | default 或用户定义 |
function |
仅允许访问特定函数终结点。 |
主机 | default 或用户定义 |
function |
允许访问函数应用中的所有函数终结点。 |
主提单 | _master |
admin |
特殊主机密钥(同样提供对函数应用中运行时 REST API 的管理访问权限)。 无法撤销此密钥。 由于主密钥在函数应用中授予提升的权限,因此不应与第三方共享此密钥或在本机客户端应用程序中分发此密钥。 |
系统 | 取决于扩展 | 不适用 | 特定扩展可能需要系统管理的密钥才能访问 webhook 终结点。 系统密钥专用于内部组件调用的特定于扩展的函数终结点。 例如,事件网格触发器要求订阅在调用触发器终结点时使用系统密钥。 Durable Functions 还使用系统密钥调用 Durable 任务扩展 API。 系统密钥只能由特定扩展创建,并且不能显式设置其值。 与其他密钥一样,你可从门户或使用密钥 API 为密钥生成新值。 |
每个密钥都已命名以方便引用,并且在函数和主机级别存在默认密钥(名为 default
)。 函数密钥优先于主机密钥。 如果为两个密钥定义的名称相同,则使用函数密钥。
下表比较了不同类型的访问密钥的用法:
操作 | 范围 | key 类型 |
---|---|---|
执行函数 | 特定函数 | 函数 |
执行函数 | 任何函数 | 函数或主机 |
调用 admin 终结点 |
函数应用 | 仅限 master |
调用 Durable 任务扩展 API | 函数应用* | 系统 |
调用特定于扩展的 Webhook(内部) | 函数应用* | 系统 |
*由扩展决定的范围。
关键要求
在 Functions 中,访问密钥是随机生成的 32 字节数组,这些数组编码为 URL 安全 base-64 字符串。 虽然可以生成自己的访问密钥并将其与 Functions 一起使用,但强烈建议你改为允许 Functions 为你生成所有访问密钥。
Functions 生成的访问密钥包括特殊的签名和校验和值,这些值指示访问密钥的类型,以及它是由 Azure Functions 生成的。 在密钥本身中包含这些额外的组件后,可以更轻松地确定安全扫描和其他自动化过程中此类机密的来源。
若要允许 Functions 为你生成密钥,请不要向任何可用于生成密钥的 API 提供密钥 value
。
管理密钥存储
密钥作为 Function App 的一部分存储在 Azure 中,并进行了静态加密。 默认情况下,密钥存储在通过 AzureWebJobsStorage
设置提供的帐户中的 Blob 存储容器中。 可以使用 AzureWebJobsSecretStorageType
设置替代此默认行为,改为将密钥存储在以下备用位置之一:
位置 | 值 | 说明 |
---|---|---|
第二个存储帐户 | blob |
将密钥存储在与 Functions 运行时使用的存储帐户不同的存储帐户内的 Blob 存储中。 使用的特定帐户和容器由在 AzureWebJobsSecretStorageSas 设置中设置的共享访问签名 (SAS) URL 定义。 SAS URL 更改时,必须保留 AzureWebJobsSecretStorageSas 设置。 |
Azure Key Vault | keyvault |
AzureWebJobsSecretStorageKeyVaultUri 中设置的密钥保管库用于存储密钥。 |
文件系统 | files |
密钥保留在本地文件系统上,这是 Functions v1.x 中的默认设置。 不建议使用文件系统存储。 |
Kubernetes 机密 | kubernetes |
AzureWebJobsKubernetesSecretName 中的资源集用于存储密钥。 仅在函数应用部署到 Kubernetes 时受支持。 使用 Azure Functions Core Tools 将应用部署到 Kubernetes 群集时,它将自动生成这些值。 |
将 Key Vault 用于密钥存储时,所需的应用设置取决于托管标识类型(是系统分配还是用户分配)。
设置名 | 系统分配 | 用户分配 | 应用注册 |
---|---|---|---|
AzureWebJobsSecretStorageKeyVaultUri | ✓ | ✓ | ✓ |
AzureWebJobsSecretStorageKeyVaultClientId | X | ✓ | ✓ |
AzureWebJobsSecretStorageKeyVaultClientSecret | X | X | ✓ |
AzureWebJobsSecretStorageKeyVaultTenantId | X | X | ✓ |
使用访问密钥
一般情况下,可以使用 https://<APP_NAME>.chinacloudsites.cn/api/<FUNCTION_NAME>
格式的 URL 来调用 HTTP 触发的函数。 如果为给定函数的授权级别设置的值不是 anonymous
,还必须在请求中提供访问密钥。 可以使用 ?code=
查询字符串在 URL 中提供该访问密钥,也可以在请求头 (x-functions-key
) 中提供。 有关详细信息,请参阅访问密钥授权。
若要访问运行时 REST API(在 /admin/
下),必须在 x-functions-key
请求头中提供主密钥 (_master
)。 可以使用 functionsRuntimeAdminIsolationEnabled
站点属性删除管理员终结点。
获取函数访问密钥
可以使用以下 Azure 资源管理器 API 以编程方式获取函数和主机密钥:
若要了解如何调用 Azure 资源管理器 API,请参阅 Azure REST API 参考。
可以使用这些方法获取访问密钥,而无需使用 REST API。
登录到 Azure 门户,然后搜索并选择“函数应用”。
选择要使用的函数应用。
在左窗格中,展开“函数”,然后选择“应用密钥”。
随即显示“应用密钥”页面。 此页面会显示主机密钥,可用于访问应用中的任何函数。 还会显示系统密钥,该密钥向任何人授予对所有函数应用 API 的管理员级别访问权限。
还可使用特定函数的密钥来练习最低特权。 可以从特定 HTTP 触发的函数的“函数密钥”选项卡获取特定于函数的密钥。
续订或创建访问密钥
续订或创建访问密钥值时,必须手动将更新的密钥值重新分发给调用你的函数的所有客户端。
可以使用以下 Azure 资源管理器 API 以编程方式续订函数和主机密钥,也可以创建新密钥:
若要了解如何调用 Azure 资源管理器 API,请参阅 Azure REST API 参考。
可以使用这些方法获取访问密钥,而无需手动创建对 REST API 的调用。
登录到 Azure 门户,然后搜索并选择“函数应用”。
选择要使用的函数应用。
在左窗格中,展开“函数”,然后选择“应用密钥”。
随即显示“应用密钥”页面。 此页面会显示主机密钥,可用于访问应用中的任何函数。 还会显示系统密钥,该密钥向任何人授予对所有函数应用 API 的管理员级别访问权限。
选择要续订的密钥旁边的“续订密钥值”,然后选择“续订并保存”。
还可以在特定 HTTP 触发的函数的“函数密钥”选项卡中续订函数密钥。
删除访问密钥
可以使用以下 Azure 资源管理器 API 以编程方式删除函数和主机密钥:
若要了解如何调用 Azure 资源管理器 API,请参阅 Azure REST API 参考。