【问题标题】:Bicep: Creating random string二头肌:创建随机字符串
【发布时间】:2021-09-04 21:21:27
【问题描述】:

我来自 Terraform 背景和 AWS。现在我在 Azure 中使用 Bicep,所以请多多包涵 :)

在 Terraform 中,我们使用 random_password 资源创建随机密码。然后,我们将其作为一个值存储在 AWS Systems Manager Parameter Store 中。这使我们能够拥有安全(足够...)密码,这些密码被创建并存储在一些安全的数据库中,而我们无需输入甚至知道密码。如果有人需要知道密码,它会被记录下来。可爱的;)

现在...

我如何对二头肌做这样的事情?我只找到uniqueString() 函数。但这只会创建 13 个字符长的随机字符串,也没有任何“特殊”字符,如 !@#$%&*()-_=+[]{}<>:? 等。

出于非常明显的原因,我不想在我的代码中包含某种声明,它将秘密设置为一些清晰可读的值。这就是我们在 Terraform 中使用 random_password 的原因。

在二头肌中解决这个问题的正确方法是什么?

我找到了博文"Automatically generate a password for an Azure SQL database with ARM template" by Vivien Chevallier,但这并不好,IMO。为了规避uniqueString()函数的缺点并使其符合密码复杂性规则,该人添加了常量前缀“P”和后缀“x!”。这会降低密码的质量,因为现在有 3 个已知字符。 16 个。

【问题讨论】:

  • 您能使用脚本生成密码吗?然后在部署模板时在属性文件中临时设置它们?

标签: azure infrastructure-as-code azure-bicep


【解决方案1】:

uniqueString() 根本不是用来生成密码的,它是用来生成资源名称的。

据我所知,在 Bicep/ARM 模板中没有专门的方法来生成密码。 我们所做的是使用密码生成器生成具有足够长度和复杂性的密码,并将其作为机密存储在 Azure DevOps 变量组中。 然后我们将它们作为安全字符串参数传递给模板,因此它们不会在任何地方被记录。 我们也不会将这些生成的密码存储在其他任何地方,它们在生成它们并将它们存储在 Azure DevOps 中后会被丢弃。

【讨论】:

  • 嗯。这是非常令人失望的。所以要建立完整的基础设施,Bicep 还不够吗?我做对了吗?必须依靠一些外部工具来创建随机字符串?注册。 “Azure DevOps 变量组” - 你的意思是“az 管道变量组”(只是问一下,因为我还是新手,因此正在寻找正确的方法)?
  • 是的,我的意思是你提到的命令管理的那些组。
  • 查看密钥保管库参数参考。最好的方法是使用您的密码(分别托管、生成和轮换)在 azure 中创建一个保管库,并在部署中使用该保管库中的值。有了密码,我觉得这通常是一个鸡和蛋的问题:)
【解决方案2】:

二头肌不支持此功能,也没有基于request in their repo 的此类计划。

这不是我们想要生成加密安全密码的事情,基于资源类型的各种限制最好在部署脚本中处理或使用密钥库生成密码。

【讨论】:

    【解决方案3】:

    Bicep 的目的是创建完全幂等的模板,以便每次尝试在 Bicep 中部署任何东西时都应该收到相同的输出。因此,randomString 和 newGuid 都接受可用于播种结果的参数,但您输入的新值始终会得到相同的结果。

    由于上述原因,我们鼓励您提供自己生成的密码以在外部启动模板部署,因此 Bicep 模板不会从一种部署更改为另一种部署。最重要的是,不鼓励您在输出值中公开密码,因为这些都是无限期记录的,因此我强烈建议您将值写入 Key Vault 机密,如下所示

    @secure() //Prevents it from being logged, but also removes it from output
    param password string = newGuid() //Can only be used as the default value for a param
    
    @description('The name of the Key Vault to save the secret to')
    param KeyVaultName string
    
    @description('The name of the secret in Key Vault')
    param KeyVaultSecretName string
    
    //Save as Key Vault secret
    resource KeyVault 'Microsoft.KeyVault/vaults@2021-06-01-preview' existing = {
      name: KeyVaultName
    }
    
    resource KVSecret 'Microsoft.KeyVault/vaults/secrets@2021-06-01-preview' = {
      name: replace(replace(SecretName, '.', '-'), ' ', '-')
      parent: KeyVault
      properties: {
        contentType: 'text/plain'
        attributes: {
          enabled: true
        }
        value: password
      }
    }
    
    output PasswordSecretUri string = KVSecret.properties.secretUri
    

    然后您可以使用 GUID 输出作为您用例的密码,因为每次运行 Bicep 部署时它都会有所不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 2011-02-28
      • 2014-10-20
      • 1970-01-01
      • 2022-06-29
      相关资源
      最近更新 更多