使用密钥保管库的更安全方式

A more secure way to use key vault

通常当您使用密钥保管库加密和解密数据时,您必须将您的 AD 注册应用程序(有权访问密钥保管库)的 ClientID 和 ClientSecret 以纯文本形式保存在某处。如果有人窃取了 ClientID 和 Secret,那么这似乎是一个安全问题,任何人都可以声称他们是已注册的应用程序。

是否有或可以有更安全的方法?

您可以使用证书而不是密码进行身份验证。

对于这种方法,您需要做三件事:

  1. 创建要使用的证书。
  2. 创建用于访问 Key Vault 的 Active Directory 应用程序时,您需要传入在步骤 1 中创建的证书。我认为您目前无法通过门户执行此操作,所以你需要使用 New-AzureRMADApplication PowerShell 命令。
  3. 在向 Key Vault 进行身份验证时使用该证书。您需要通过简单地传递客户端 ID 和 X509Certificate2 来使用 overload of the AuthenticationContext.AcquireTokenAsync() method that receives a ClientAssertionCertificate to do that. You can create a ClientAssertionCertificate

this 博客 post 您可以获得前两个步骤的一些代码。

除了使用基于证书的 KeyVault 之外,Azure Managed Service Identity 还引入了一种新方法,使 Azure 服务成为服务主体,无需任何客户端应用程序注册和客户端机密。目前它仅在某些服务的预览阶段可用:Azure VM、Azure App Service、Azure Function、Azure Event Hub 和 Azure Service Bus。可以在此处找到更多信息 https://docs.microsoft.com/en-us/azure/active-directory/msi-overview

[更新] 当您需要从 KeyVault 检索某些内容时,使用 Azure MSI 不需要客户端密码。仅使用 AzureServiceTokenProvider() 方法检索访问令牌

在具有自动化的实际部署中(例如通过 Ansible),您可以使用外部证书将敏感变量存储在 Ansibe Vault 中并生成 256 位链来保护此类信息。在自动化部署期间,证书被解密以访问这些变量并执行进一步的部署。这种方式为整个 Azure 部署添加了更多的加密层。