2

Microsoft 提供了多种方法来获得对 Azure Key Vault 机密的安全访问,特别是使用托管标识或服务主体作为标识提供者。但是,这些方法明确设计为使用基于 Azure 的资源,例如 Web 应用程序和微服务。它们不适用于 UWP/WinUI 桌面应用程序。

到目前为止,我发现允许 UWP/WinUI 桌面应用程序访问 Key Vault 的唯一方法是将应用程序的 Azure 注册信息(TenentId、ClientId 和 ClientSecret——它们自己的秘密!)加载到环境变量中创建新 SecretClient 对象 (Azure.Security.KeyVault.Secrets) 时的 DefaultAzureCredential() 方法。

但这意味着我需要将这些秘密存储在代码或配置文件中,以便在运行时读取。绝对不是最佳实践!我肯定错过了什么。

2020 年 UWP/WinUI 桌面应用程序安全访问 Key Vault 机密而不在此过程中暴露其他机密的最佳做法是什么?

4

2 回答 2

1

归根结底,您的应用程序必须存储某种秘密 - 因为它需要将该秘密提供给您的 Key Vault 实例,以证明该应用程序确实被允许访问存储在该 Vault 中的秘密。它类似于从数据库中检索值 - 您必须先存储并提供连接字符串,然后才能获取值。

如果不知道您打算如何部署应用程序的特定用例,就不可能建议您应该做什么或不应该做什么。在我们的案例中,我们有一个 WinForms 应用程序,由我们的支持团队明确安装到我们客户的机器上,这意味着我们一直在使用旧的、黄金标准的客户证书- 显然有一个自定义验证步骤.

值得庆幸的是,Key Vault 明确支持客户端证书(以下步骤从链接的 MSDN 复制):

  1. 创建 PKCS#12 存档 (.pfx) 证书。创建证书的选项包括 Windows 上的 MakeCert 和 OpenSSL。
  2. 将证书安装到当前用户的个人证书存储中。将密钥标记为可导出是可选的。请注意证书的指纹,稍后将在此过程中使用。
  3. 将 PKCS#12 存档 (.pfx) 证书导出为 DER 编码证书 (.cer)。
  4. 使用 Azure AD 注册应用程序(应用程序注册)。
  5. 将 DER 编码的证书 (.cer) 上传到 Azure AD
    :在 Azure AD 中选择应用。
    湾。导航到证书和机密。
    C。选择上传证书以上传包含公钥的证书。.cer、.pem 或 .crt 证书是可接受的。
  6. 将密钥保管库名称、应用程序 ID 和证书指纹存储在应用的 appsettings.json 文件中。
  7. 导航到 Azure 门户中的密钥保管库。
  8. 选择你在使用 Azure Key Vault 的生产环境的机密存储部分中创建的密钥保管库。
  9. 选择访问策略。
  10. 选择添加访问策略。
  11. 打开 Secret 权限并为应用程序提供 Get 和 List 权限。
  12. 选择 Select principal 并按名称选择已注册的应用程序。选择选择按钮。
  13. 选择确定。
  14. 选择保存。
  15. 部署应用程序。

我们目前正在用 Key Vault 替换我们的自定义客户端证书验证器,因为它只会让一切变得更加容易 - 从 Azure 门户而不是我们的自定义管理应用程序管理证书和吊销。

于 2020-11-18T17:31:14.377 回答
-1

我需要将这些秘密存储在代码或配置文件中,以便在运行时读取

您可以将 Azure 注册信息(TenentId、ClientId 和 ClientSecret)设置为 Secret manager 并读取值而不是公开机密。

请参考以下步骤:

1.启用安全管理器。您需要通过在项目目录上运行来使用 init 关键字。

dotnet user-secrets init

这将UserSecretId在项目.csproj文件中创建 Guid。

在此处输入图像描述

2.设置秘密。您可以使用 set 关键字设置秘密

dotnet user-secrets set tenantId "xxxxxxxxxxxx"

在此处输入图像描述

3.从代码中的秘密管理器中读取。

private readonly IConfiguration _configuration;

public WeatherForecastController( IConfiguration configuration)
{
    _configuration = configuration;
}
string keyVaultUrl = "https://xxxx.vault.azure.net";
TokenCredential credential = new DefaultAzureCredential();
credential = new ClientSecretCredential(_configuration["tenantId"], _configuration["clientId"], _configuration["clientSecret"]);

var secretClient = new SecretClient(new Uri(keyVaultUrl), credential);
KeyVaultSecret secret = secretClient.GetSecret("xxxx");
var secretvalue = secret.Value;

工作输出如下:

在此处输入图像描述

有关秘密管理器的更多详细信息,您可以参考这篇文章

于 2020-07-20T05:48:01.917 回答