【问题标题】:How to pass DevOps release secrets to ARM for Key Vault Deployment如何将 DevOps 发布机密传递给 ARM 以进行 Key Vault 部署
【发布时间】:2020-04-30 06:52:28
【问题描述】:

我正在尝试使用 secretNamesecretValue 部署密钥库,并且我在 azure devops 中创建了一个包含所有机密的变量组,并且我在参数文件中使用以下参数,但是当它被部署时秘密值存储为 $(secret),而不是实际存储在 Azure DevOps 任务组中的密码。

  "secretsObject": {

    "value": {

      "secrets": [

        {

          "secretName": "App012",

          "secretValue": "$(mysecret)"

        },

这就是我在密钥库模板中得到的:

  {

    "type": "Microsoft.KeyVault/vaults/secrets",

    "name": "[concat(parameters('keyVaultName'), '/', parameters('secretsObject').secrets[copyIndex()].secretName)]",

    "apiVersion": "2018-02-14",

    "dependsOn": [

      "[concat('Microsoft.KeyVault/vaults/', parameters('keyVaultName'))]"

    ],

    "copy": {

      "name": "secretsCopy",

      "count": "[length(parameters('secretsObject').secrets)]"

    },

    "properties": {

      "value": "[parameters('secretsObject').secrets[copyIndex()].secretValue]"

    }

  }

]

}

知道如何将“秘密值”作为变量传递吗?

【问题讨论】:

    标签: azure azure-devops azure-keyvault


    【解决方案1】:

    您需要创建一个参数文件,其中包含指向 Key Vault 的密钥/链接。

    这是一个示例:

    {
        "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
            "adminLogin": {
                "value": "exampleadmin"
            },
            "adminPassword": {
                "reference": {
                  "keyVault": {
                    "id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<vault-name>"
                  },
                  "secretName": "ExamplePassword"
                }
            },
            "sqlServerName": {
                "value": "<your-server-name>"
            }
        }
    }
    

    更多信息:

    https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files

    https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/add-template-to-azure-pipelines

    【讨论】:

    • 上面仍然显示参数文件中的密码,我希望密码作为参数文件中的变量 $mypassword 将从 azure devops 变量组中提取。我的模板还创建了一个新的密钥库,然后插入我在参数文件中指定的所有密钥,这些密钥工作正常,但密码在参数文件中清晰可见,因此我希望所有密码都是 $variables,这将从 azure 中提取devops 变量组
    • 这是我在模板文件中的内容:"type": "Microsoft.KeyVault/vaults/secrets", "name": "[concat(parameters('keyVaultName'), '/',参数('secretsObject').secrets[copyIndex()].secretName)]", "apiVersion": "2018-02-14", "dependsOn": ["[concat('Microsoft.KeyVault/vaults/', 参数('keyVaultName'))]" ], "copy": { "name": "secretsCopy", "count": "[length(parameters('secretsObject').secrets)]" }, "properties": { " value": "[parameters('secretsObject').secrets[copyIndex()].secretValue]"
    • 如果您查看我提供的示例,它会显示管理员密码以及指向密钥库的链接,这不是真正的密码。 (“id”:“/subscriptions//resourceGroups//providers/Microsoft.KeyVault/vaults/”)。我从未见过它作为管道变量工作,我不确定它是否可能
    【解决方案2】:

    我相信您会问如何利用存储为变量组的机密,以便通过 Azure DevOps 使用 ARM 模板安全部署。如果是这种情况,请查看在您的发布任务中使用 Override Template Parameters

    这将采用 -NameOfARMParameter $(NameofDevOpsVariable) 的格式

    在您的情况下,它将是 -mysecret $(NameOfDevOpsVariable)

    部署 .json 的参数声明应如下所示:

     "secretValue": {
          "type": "string",
          "metadata": {
            "description": "This is for receiving a value from DevOps releases of the secret to be stored in the key vault"
          }
        },
    "secretName": {
              "type": "string",
              "metadata": {
                "description": "Name of the Secret"
              }
            },
    

    用于实际部署

    {
      "type": "Microsoft.KeyVault/vaults/secrets",
      "name": "[concat(variables('keyVaultName'),'/',parameters('secretName'))]",
      "apiVersion": "2018-02-14",
      "properties": {
        "contentType": "text/plain",
        "value": "[parameters('secretValue')]"
      },
      "dependsOn": [
        "[resourceId('Microsoft.KeyVault/vaults',  variables('keyVaultName'))]"
      ]
    },
    

    如果这些值将从 Dev Ops 提供,则参数文件不需要包含任何内容

    【讨论】:

    • 那是正确的,这就是我所做的,在 devops 中创建了一个具有秘密值和秘密密码的变量组,然后我将它作为变量组链接到版本,然后在我的 arm 模板中我进入参数文件为 "secretsObject": { "value": { "secrets": [ { "secretName": "ActiveDirectory--TenantId", "secretValue": "$(ActiveDirectoryID)" },但是一旦 devops 在我的门户资源组它创建的秘密名称很好,但密码显示为:“$(ActiveDirectoryID)”而不是实际密码
    • 这是因为您的参数文件无法在json文件中查找DevOps变量值的定义。它需要通过发布任务传递到文件中并覆盖来自 DevOps 的参数。 ARM 参数不需要像您在上面所做的那样只是一个名称。事实上,甚至不需要给它赋值。然后 override 参数将使用密钥“覆盖”您的模板值。
    • 那不工作我收到一个错误,在发布管道的日志中发现错误的 json 内容。知道模板和参数文件应该是什么样子吗?模板文件见下文
    • "resources": [ { "type": "secrets", "name": "[parameters('secretName')]", "apiVersion": "2015-06-01", "标签”:{“displayName”:“secret”},“properties”:{“value”:“[parameters('secretValue')]”},“dependsOn”:[“[concat('Microsoft.KeyVault/vaults/ ', 参数('keyVaultName'))]" ] {
    • "type": "Microsoft.KeyVault/vaults/secrets", "name": "[concat(parameters('keyVaultName'), '/', parameters('secretsObject').secrets[ copyIndex()].secretName)]", "apiVersion": "2018-02-14", "dependsOn": ["[concat('Microsoft.KeyVault/vaults/', parameters('keyVaultName'))]"] , "属性": { "value": "[parameters('secretValue')]" }
    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 2020-01-06
    • 2021-11-14
    • 2019-03-25
    • 2018-03-26
    • 2022-01-08
    • 2022-10-05
    • 2020-10-26
    相关资源
    最近更新 更多