是否可以使用 ARM 创建 KeyVault,生成密码并在其他 ARM 资源中使用密码?

Is it possible to create KeyVault using ARM, generate password and use the password in other ARM resources?

我想创建 ARM 模板

  1. 创建包含 KeyVault 的资源组;
  2. 使用预定义名称生成新密码,例如 AdminPassword。
  3. 在其他资源中使用密码,例如创建 SQL 数据库时的主密码。

重新部署模板和 KeyVault 以及 AdminPassword 密码时,应使用现有密码。

我找到了使用 KeyVault 机密作为参数的示例,但这是不同的,因为在解析参数时 KeyVault 不存在。

您可以编写示例 ARM teplate 来创建 KeyVault 然后使用其中的 sectets 吗?

如果您在 arm 模板中生成一个秘密——从密钥库中检索它是没有意义的,如果您将秘密传递给模板——同样,检索它也没有任何意义,只需使用它。无论哪种方式,如果你真的热衷于让你的生活更艰难,你可以使用条件和嵌套模板在 arm 模板中破解一些东西

您可以使用 uniqueString 在 ARM 模板中生成密码。

然后创建您的 KeyVault 和 Secret。在 KeyVault 模板的输出中,您可以获得 Secret 的 URI,该 URI 可以注入到另一个资源(例如 Web 应用程序)的应用程序配置中。 https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references

"outputs": {
    "dbSecretUri": {
        "value": "[reference(resourceId('Microsoft.KeyVault/vaults/secrets', parameters('keyVaultName'), 'yourSecretName')).secretUriWithVersion]"
    }
}

您的 Web 应用需要启用托管身份,并且 KeyVault 需要具有允许该应用连接到保管库的访问策略。

这取决于您希望密码的安全性...

如果您希望后续部署使用相同的密码值,那么它必须是确定性的。如果它是确定性的,那么有权访问部署的任何人都可以确定密码。

如果您希望密码是随机的,那么模板每次都会生成一个随机密码,因此后续部署会创建一个新密码。

可以使用用户提供的种子作为密码生成的参数(并使用幂等的uniqueString()),然后只有知道种子并有权访问的人部署可以确定密码。请注意,您的种子必须是 secureString 参数类型。但在这一点上,更好的做法是将密码生成和资源部署的步骤分开。