繁体   English   中英

如何从 azure 应用服务访问密钥库

[英]How to access key vault from azure app service

我有以下方法连接到我的代码中的密钥库:

public static class ConfigurationBuilderExtension
{
    public static IConfigurationBuilder AddKeyVaultconfiguration(this IConfigurationBuilder builder)
    {
        var config = builder.Build();

        string name = config["KeyVault:Name"];
        string clientId = config["KeyVault:ClientId"];
        string clientSecret = config["KeyVault:ClientSecret"];

        Verify.NotNullOrEmpty(name, nameof(name));
        Verify.NotNullOrEmpty(name, nameof(clientId));
        Verify.NotNullOrEmpty(name, nameof(clientSecret));

        builder.AddAzureKeyVault($"https://{name}.vault.azure.net/", clientId, clientSecret);

        return builder;
    }
}

要在本地运行它,我只需将用户机密添加到项目中:

{
  "KeyVault": {
    "Name": "brajzorekeyvault",
    "ClientId": "xxxx",
    "ClientSecret": "xxxx"
  }
}

这在本地有效。

但是,当我将其发布到 Azure 中的应用程序服务时,如何使用这种方法? 我必须以某种方式注入名称、clientId 和 clientSecret? 但我不知道这样做的最佳实践方法是什么? 我应该在 Azure devops 中创建一个由这些值组成的变量组,然后在管道中使用它们吗?

您应该使用托管标识访问 web 应用程序内的密钥保管库,以避免注入密钥。 这个教程

对于本地开发,您可以在 VS 中链接一个帐户,该帐户将用于针对密钥保管库进行身份验证。 查看文档

使用托管身份是最佳实践,事实上,您不会看到任何有关使用客户端密码进行连接的官方文档,但至少会警告您使用托管身份。

当我们在 Azure 中使用 PAAS(大多数资源是 Azure 中的 PAAS,如 App 服务和 KeyVault)时。大多数时候,我们不需要编写代码或编写非常少的代码来访问它们,例如在这种情况下。 无需提供任何详细信息(如连接字符串或其他详细信息)即可访问应用服务中的密钥保管库,只需在 azure 门户中进行少量配置并直接从密钥保管库中获取机密。

在 Azure 中,它们是同一资源组中的资源,只需将应用服务的 object id 添加到 keyvault“访问策略”即可相互通信或进行身份验证或授权。 所有令人头疼的问题都在 azure 的验证上。 这是非常简单、安全和良好的做法。

步骤如下

  1. 为您的 Web 应用程序/应用程序服务启用托管服务标识

    一种。 Select Azure Web 应用程序/应用程序服务中左侧菜单中的“身份”。

    b. 在“系统分配”选项卡中,将“状态”切换更改为“打开”。

    c。几秒钟后,Object ID 将可用,然后复制“对象 ID”。

在此处输入图像描述

  1. 授权 Web App/App Service 访问您的 Key Vault

    一种。 Select 来自“Key Vault”屏幕的“访问策略”。

    b. 单击“添加访问策略”。

    c。提供“获取”和“列表”权限。

    d. 在“Select a Principal”选项中,指定您之前为 Azure Web App/App Service 复制的“对象 ID”的值。

    e. 粘贴、搜索,然后从列表中搜索 select。

    F。 单击“添加”。

    G。 单击“保存”以保留更改并完成该过程。

Provide Permissions

在此处输入图像描述

Copy object Id

在此处输入图像描述

  1. 阅读 .NET Core 中的 Azure Key Vault Secrets

    一种。 安装 NuGet 包

    可以通过以下两种方式之一安装这些软件包:通过集成到 Visual Studio 2019 IDE 中的 NuGet Package 管理器,或通过在 Package 管理器控制台中运行以下命令:

    安装包 Microsoft.Extensions.Azure 和安装包 Azure.Security.KeyVault.Secrets

Note:- In My case, I did not need to install these packages.

b. 从 AzureKeyVault 访问机密

  1. 在 AppSettings 中指定 Vault Uri:- 在 appsettings.json 文件中创建一个名为“KeyVault”的部分,并在其中指定一个名为“VaultUri”的密钥,如下所示。

appsettings.Development.json

{
   "SecretName": "xyz"
}

appsettings.OtherEnv.json

       "KeyVault": {
         "VaultUri": "https://yourkeyvaulturl.vault.azure.net/"
         }
  1. 创建 KeyVaultManagement class
public class KeyVaultManagement
   {
      private readonly IConfiguration _config;

      public KeyVaultManagement(IConfiguration config)
      {
        _config= config;
      }

      public SecretClient SecretClient
      {
        get
         {
            return new SecretClient(
                             new Uri($"{this._config["KeyVault:VaultUri"]}"),
                             new DefaultAzureCredential()) ;
         }
       }
  }
  1. 在 Program.cs 中编写以下代码
.ConfigureAppConfiguration((context, config) =>
{
   var builtConfig = config.Build();
   if (!context.HostingEnvironment.IsDevelopment())
   {
     config.AddAzureKeyVault(new KeyVaultManagement(builtConfig).SecretClient, new KeyVaultSecretManager());
   }
});
  1. 在下面写下需要获取秘密的地方。
var valueofSecret = configuration["SecretName"];

configuration is IConfiguration

Azure Keyvault 访问策略微软文档

如果您的应用程序不是应用程序服务或它是在 .NET 框架中开发的

然后使用证书实现 KEYVAULT

  1. 安装相同的 Nuget 包

  2. 在 Program.cs 中编写以下代码。 可能需要添加 package 或命名空间才能使用证书类

.ConfigureAppConfiguration((context, config) =>
{
   var root = config.Build();
   var KeyVaultName = root["KeyVaultName"];
   var Uri = new Uri($"https://{KeyVaultName}.vault.azure.net/");
   var x509Certifcate = CertifcateHelper.GetCertificate(root["Thumprint"],"KeyVaultCertificate");
   
     config.AddAzureKeyVault(Uri , new ClientCertificateCredential(root["ClientTenantId"], root["ClientAppId"], x509Certifcate));
});

  1. 在 APPSetting 中添加以下行

appsettings.Development.json

{
   "KeyVaultName": "keyvalutname",
   "ClientTenantId": "Get from azure and paste here",
   "ClientAppId": "Get from azure and paste here",
   "Thumbprint": "Get from keyvalut certificate in azure and paste here";
}
  1. 在下面写下需要获取秘密的地方。
var valueofSecret = configuration["SecretName"];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM