你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
向 Azure 服务进行身份验证的最佳方式是使用 托管标识,但在某些情况下,这不是一个选项。 在这些情况下,使用访问密钥或密码。 应经常轮换访问密钥和密码。
本教程介绍如何为使用两组身份验证凭据的数据库和服务自动轮换机密。 有关不同资产类型自动轮换概念和优势的综合概述,请参阅 了解 Azure Key Vault 中的自动轮换。
具体而言,本教程介绍如何将 Azure Key Vault 中存储的 Azure 存储帐户密钥轮换为机密。 你将使用由 Azure 事件网格通知触发的函数。
注释
对于存储帐户服务,建议使用 Microsoft Entra ID 来授权请求。 有关详细信息,请参阅使用 Microsoft Entra ID 授予对 blob 的访问权限。 有一些服务需要具有访问密钥的存储帐户连接字符串。 对于这种情况,我们建议使用此解决方案。
下面是本教程中介绍的轮换解决方案:
在此解决方案中,Azure Key Vault 将存储帐户的各个访问密钥存储为相同机密的版本,在后续版本中的主密钥和辅助密钥之间交替。 将一个访问密钥存储在最新版本的机密中时,将重新生成备用密钥,并将其作为新版机密添加到 Key Vault。 该解决方案提供应用程序的整个轮换周期,以刷新到最新重新生成的密钥。
- 密钥保管库在机密到期日期之前的 30 天将即将过期事件发布到事件网格。
- 事件网格检查事件订阅,并使用 HTTP POST 调用订阅事件的函数应用终结点。
- 函数应用标识备用密钥(而不是最新密钥),并调用存储帐户以重新生成它。
- 函数应用将新的重新生成密钥作为机密的新版本添加到 Azure Key Vault。
先决条件
- 一份 Azure 订阅。 免费创建一个。
- Azure Cloud Shell。 本教程将门户 Cloud Shell 与 PowerShell 环境结合使用
- Azure Key Vault。
- 两个 Azure 存储帐户。
注释
共享存储帐户密钥的轮换会撤销基于该密钥生成的帐户级别共享访问签名(SAS)。 存储帐户密钥轮换后,必须重新生成帐户级 SAS 令牌,以避免应用程序中断。
如果没有现有的密钥保管库和现有存储帐户,可以使用此部署链接:
在“资源组”下,选择“新建”。 将组命名为“保管库轮换”,然后选择“确定”。
选择“查看 + 创建”。
选择 创建。
现在,你将拥有一个密钥保管库和两个存储帐户。 可以通过运行以下命令在 Azure CLI 或 Azure PowerShell 中验证此设置:
az resource list -o table -g vaultrotation
结果将类似于以下输出:
Name ResourceGroup Location Type Status
----------------------- -------------------- ---------- --------------------------------- --------
vaultrotation-kv vaultrotation westus Microsoft.KeyVault/vaults
vaultrotationstorage vaultrotation westus Microsoft.Storage/storageAccounts
vaultrotationstorage2 vaultrotation westus Microsoft.Storage/storageAccounts
创建和部署密钥轮换函数
接下来,你将创建一个使用系统托管标识的函数应用,以及其他必需组件。 你还将为存储帐户密钥部署轮换函数。
函数应用轮换函数需要以下组件和配置:
- Azure 应用服务计划
- 用于管理函数应用触发器的存储帐户
- 用于访问 Key Vault 中的机密的访问策略
- 向函数应用分配的存储帐户密钥操作员服务角色,分配目的是使其可可访问存储帐户访问密钥
- 具有事件触发器和 HTTP 触发器(按需轮换)的密钥轮换函数
- SecretNearExpiry 事件的事件网格事件订阅
选择 Azure 模板部署链接:
在资源组列表中,选择vaultrotation。
在 “存储帐户 RG ”框中,输入存储帐户所在的资源组的名称。 如果存储帐户已位于部署密钥轮换函数的同一资源组中,请保留默认值 [resourceGroup(.name]。
在 “存储帐户名称 ”框中,输入包含要轮换的访问密钥的存储帐户的名称。 如果使用先决条件中创建的存储帐户,请保留默认值 [concat(resourceGroup(.name, 'storage')]。
在 Key Vault RG 框中,输入密钥保管库所在的资源组的名称。 如果密钥保管库已存在于要在其中部署密钥轮换函数的同一资源组中,请保留默认值 [resourceGroup(.name]。
在 “密钥保管库名称 ”框中,输入密钥保管库的名称。 如果使用先决条件中创建的密钥保管库,请保留默认值 [concat(resourceGroup(.name, '-kv')]。
在 “应用服务计划类型” 框中,选择托管计划。 仅当密钥保管库位于防火墙后面时,才需要高级计划。
在 “函数应用名称 ”框中,输入函数应用的名称。
在 “机密名称 ”框中,输入用于存储访问密钥的机密的名称。
在 存储库 URL 框中,输入函数代码的 GitHub 位置。 在本教程中,可以使用 https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git 。
选择“查看 + 创建”。
选择 创建。
完成上述步骤后,你将拥有存储帐户、服务器场、函数应用和 Application Insights。 部署完成后,你将看到此页面:
注释
如果遇到故障,可以选择“ 重新部署 ”以完成组件的部署。
可以在 Azure 示例中找到轮换函数的部署模板和代码。
将存储帐户访问密钥添加到 Key Vault 机密
首先,设置访问策略以向用户主体授予 管理机密 权限:
az keyvault set-policy --upn <email-address-of-user> --name vaultrotation-kv --secret-permissions set delete get list
现在,可以使用存储帐户访问密钥作为其值创建新的机密。 还需要存储帐户资源 ID、机密有效期和密钥 ID 才能添加到机密,以便轮换函数可以在存储帐户中重新生成密钥。
确定存储帐户资源 ID。 可以在属性中找到 id
此值。
az storage account show -n vaultrotationstorage
列出存储帐户访问密钥,以便获取密钥值:
az storage account keys list -n vaultrotationstorage
将机密添加到密钥保管库,设定有效期为 60 天,并包含存储帐户资源 ID。为了演示目的,可立即触发轮换,将到期日期设置为明天。 使用检索到的值key1Value
和storageAccountResourceId
运行此命令。
tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey --vault-name vaultrotation-kv --value <key1Value> --tags "CredentialId=key1" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate
此机密将在几分钟内触发 SecretNearExpiry
事件。 此事件转而将触发函数来轮换过期时间设置为 60 天的机密。 在该配置中,“SecretNearExpiry”事件每 30 天(到期前 30 天)触发一次,轮换函数将在 key1 和 key2 之间交替轮换。
可以通过检索存储帐户密钥和 Key Vault 机密并对其进行比较来验证访问密钥是否已重新生成。
使用此命令获取机密信息:
az keyvault secret show --vault-name vaultrotation-kv --name storageKey
请注意, CredentialId
已更新为备用项 keyName
,并 value
重新生成:
检索访问键以比较值:
az storage account keys list -n vaultrotationstorage
请注意, value
密钥与密钥保管库中的机密相同:
对多个存储帐户使用现有轮换函数
可以重复使用同一函数应用来轮换多个存储帐户的密钥。
若要将存储帐户密钥添加到现有函数进行轮换,需要:
- 向函数应用分配的存储帐户密钥操作员服务角色,分配目的是使它可访问存储帐户访问密钥。
- SecretNearExpiry 事件的事件网格事件订阅。
选择 Azure 模板部署链接:
在资源组列表中,选择vaultrotation。
在 “存储帐户 RG ”框中,输入存储帐户所在的资源组的名称。 如果存储帐户已位于部署密钥轮换函数的同一资源组中,请保留默认值 [resourceGroup(.name]。
在 “存储帐户名称 ”框中,输入包含要轮换的访问密钥的存储帐户的名称。
在 Key Vault RG 框中,输入密钥保管库所在的资源组的名称。 如果密钥保管库已存在于要在其中部署密钥轮换函数的同一资源组中,请保留默认值 [resourceGroup(.name]。
在 “密钥保管库名称 ”框中,输入密钥保管库的名称。
在 “函数应用名称 ”框中,输入函数应用的名称。
在 “机密名称 ”框中,输入用于存储访问密钥的机密的名称。
选择“查看 + 创建”。
选择 创建。
将存储帐户访问密钥添加到 Key Vault 机密
确定存储帐户资源 ID。 可以在属性中找到 id
此值。
az storage account show -n vaultrotationstorage2
列出存储帐户访问密钥,以便获取 key2 值:
az storage account keys list -n vaultrotationstorage2
将机密添加到密钥保管库,设定有效期为 60 天,并包含存储帐户资源 ID。为了演示目的,可立即触发轮换,将到期日期设置为明天。 使用检索到的值key2Value
和storageAccountResourceId
运行此命令。
tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey2 --vault-name vaultrotation-kv --value <key2Value> --tags "CredentialId=key2" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate
使用此命令获取机密信息:
az keyvault secret show --vault-name vaultrotation-kv --name storageKey2
请注意, CredentialId
已更新为备用项 keyName
,并 value
重新生成:
检索访问键以比较值:
az storage account keys list -n vaultrotationstorage
请注意, value
密钥与密钥保管库中的机密相同:
禁用机密轮换
只需删除机密的事件网格订阅,即可禁用机密轮换。 使用 Azure PowerShell Remove-AzEventGridSubscription cmdlet 或 Azure CLI az event grid event--subscription delete 命令。
两组凭据的 Key Vault 轮换函数
两组凭据和几个现成函数的轮换函数模板:
注释
这些轮换函数由社区成员创建,而不是由Microsoft创建。 社区功能不受任何Microsoft支持计划或服务的支持,并且按原样提供,不提供任何形式的担保。