有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Spring api和托管服务标识获取密钥库机密

由于一些新的安全要求,我现在开发的api需要将几个URL、azure帐户名等存储在azure密钥库中,而不是应用程序中。yml配置文件

问题是,我在本地环境中验证/访问密钥保管库客户端时遇到问题。我对azure函数/密钥库本身的访问非常有限,因此目前几乎不可能测试我正在编写的新代码:

 public String getSecretFromKeyVault(String key) {

        /**
        * Breaks in the constructor call, as the system.env variables for MSI_ENDPOINT and MSI_SECRET are null.
        **/

        AppServiceMSICredentials credentials = new AppServiceMSICredentials(AzureEnvironment.AZURE);
        KeyVaultClient client = new KeyVaultClient(credentials);

        SecretBundle secret = client.getSecret("url-for-key-vault", key);
       return secret.value();

    }

我知道这些变量将在云服务器中设置,但我的问题是我如何才能最好地验证vault调用是否已正确执行(单元、集成、e2e本地测试),以及我如何在本地开发/运行时使用关键的vault调用

MSI的替代方法是在对active directory进行身份验证后手动输入客户端id和密钥。这可能是本地开发的解决方案,但仍需要在源代码中声明机密信息

在运行服务器之前,我还尝试使用az login登录azure,但也没有成功

有没有人对我如何解决这个问题有什么建议,或者我的最佳选择是什么

申请须知:

  • Java版本:8
  • 弹簧靴
  • Azure/vsts开发和部署环境

共 (1) 个答案

  1. # 1 楼答案

    由于您使用的是spring boot,因此最好使用Microsoft的属性源实现,该实现将keyvault属性映射到spring属性,并且对于本地开发和测试,您可以在属性文件中设置等效属性

    使用弹簧轮廓。假设您有azurelocal配置文件。在application-azure.yml文件中,配置应用程序以使用keyvault:

    # endpoint on the azure internal network for getting the identity access token
    
    MSI_ENDPOINT: http://169.254.169.254/metadata/identity/oauth2/token
    MSI_SECRET: unused
    
    # this property triggers the use of keyvault for properties
    
    azure.keyvault:
      uri: https://<your-keyvault-name>.vault.azure.net/
    

    现在,您可以将spring上下文中的秘密属性注入到变量中,这些属性将从keyvault中读取:

      @Value("${superSecretValue}")
      String secretValue;
    

    为了在本地进行测试,可以在application-local.yml文件中将secret属性设置为适当的值:

    superSecretValue: dummy-for-testing-locally
    

    需要添加到build.gradle的Azure依赖项是:

    implementation "com.microsoft.azure:azure-keyvault-secrets-spring-boot-starter:2.1.6"
    

    部署时以azure作为活动配置文件运行spring boot jar,在azure之外测试和开发时以local作为活动配置文件运行spring boot jar。这是通过azure java容器测试和使用的