Azure Functions 访问密钥作为共享秘密,授权访问函数端点。 本文介绍 Functions 支持的访问密钥类型,以及如何使用访问密钥。
虽然访问密钥在一定程度上防止不受欢迎的访问,但请考虑其他在生产环境中保护HTTP端点的选项。 例如,不要在公共应用中分发共享秘密。 如果公共客户端调用了你的函数,考虑实现以下或其他安全机制:
访问密钥为HTTP触发函数中的HTTP授权提供了基础。 有关详细信息,请参阅授权级别。
访问密钥类型
访问密钥的范围及其支持的操作取决于访问密钥的类型。
| 密钥类型 | 键名 | HTTP 身份验证级别 | 说明 |
|---|---|---|---|
| 功能 |
default 或用户自定义 |
function |
仅允许访问特定函数终结点。 |
| 主机 |
default 或用户自定义 |
function |
允许访问函数应用中的所有函数终结点。 |
| 主 | _master |
admin |
特殊主机密钥(同样提供对函数应用中运行时 REST API 的管理访问权限)。 因为主密钥在你的函数应用中授予了提升权限,所以不要将该密钥分享给第三方,也不要在本地客户端应用中分发。 |
| 系统 | 取决于扩展 | 不适用 | 特定扩展可能需要系统管理的密钥才能访问 webhook 终结点。 系统密钥是为内部组件调用的扩展专用功能端点设计的。 例如,事件网格触发器要求订阅在调用触发器终结点时使用系统密钥。 Durable Functions 还使用系统密钥调用 Durable 任务扩展 API。 只有特定的扩展才能创建系统密钥。 无法显式设置其值。 与其他密钥一样,你可从门户或使用密钥 API 为密钥生成新值。 |
每个密钥都有一个名称供参考。 函数应用和函数层级各自有一个名为 default的默认键。 函数密钥优先于主机密钥。 当两个键名称相同时,总是使用功能键。
下表比较了不同类型的访问密钥的用法:
| 操作 | Scope | 密钥类型 |
|---|---|---|
| 执行函数 | 特定函数 | 函数 |
| 执行函数 | 任何函数 | 函数或主机 |
调用 admin 终结点 |
函数应用 | 主节点 |
| 调用 Durable Task 扩展 API | 函数应用程序* | 系统 |
| 调用扩展专用的Webhook(内部) | 函数应用程序* | 系统 |
*由扩展决定的范围。
访问密钥要求
在 Functions 中,访问密钥是随机生成的 32 字节数组,这些数组编码为 URL 安全 base-64 字符串。 虽然你可以自己生成访问密钥并与 Functions 一起使用,但请使用默认的访问密钥生成过程。
函数生成的访问密钥包括特殊的签名和校验和值,这些值指示访问密钥的类型以及 Azure Functions 生成了它。 密钥中的这些额外组件使得在安全扫描和其他自动化流程中更容易确定这类秘密的来源。
要让 Functions 为你生成密钥,请不要将密钥 value 提供给任何可用于生成密钥的 API。
访问密钥存储
你在Azure中的函数应用存储密钥并在静止状态下加密。 默认情况下,该 AzureWebJobsStorage 设置会将密钥存储在提供的账户中的 Blob 存储容器中。 使用该 AzureWebJobsSecretStorageType 设置覆盖默认行为,并将密钥存放在以下备用位置之一:
| 位置 | 值 | 说明 |
|---|---|---|
| 第二个存储帐户 | blob |
将密钥存储在某个存储帐户的 Blob 存储中,该存储帐户不同于 Functions 运行时所使用的存储帐户。 使用的特定帐户和容器由设置中的 AzureWebJobsSecretStorageSas 共享访问签名 (SAS) URL 定义。 SAS URL 更改时,必须保留 AzureWebJobsSecretStorageSas 设置。 |
| Azure 密钥保管库 | keyvault |
将密钥存放在 的密钥库 AzureWebJobsSecretStorageKeyVaultUri中。 |
| 文件系统 | files |
密钥保留在本地文件系统上,这是 Functions v1.x 中的默认设置。 不建议使用文件系统存储。 |
| Kubernetes Secret | kubernetes |
将密钥存储在 AzureWebJobsKubernetesSecretName 中的资源集中。 仅在函数应用部署到 Kubernetes 时受支持。 使用 Azure Functions Core Tools 将应用部署到 Kubernetes 群集时,它将自动生成这些值。 不支持不可变机密。 |
当你使用 密钥保管库 进行密钥存储时,你需要的应用设置取决于该应用如何认证 密钥保管库:系统分配的托管身份、用户指定的托管身份,还是应用注册。
| 设置名称 | 系统分配的 | 用户分配的 | 应用注册 |
|---|---|---|---|
AzureWebJobsSecretStorageKeyVaultUri |
是的 | 是的 | 是的 |
AzureWebJobsSecretStorageKeyVaultClientId |
否 | 是的 | 是的 |
AzureWebJobsSecretStorageKeyVaultClientSecret |
否 | 否 | 是的 |
AzureWebJobsSecretStorageKeyVaultTenantId |
否 | 否 | 是的 |
重要
机密未通过 AzureWebJobsSecretStorageKeyVaultUri 设置限定为单独的函数应用。 如果多个函数应用配置为使用相同的 密钥保管库,则它们共享相同的机密,可能会导致密钥冲突或覆盖。 为了避免意外行为,建议为每个函数应用使用单独的 密钥保管库 实例。
带访问密钥的呼叫端点
你可以通过使用 包含函数名称的 URL 来调用 HTTP 触发的函数。 当你将函数的授权级别设置为除 anonymous 之外的任意值时,还必须在请求中提供访问密钥。 您可以在 URL 中通过使用 ?code= 查询字符串包含访问密钥,或者在请求标头(x-functions-key)中包含访问密钥。 有关详细信息,请参阅访问密钥授权。
若要访问运行时 REST API(在 /admin/ 下),必须在 _master 请求头中提供主密钥 (x-functions-key)。 你可以通过设置functionsRuntimeAdminIsolationEnabled站点属性来禁用管理端点。
获取函数访问密钥
可以使用以下 Azure 资源管理器 API 以编程方式获取函数和主机密钥:
若要了解如何调用 Azure 资源管理器 API,请参阅 Azure REST API 参考。
使用这些方法可以获得访问密钥,无需使用 REST API。
登录 Azure 门户,然后搜索并选择功能应用。
选择要使用的函数应用。
在左侧菜单中,展开Functions,然后选择应用密钥。
随即显示“应用密钥”页面。 在这一页上,会显示主机密钥,你可以用它访问应用中的任何功能。 还会显示系统密钥,该密钥向任何人授予对所有函数应用 API 的管理员级别访问权限。
还可使用特定函数的密钥来练习最低特权。 可以从特定 HTTP 触发的函数的“函数密钥”选项卡获取特定于函数的密钥。
小窍门
你还可以使用 Azure Functions Core Tools 命令 func azure functionapp list-functions 并配合 --show-keys 选项来获取函数的访问密钥。 有关详细信息,请参阅 Azure Functions Core Tools 参考。
续订或创建访问密钥
续订或创建访问密钥值时,必须手动将更新的密钥值重新分发给调用你的函数的所有客户端。
可以使用以下 Azure 资源管理器 API 以编程方式续订函数和主机密钥,也可以创建新密钥:
若要了解如何调用 Azure 资源管理器 API,请参阅 Azure REST API 参考。
可以使用这些方法获取访问密钥,而无需手动创建对 REST API 的调用。
登录 Azure 门户,然后搜索并选择功能应用。
选择要使用的函数应用。
在左侧菜单中,展开Functions,然后选择应用密钥。
随即显示“应用密钥”页面。 在这一页上,会显示主机密钥,你可以用它访问应用中的任何功能。 还会显示系统密钥,该密钥向任何人授予对所有函数应用 API 的管理员级别访问权限。
选择你想续期的键旁边的 “续订”密钥值 ,然后选择 “续订并保存”。
还可以在特定 HTTP 触发的函数的“函数密钥”选项卡中续订函数密钥。
删除访问密钥
可以使用以下 Azure 资源管理器 API 以编程方式删除函数和主机密钥:
若要了解如何调用 Azure 资源管理器 API,请参阅 Azure REST API 参考。