Ссылки на ключевые хранилища в массиве параметров ARM - PullRequest
0 голосов
/ 04 февраля 2019

Я регулярно использую ссылки на хранилища ключей в моих файлах параметров шаблона в ARM для безопасной передачи секретов.

Теперь, вместо того, чтобы иметь единственные параметры хранилища ключей, я пытаюсь передать массивобъекты, на которые ссылается ключ.Это не работает, к сожалению.Для справочной информации: я пытаюсь развернуть / получить вторичное хранилище ключей из основного хранилища ключей и перенести / скопировать некоторые записи.

Для этого разверните в моем шаблоне следующие ресурсы:

{
            "type": "Microsoft.KeyVault/vaults",
            "name": "my-new-sub-vault",
            "apiVersion": "2015-06-01",
            "location": "[resourceGroup().location]",
            "properties": {
                "enabledForDeployment": "false",
                "enabledForTemplateDeployment": "false",
                "enabledForVolumeEncryption": "false",
                "tenantId": "[subscription().tenantId]",
                "accessPolicies": [
                    {
                        "tenantId": "[subscription().tenantId]",
                        "objectId": "[parameters('msiObjectId')]",
                        "permissions": {
                            "keys": ["get", "list"],
                            "secrets": ["get", "list"]
                        }
                    }
                ],
                "sku": {
                    "name": "Standard",
                    "family": "A"
                }
            }
        },
        {
            "type": "Microsoft.KeyVault/vaults/secrets",
            "name": "[concat('my-new-sub-vault', '/', parameters('secretsObject').secrets[copyIndex()].secretName)]",
            "apiVersion": "2015-06-01",
            "properties": {
                "value": "[parameters('secretsObject').secrets[copyIndex()].secretValue]"
            },
            "dependsOn": [
                "[concat('Microsoft.KeyVault/vaults/my-new-sub-vault')]"
            ],
            "copy": {
                "name": "secretsCopy",
                "count": "[length(parameters('secretsObject').secrets)]"
            }
        }

Есть ли ошибка в моем синтаксисе?Или это невозможно?

Выдается ошибка:

New-AzResourceGroupDeployment: 16:25:54 - Ресурс Microsoft.KeyVault / vaults / secrets 'my-new-Сбой хранилища / my-secret 'с сообщением' {"error": {"code": "BadRequest", "message": "Секрет отсутствует"}} '

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "secretsObject": {
            "value": {
                "secrets": [						
                    ...,
                    {
                        "secretName": "my-secret",
                        "secretValue": {
                            "reference": {
                              "keyVault": {
                                "id": "/subscriptions/subId/resourceGroups/main/providers/Microsoft.KeyVault/vaults/master-vault"
                              },
                              "secretName": "my-secret"
                            }
                        }
                    }
                ]
            }
        }
    }
}

Ура

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Другой вариант - хранить секреты в одном секрете в KeyVault, отформатированном как объект JSON.Затем вы можете написать его с одним ресурсом и прочитать его с одной ссылкой.Вы можете использовать функции string () и json () для преобразования его в объект и в объект, который вы можете использовать во время развертывания.

Чтобы создать «один секрет»:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "keyVaultName": {
      "type": "string",
      "metadata": {
        "description": "Name of the vault"
      }
    },
    "secretName": {
      "type": "string",
      "metadata": {
        "description": "Name of the secret to store in the vault"
      }
    },
    "secretValue": {
      "type": "secureObject",
      "metadata": {
        "description": "Value of the secret to store in the vault"
      }
    }
  },
  "variables": { },
  "resources": [
    {
      "type": "Microsoft.KeyVault/vaults/secrets",
      "name": "[concat(parameters('keyVaultName'), '/', parameters('secretName'))]",
      "apiVersion": "2018-02-14",
      "tags": {
        "displayName": "secret"
      },
      "properties": {
        "value": "[string(parameters('secretValue'))]"
      }
    }
  ]
}

Используйте это, чтобы использовать секреты:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "secretValue": {
      "type": "securestring"
    }
  },
  "variables": {
    "toJSON": "[json(parameters('secretValue'))]"
  },
  "resources": [ ],
  "outputs": {
    "secretValue": {
      "type": "string",
      "value": "[parameters('secretValue')]"
    },
    "singleObj": {
      "type": "object",
      "value": "[variables('toJSON')]"
    },
    "singleProperty": {
      "type": "string",
      "value": "[variables('toJSON').two]"
    }
  }
}

Файл параметров будет содержать объект json с вашими секретами при их создании, а затем вы будете ссылаться, используя синтаксис ссылочного параметра, как в OP.

0 голосов
/ 04 февраля 2019

, которые, к сожалению, не будут работать, однако вы можете обойти это с помощью цикла вложенных шаблонов.что-то вроде этого:

{
    "apiVersion": "2017-05-10",
    "name": "[concat('kvReference-', copyIndex())]",
    "type": "Microsoft.Resources/deployments",
    "copy": {
        "name": "kvReference",
        "count": 2
    },
    "properties": {
        "mode": "Incremental",
        "templateLink": {
            "uri": "[uri(deployment().properties.templateLink.uri, 'nested-kv-reference.json')]"
        },
        "parameters": {
            "parameter": {
                "reference": {
                    "keyVault": {
                        "id": "[variables('kvUri')]"
                    },
                    "secretName": "secretName"
                }
            }
        }
    }
},

и ваш вложенный шаблон должен просто выводить их как есть, тогда вы можете ссылаться на них позже в шаблоне:

reference('kvReference-', copyIndex()).outputs.valueName.value

или вы можете просто использовать их какпараметры во вложенном шаблоне.вы можете сделать их безопасным строковым типом, чтобы значения не отображались в портале \ api.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...