由于一些新的安全性要求,我现在正在开发的api需要在azure密钥库中而不是application.yml配置文件中存储多个URL,Azure帐户名等。
问题是我在本地环境中无法验证/访问密钥库客户端。我对azure函数/密钥库本身的访问非常有限,因此目前几乎无法测试正在编写的新代码:
# create an instance of the API class
api_instance = kubernetes.client.CertificatesV1beta1Api(kubernetes.client.ApiClient(configuration))
name = 'name_example' # str | name of the CertificateSigningRequest
body = kubernetes.client.V1beta1CertificateSigningRequest() # V1beta1CertificateSigningRequest |
dry_run = 'dry_run_example' # str | When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed (optional)
pretty = 'pretty_example' # str | If 'true', then the output is pretty printed. (optional)
try:
api_response = api_instance.replace_certificate_signing_request_approval(name, body, dry_run=dry_run, pretty=pretty)
pprint(api_response)
except ApiException as e:
print("Exception when calling CertificatesV1beta1Api->replace_certificate_signing_request_approval: %s\n" % e)
我知道变量将在云服务器中设置,但是我的问题是我如何才能最好地验证保险库调用是否已正确实施(单元,集成,端到端本地测试) ),以及在本地开发/运行时如何使用密钥库调用?
MSI的替代方法是在对活动目录进行身份验证之后,手动输入客户端ID和密钥。这可能是本地开发的解决方案,但仍然需要在源代码中声明机密信息。
我还尝试了在运行服务器之前使用 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();
}
登录到Azure的方法,但这还是行不通的。
有人对我如何解决此问题或我的最佳选择有何建议?
答案 0 :(得分:0)
由于您使用的是spring-boot,因此最好使用Microsoft的属性源实现,该实现将keyvault属性映射到Spring属性,并且对于本地开发和测试,您可以在属性文件中设置等效属性。
使用Spring配置文件。假设您有azure
和local
个人资料。在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
作为活动配置文件,而在进行测试和远离天蓝色开发时使用local
作为运行配置文件运行spring-boot jar。这已经过测试并且可以与Azure Java容器一起使用。