Spring Boot-Azure Key Vault管理Vault访问权限的秘密

时间:2020-03-31 13:15:33

标签: spring azure spring-boot security azure-keyvault

im为我的前端服务开发spring boot应用程序(微服务)后端。 我想开始使用Azure作为这些服务的运行基础结构。 我还想使用Azure Key Vault,因为如果我的理解正确,它将为我带来以下好处:

  • 同一空间/金库中秘密的逻辑分组
  • HSM的可能性
  • 记录/审核
  • 一个地方,可以检索/更改许多应用程序所依赖的秘密,而无需接触应用程序。

我没有得到的是如何在我的Spring Boot应用程序中处理Vault访问。 当我使用azure-key-vault弹簧启动启动器时,我必须在application.properties中设置访问权限,例如本教程:How to use the Spring Boot Starter for Azure Key Vault

但是在我看来,我只是用另一层id / password来保护我的机密,这些人又在我的.propertes文件中以纯文本形式存在,并最终出现在版本控制系统中。

有哪些方法可以解决此问题,保险柜应提供哪些额外的安全保护? 我想念什么?

如果这个问题很重要,我想将我的Spring Boot后端部署为azure Web应用程序资源中的jar。

感谢提前

1 个答案:

答案 0 :(得分:1)

我是Key Vault的Azure SDK的开发人员。 Azure Key Vault提供了一个集中且安全的存储库,该存储库可以使用不同的权限集对多个人,服务主体(应用程序)或托管身份进行身份验证(更多信息将在第二秒内进行验证)。就像维护者可能能够列出,获取和设置机密,密钥和证书,而应用程序和受管理身份可能只能获取并列出(如果出于某种原因需要枚举所有机密,例如某些应用程序配置启动)例行程序以填充与某个模式匹配的所有机密信息)。这提供了一种控制谁可以访问什么内容以及访问程度的方法。

理想情况下-并建议-尽可能使用托管身份。 Managed identities允许您使用由Azure管理的特定ID运行应用。没有提供密码。该应用将以which you can grant access to in a Key Vault身份运行,并具有满足您需求的所有权限。

示例like the one you referenced倾向于使用简单的示例来解释一个概念,但是我们已经意识到并正在尝试更新此类文档以推荐托管身份。

但是,仍然可以相当安全地利用应用程序秘密。一种典型的方法是,只有很少的人知道这些秘密(他们自己可以存储在Key Vault中,并且只有少数人可以访问该密钥库以列出和获取值-因为无论如何您都需要访问权限才能添加它们) ),然后将它们作为环境变量添加到您的应用程序中。 Azure和其他服务(GitHub,AppVeyor等)通常具有保护机密的方法。

例如,您的应用程序可以使用在进行手部安全之前设置的环境变量,如下所示:

AZURE_TENANT_ID="some GUID - doesn't really have to be secret, but doesn't hurt"
AZURE_CLIENT_ID="secret GUID for service principal ID"
AZURE_CLIENT_SECRET="secret value for service principal ID"

然后,使用我们的Azure。*包,您的代码可以执行以下操作:

SecretAsyncClient secretAsyncClient = new SecretClientBuilder()
  .vaultUrl("https://myvault.vault.azure.net/")
  .credential(new DefaultAzureCredentialBuilder().build())
  .buildAsyncClient();

String secret;
secretAsyncClient.getSecret("secretName")
  .subscribe(secretWithVersion ->
    secret = secretWithVersion.getValue());

您可以使用它,或者-更好-使用其他服务主体进行开发。在开发Azure Key Vault SDK时,我设置了自己的SP(仅用于开发目的),而我们的测试运行者则使用Azure DevOps pulled from an authenticated Key Vault connection中的变量来使用另一个SP。

您可以进一步将其扩展到不同的开发,测试和生产环境,每个环境都可以具有单独的服务主体以访问不同的保管库(也许可以通过减少授权的应用程序/人员来保持产品保管库更加安全)。

希望这会有所帮助。如果您还有其他问题,请告诉我。