使用 Azure Key Vault 管理机密和证书

使用 Azure Key Vault 管理机密和证书

2024年8月14日

本文旨在指导安全分析师、IT 管理员和系统工程师使用 Azure Key Vault 安全地管理机密(例如密码、API 密钥、连接字符串)和证书 (SSL/TLS)。 Azure Key Vault 是一项云服务,为存储和访问这些关键项目提供集中且安全的解决方案,无需将它们直接嵌入到代码或配置文件中,这是一种糟糕的安全实践 [1]。

简介

在现代应用程序的开发和运营中,管理秘密和证书是一个持续的挑战。数据库凭据、第三方服务 API 密钥、加密密钥和 SSL/TLS 证书都是敏感资产,如果泄露,可能会导致严重的数据泄露。不安全地存储它们(例如在纯文本文件、环境变量中或直接在源代码中)会带来重大风险。 Azure Key Vault 旨在通过提供基于硬件的安全存储库 (HSM) 来保护这些资产、严格控制访问并简化生命周期管理来解决这些问题 [2]。

本操作指南将涵盖创建 Azure Key Vault、添加和检索机密和证书、配置访问策略以及与其他 Azure 服务(例如 Azure 应用服务)集成。将提供分步说明、示例 Azure CLI 命令和验证方法,以便读者能够实现机密和证书的安全管理,从而加强其应用程序和云基础设施的安全状况。

为什么 Azure Key Vault 至关重要?

  • 安全存储:使用经过 FIPS 140-2 2 级验证的硬件安全模块 (HSM) 保护机密和加密密钥。
  • 集中访问控制:允许您使用 Azure 基于角色的访问控制 (RBAC) 或 Key Vault 访问策略在粒度级别管理对机密和证书的访问权限。
  • 生命周期管理:促进秘密和证书轮换、自动过期和事件通知。
  • 降低风险:无需在代码或配置文件中存储凭据,从而最大限度地降低泄漏风险。
  • 监控和审计:记录 Key Vault 中执行的所有操作,为合规性和安全调查提供审计跟踪。
  • 简化集成:轻松与其他 Azure 服务集成,例如 Azure 应用服务、Azure Functions、Azure 虚拟机和 Azure DevOps。

先决条件

要使用 Azure Key Vault,您将需要以下项目:

  1. 活动 Azure 订阅:用于创建和管理资源的 Azure 订阅。
  2. 管理访问权限:在 Azure 订阅中具有“所有者”或“贡献者”角色的帐户,或者具有创建和管理 Key Vault 权限的自定义角色。
  3. Azure CLI 或 Azure PowerShell:安装并配置命令行工具以与 Azure 交互。
  4. 可选:Visual Studio Code:用于开发和集成测试。

分步:使用 Azure Key Vault 管理机密和证书

让我们创建一个密钥保管库,添加机密和证书,并配置访问权限。

1. 创建 Azure 密钥保管库

让我们使用 Azure CLI 创建一个 Key Vault。您还可以使用 Azure 门户。

  1. 打开终端或 PowerShell 并登录 Azure: bash 登录
  2. 创建一个资源组(如果您还没有): bash az group create --name RG-KeyVault-Artigos --location eastus

  3. 创建 Azure 密钥保管库。为您的 Key Vault 选择一个全局唯一的名称。 bash az keyvault create --name kv-artigos-seguranca-01 --resource-group RG-KeyVault-Artigos --location eastus --enabled-for-template-deployment true

    • --enabled-for-template-deployment true:允许 Key Vault 用于模板部署,对于自动化很有用。

2. 将机密添加到 Key Vault

让我们添加一个数据库密码作为秘密这。

  1. 添加一个名为“DatabasePassword”的机密,并带有示例值: bash az keyvault Secret set --vault-name kv-artigos-seguranca-01 --name DatabasePassword --value "S3cur3P@ssw0rd!"

  2. 检索密钥以验证其存储是否正确: bash az keyvault Secret show --vault-name kv-artigos-seguranca-01 --name DatabasePassword --query value -o tsv

3. 将证书添加到 Key Vault

让我们添加一个自签名证书以进行演示。在生产中,您将使用来自受信任 CA 的证书。

  1. 在 Key Vault 中创建自签名证书: bash az keyvault 证书创建 --vault-名称 kv-artigos-seguranca-01 --name MyWebAppCert --policy "$(az keyvault 证书获取默认策略)"

2.查看证书详细信息: bash az keyvault 证书显示 --vault-名称 kv-artigos-seguranca-01 --name MyWebAppCert

4. 配置访问策略

要允许应用程序或用户访问机密和证书,您需要配置访问策略。让我们使用 Azure 基于角色的访问控制 (RBAC)。

  1. 获取需要访问的应用程序或用户的“对象 ID”。对于应用程序(服务主体),您可以在 Azure AD 中注册后获取它。对于用户,请使用“az ad user show --id --query id -o tsv”。
  2. 为您的 Key Vault 分配角色。例如,要允许应用程序读取机密: bash # 示例:将角色“Key Vault Secrets User”分配给服务主体 az 角色分配 create --role "Key Vault Secrets User" --assignee-object-id <对象应用程序/用户 ID> --scope /subscriptions/<您的订阅 ID>/resourceGroups/RG-KeyVault-Artigos/providers/Microsoft.KeyVault/vaults/kv-artigos-seguranca-01
    • 提示:对于证书,您可以使用“Key Vault 证书用户”功能。

5. 与 Azure 应用服务集成(示例)

