Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
向Azure服务进行身份验证的最佳方式是使用托管标识,但某些方案仍需要访问密钥或密码。 经常轮换这些凭据,以减少泄漏的影响。
本教程介绍如何为使用两组身份验证凭据的数据库和服务自动执行定期机密轮换。 有关不同资产类型中的自动轮换概述,请参阅了解 Azure 密钥保管库 中的自动轮换。
具体而言,本教程将轮换Azure 存储帐户密钥,这些密钥以机密的形式存储在Azure 密钥保管库中。 它使用由Azure 事件网格通知触发的函数。
Important
对于 Azure 存储,相比共享帐户密钥,应优先使用托管标识的 Microsoft Entra ID 授权。 如果符合性允许, 请在存储帐户上禁用共享密钥授权 ,并完全不需要密钥轮换。 仅当工作负荷需要存储帐户密钥或连接字符串时,才使用本教程中的模式。
下面是本教程中介绍的轮换解决方案:
在此解决方案中,Azure 密钥保管库将每个存储帐户访问密钥存储为相同机密的版本,在后续版本中的主密钥和辅助密钥之间交替。 将一个访问密钥存储为最新版本的机密时,将重新生成备用密钥,并将其作为新版本添加到密钥保管库。 此设计为应用程序提供了一个完整的轮换周期,以获取重新生成的新密钥。
- 在机密到期日期之前的 30 天,密钥保管库将即将过期的事件发布到事件网格。
- 事件网格会检查事件订阅,并使用 HTTP POST 调用已订阅该事件的函数应用终结点。
- 函数应用会标识备用密钥(而不是最新密钥),并调用存储帐户来重新生成该密钥。
- 函数应用将重新生成的密钥添加到Azure 密钥保管库作为机密的新版本。
先决条件
- Azure 订阅。 免费创建一个。
- Azure 密钥保管库。
- 两个 Azure 存储帐户。
注意
轮换共享存储帐户密钥会撤销从该密钥生成的任何帐户级共享访问签名(SAS)。 轮换后,重新生成帐户级 SAS 令牌,以避免应用程序中断。
如果没有现有的密钥保管库和两个存储帐户,请使用以下部署链接:
在“资源组”下,选择“新建”。 将组命名为“存储空间轮换”,然后选择“确定”。
选择“审核 + 创建”。
选择“创建” 。
现在有一个密钥保管库和两个存储帐户。 在Azure CLI或Azure PowerShell中验证此设置:
az resource list -o table -g vaultrotation
结果类似于以下输出:
Name ResourceGroup Location Type Status
----------------------- -------------------- ---------- --------------------------------- --------
vaultrotation-kv vaultrotation chinanorth3 Microsoft.KeyVault/vaults
vaultrotationstorage vaultrotation chinanorth3 Microsoft.Storage/storageAccounts
vaultrotationstorage2 vaultrotation chinanorth3 Microsoft.Storage/storageAccounts
创建和部署密钥轮换函数
接下来,创建具有系统分配的托管标识和其他必需组件的函数应用,并为存储帐户密钥部署轮换函数。
旋转函数需要以下组件和配置:
- 一个 Azure 应用服务 计划。
- 用于管理函数应用触发器的存储帐户。
- Azure角色分配,允许函数应用访问密钥保管库中的机密。
- 分配给函数应用的 存储帐户密钥操作员服务角色 ,以便它可以访问存储帐户访问密钥。
- 具有事件网格触发器和 HTTP 触发器(用于按需轮换)的密钥轮换函数。
- 针对
事件的事件网格订阅。
选择 Azure 模板部署链接:
在资源组列表中,选择“vaultrotation”。
在 存储帐户 RG 中,输入存储帐户所在的资源组的名称。 如果存储帐户与轮换函数位于同一资源组中,则保留默认值
[resourceGroup().name]。在 存储帐户名称中,输入要轮换其访问密钥的存储帐户的名称。 如果使用
[concat(resourceGroup().name, 'storage')]中的存储帐户,请保留默认值。在 密钥保管库 RG 中,输入key vault所在的资源组的名称。 如果密钥保管库与轮换函数位于同一资源组中,则保留默认值
[resourceGroup().name]。在密钥保管库名称中,输入密钥保管库名称。 如果使用
[concat(resourceGroup().name, '-kv')]中的密钥保管库,请保留默认值。在 应用服务计划类型中,选择托管计划。 仅当密钥保管库位于防火墙后面时,才需要高级计划。
在 函数应用名称中,输入函数应用名称。
在 机密名称中,输入存储访问密钥的机密名称。
在 仓库 URL 中,输入该函数代码的 GitHub 位置:
https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git选择“审核 + 创建”。
选择“创建” 。
部署完成后,你有一个存储帐户、服务器场、一个函数应用和一个 Application Insights 资源:
注意
如果遭遇失败,可选择“重新部署”来完成组件的部署。
可以在 Azure 示例中找到轮换函数的部署模板和代码。
将存储帐户访问密钥添加到 密钥保管库 机密
首先,设置访问策略,以向用户主体授予“管理机密”权限:
az role assignment create --role "Key Vault Secrets Officer" --assignee <email-address-of-user> --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/vaultrotation-kv
现在可以创建其值为存储帐户访问密钥的机密。 连同该值一起,将存储帐户资源 ID、机密有效期和密钥 ID 添加为标记,以便轮换函数可以在存储帐户中重新生成密钥。
确定存储帐户资源 ID。 它是属性 id :
az storage account show -n vaultrotationstorage
列出存储帐户访问密钥,以便可获取密钥值:
az storage account keys list -n vaultrotationstorage
将机密添加到密钥保管库中,并将其有效期设置为 60 天,同时将其到期日期(为演示起见)设为明天,以立即触发轮换。 使用为 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 <key1-value> --tags "CredentialId=key1" "ProviderAddress=<storage-account-resource-id>" "ValidityPeriodDays=60" --expires $tomorrowDate
该机密会在几分钟内触发 SecretNearExpiry 事件,进而触发该函数轮换此机密,并将其过期时间设置为 60 天后。在该配置中,SecretNearExpiry 事件每 30 天触发一次(即到期前 30 天),轮换函数在 key1 和 key2 之间交替。
验证是否通过检索存储帐户密钥和密钥保管库机密来重新生成访问密钥,然后对其进行比较。
使用此命令获取机密信息:
az keyvault secret show --vault-name vaultrotation-kv --name storageKey
请注意,CredentialId 已更新为备用 keyName,并且 value 已重新生成:
检索访问密钥以比较值:
az storage account keys list -n vaultrotationstorage
请注意,密钥值与密钥保管库中的机密匹配:
对多个存储帐户使用现有的轮换函数
可以重复使用同一函数应用来轮换多个存储帐户的密钥。
若要将另一个存储帐户的密钥添加到现有轮换函数,需要:
- 分配给函数应用的 存储帐户密钥操作员服务角色 ,以便它可以访问存储帐户访问密钥。
- 针对
事件的事件网格订阅。
选择 Azure 模板部署链接:
在资源组列表中,选择“vaultrotation”。
在 存储帐户 RG 中,输入存储帐户所在的资源组的名称。 如果存储帐户与轮换函数位于同一资源组中,则保留默认值
[resourceGroup().name]。在 存储帐户名称中,输入要轮换其访问密钥的存储帐户的名称。
在 密钥保管库 RG 中,输入key vault所在的资源组的名称。 如果密钥保管库与轮换函数位于同一资源组中,则保留默认值
[resourceGroup().name]。在密钥保管库名称中,输入密钥保管库名称。
在 函数应用名称中,输入函数应用名称。
在 机密名称中,输入存储访问密钥的机密名称。
选择“审核 + 创建”。
选择“创建” 。
将存储帐户访问密钥添加到 密钥保管库 机密
确定存储帐户资源 ID。 可在 id 属性中找到该值。
az storage account show -n vaultrotationstorage2
列出存储帐户访问密钥,以便可获取密钥 2 值:
az storage account keys list -n vaultrotationstorage2
将机密添加到密钥保管库中,并将其有效期设置为 60 天,同时将其到期日期(为演示起见)设为明天,以立即触发轮换。 使用为 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 <key2-value> --tags "CredentialId=key2" "ProviderAddress=<storage-account-resource-id>" "ValidityPeriodDays=60" --expires $tomorrowDate
使用此命令获取机密信息:
az keyvault secret show --vault-name vaultrotation-kv --name storageKey2
请注意,CredentialId 已更新为备用 keyName,并且 value 已重新生成:
检索访问密钥以比较值:
az storage account keys list -n vaultrotationstorage2
请注意,密钥值与密钥保管库中的机密匹配:
禁用机密轮换
若要禁用密码轮换,请删除该密码的事件网格订阅。 使用 Azure PowerShell Remove-AzEventGridSubscription cmdlet 或 Azure CLI az eventgrid event-subscription delete 命令。
两组凭据的 密钥保管库 轮换函数
凭据管理的轮换函数模板,包括两组凭据和几个现成可用的函数:
注意
这些轮换函数是由社区成员(而不是 Microsoft)创建的。 社区功能不受任何 Azure 支持计划或服务的支持,按“原样”提供,且没有任何形式的保证。
后续步骤
- 对一组凭据进行密钥轮换
- 了解 Azure 密钥保管库中的自动轮换
- 使用 Azure 事件网格 监控 密钥保管库
- 在 Azure 门户中创建第一个函数
- Azure 密钥保管库 的 Azure 事件网格事件架构