让我们演示应用程序如何使用 Key Vault 中的机密。

  1. 创建 Azure 应用服务(如果您还没有): bash az appservice plan create --name AppServicePlan-Artigos --resource-group RG-KeyVault-Artigos --sku B1 --is-linux az webapp create --resource-group RG-KeyVault-Artigos --plan AppServicePlan-Artigos --name webapp-artigos-seguranca-01
  2. 为应用服务启用托管身份。这允许应用服务无需显式凭据即可向 Azure Key Vault 进行身份验证。 bash az webapp 身份分配 --resource-group RG-KeyVault-Artigos --name webapp-artigos-seguranca-01

  3. 授予应用服务托管标识访问 Key Vault 中的密钥的权限。使用上一步中获取的“principalId”。 bash az keyvault set-policy --name kv-artigos-seguranca-01 --object-id <principalManaged IdentityId> --secret-permissions 获取列表

    • 提示:要使用 RBAC,请将“Key Vault Secrets User”角色分配给托管身份的“principalId”。
  4. 在应用服务中配置秘密引用。这允许应用程序将秘密作为环境变量进行访问。 bash az webapp config appsettings set --resource-group RG-KeyVault-Artigos --name webapp-artigos-seguranca-01 --settings DatabasePassword="@Microsoft.KeyVault(SecretUri=https://kv-artigos-seguranca-01.vault.azure.net/secrets/DatabasePassword/)"

  5. 现在,您的应用程序(例如 ASP.NET Core、Node.js)可以将“DatabasePassword”密钥作为普通环境变量进行读取,并且 Azure 应用服务将以安全的方式从 Key Vault 中检索它。

验证和测试

验证秘密和证书管理涉及验证是否仅向授权实体授予访问权限以及是否可以正确检索秘密。

1. 通过 Azure CLI 测试对机密的访问

  1. 尝试使用没有权限的帐户访问机密: bash az login # 使用没有权限的帐户登录 az keyvault Secret show --vault-name kv-artigos-seguranca-01 --name DatabasePassword --query value -o tsv

    • 预期结果:该命令应该失败并出现“AuthorizationFailed”错误。
  2. 尝试使用具有权限的帐户(例如创建密钥 V 的帐户)来访问密钥ault 或应用服务托管标识(如果您是从应用程序内进行测试)。 bash az login # 使用有权限的帐户登录 az keyvault Secret show --vault-name kv-artigos-seguranca-01 --name DatabasePassword --query value -o tsv

    • 预期结果:该命令必须返回秘密值。

2.测试证书访问

  1. 验证证书是否可以由授权实体列出和检索。 bash az keyvault 证书列表 --vault-name kv-artigos-seguranca-01 az keyvault 证书显示 --vault-名称 kv-artigos-seguranca-01 --name MyWebAppCert
    • 预期结果:命令应返回证书详细信息。

3.检查Key Vault审核日志

Key Vault 中的所有操作都会被记录并可以审核。

  1. 在 Azure 门户中,导航到您的 Key Vault (kv-articles-seguranca-01)。
  2. 在左侧导航窗格中,选择活动日志
  3. 您将看到所执行的所有操作的日志,包括创建机密、证书和访问尝试。

安全提示和最佳实践

  • 最小权限原则:仅授予机密和证书必要的权限(获取、列出、设置、删除)。避免授予过多的权限。
  • 定期轮换秘密:实施定期轮换秘密和证书的流程,以降低泄露风险。
  • 托管身份:尽可能使用 Azure 资源的托管身份(托管身份)对 Key Vault 进行身份验证,从而无需在代码中管理凭据。
  • 精细访问策略:使用 Key Vault 或 Azure RBAC 访问策略来控制谁可以访问什么。优选 RBAC 进行更精细的控制。
  • 监控和警报:为 Key Vault 中的可疑活动配置警报,例如失败的访问尝试或秘密删除。
  • 软删除和清除保护:在 Key Vault 中启用软删除和清除保护,以防止意外或恶意丢失机密和证书。
  • 定期备份:尽管 Key Vault 具有高可用性,但请考虑备份您的机密和证书,尤其是在灾难恢复场景中。
  • 使机密过期:设置机密和证书的到期日期以强制轮换并避免使用旧凭据。

常见故障排除

  • 授权错误(403 禁止):检查尝试访问的实体的 Key Vault 访问策略或 RBAC 角色分配。确保使用正确的“对象 ID”或“principalId”。
  • 未找到密钥/证书:检查密钥/证书名称和 Key Vault 名称。确保机密/证书存在并且未被删除或过期。
  • 托管标识问题:验证是否已为 Azure 资源启用托管标识以及是否已在 Key Vault 中授予正确的权限。
  • 秘密检索延迟:在某些情况下,检索秘密时可能会存在较小的延迟。确保您的应用程序正在异步处理此问题。
  • 连接错误:检查应用程序或虚拟机的网络设置。确保没有防火墙或网络安全组阻止对 Key Vault 的访问。

结论

对于任何希望保护云中最敏感数字资产的组织来说,Azure Key Vault 都是一项关键服务。通过在安全、高度可用的存储库中集中管理机密和证书,可以简化合规性、降低数据泄露风险并改善整体安全状况。 Azure Key Vault 的有效实施与安全和自动化最佳实践相结合,使开发人员和操作人员能够专注于创新,知道他们的凭据和密钥受到保护。通过本实用指南,安全专业人员将能够使用 Azure Key Vault 安全高效地管理机密和证书,确保 Azure 中的应用程序和数据的完整性和机密性。


参考资料:

[1]微软学习。 什么是 Azure Key Vault?。位于:https://learn.microsoft.com/pt-br/azure/key-vault/general/overview [2] 微软学习。 管理 Azure Key Vault 中机密的最佳实践。位于:https://learn.microsoft.com/pt-br/azure/key-vault/secrets/secrets-best-practices [3] 微软学习。 关于 Azure Key Vault 证书。位于:https://learn.microsoft.com/pt-br/azure/key-vault/certificates/about-certificates