Použití trezoru klíčů Azure Key Vault k předávání hodnoty zabezpečeného parametru během nasazování

Místo vložení zabezpečené hodnoty (například hesla) přímo do šablony nebo souboru parametrů můžete hodnotu načíst ze služby Azure Key Vault během nasazení. Hodnotu načtete odkazem na trezor klíčů a tajný klíč v souboru parametrů. Tato hodnota se nikdy nezostavuje, protože odkazujete pouze na JEHO ID trezoru klíčů.

Důležité

Tento článek se zaměřuje na to, jak předat citlivou hodnotu jako parametr šablony. Když se tajný klíč předá jako parametr, může trezor klíčů existovat v jiném předplatném než ve skupině prostředků, do které nasazujete.

Tento článek se nezabývá nastavením vlastnosti virtuálního počítače na adresu URL certifikátu v trezoru klíčů. Šablonu rychlého startu tohoto scénáře najdete v tématu Instalace certifikátu ze služby Azure Key Vault na virtuálním počítači.

Nasazení trezorů klíčů a tajných kódů

Pokud chcete získat přístup k trezoru klíčů během nasazování šablony, nastavte enabledForTemplateDeployment ho na true.

Pokud už trezor klíčů máte, ujistěte se, že umožňuje nasazení šablon.

az keyvault update  --name ExampleVault --enabled-for-template-deployment true

Pokud chcete vytvořit nový trezor klíčů a přidat tajný klíč, použijte:

az group create --name ExampleGroup --location centralus
az keyvault create \
  --name ExampleVault \
  --resource-group ExampleGroup \
  --location centralus \
  --enabled-for-template-deployment true
az keyvault secret set --vault-name ExampleVault --name "ExamplePassword" --value "hVFkk965BuUv"

Jako vlastník trezoru klíčů máte automaticky přístup k vytváření tajných kódů. Pokud potřebujete umožnit jinému uživateli vytvářet tajné kódy, použijte:

az keyvault set-policy \
  --upn <user-principal-name> \
  --name ExampleVault \
  --secret-permissions set delete get list

Zásady přístupu nejsou potřeba, pokud uživatel nasazuje šablonu, která načte tajný klíč. Přidejte uživatele do zásad přístupu jenom v případě, že uživatel potřebuje pracovat přímo s tajnými kódy. Oprávnění k nasazení jsou definována v další části.

Další informace o vytváření trezorů klíčů a přidávání tajných kódů najdete v tématech:

Udělení přístupu k tajným kódům nasazení

Uživatel, který šablonu nasadí, musí mít Microsoft.KeyVault/vaults/deploy/action oprávnění pro obor skupiny prostředků a trezoru klíčů. Když tento přístup zkontrolujete, Azure Resource Manager zabrání neschválenému uživateli v přístupu k tajnému kódu předáním ID prostředku trezoru klíčů. Přístup k nasazení můžete udělit uživatelům bez udělení přístupu k zápisu k tajným kódům.

Role Vlastník i Přispěvatel udělí tento přístup. Pokud jste vytvořili trezor klíčů, jste vlastníkem a máte oprávnění.

Ostatním uživatelům udělte Microsoft.KeyVault/vaults/deploy/action oprávnění. Následující postup ukazuje, jak vytvořit roli s minimálním oprávněním a přiřadit ji uživateli.

  1. Vytvořte soubor JSON s vlastní definicí role:

    {
      "Name": "Key Vault resource manager template deployment operator",
      "IsCustom": true,
      "Description": "Lets you deploy a resource manager template with the access to the secrets in the Key Vault.",
      "Actions": [
        "Microsoft.KeyVault/vaults/deploy/action"
      ],
      "NotActions": [],
      "DataActions": [],
      "NotDataActions": [],
      "AssignableScopes": [
        "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
      ]
    }
    

    Nahraďte "0000000-0000-0000-0000-000000000000" ID předplatného.

  2. Vytvořte novou roli pomocí souboru JSON:

    az role definition create --role-definition "<path-to-role-file>"
    az role assignment create \
      --role "Key Vault resource manager template deployment operator" \
      --scope /subscriptions/<Subscription-id>/resourceGroups/<resource-group-name> \
      --assignee <user-principal-name> \
      --resource-group ExampleGroup
    

    Ukázky přiřadí uživateli vlastní roli na úrovni skupiny prostředků.

Při použití trezoru klíčů se šablonou pro spravovanou aplikaci musíte udělit přístup k instančnímu objektu poskytovatele prostředků zařízení. Další informace najdete v tématu Přístup k tajnému kódu služby Key Vault při nasazování spravovaných aplikací Azure.

Odkazovat na tajné kódy se statickým ID

Při tomto přístupu odkazujete na trezor klíčů v souboru parametrů, nikoli na šablonu. Následující obrázek ukazuje, jak soubor parametrů odkazuje na tajný klíč a předá danou hodnotu šabloně.

Diagram znázorňující integraci trezoru klíčů Resource Manageru se statickým ID

Kurz: Integrace služby Azure Key Vault v nasazení šablon Resource Manageru používá tuto metodu.

Následující šablona nasadí sql server, který obsahuje heslo správce. Parametr hesla je nastavený na zabezpečený řetězec. Šablona ale neurčí, odkud tato hodnota pochází.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "sqlServerName": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "adminLogin": {
      "type": "string"
    },
    "adminPassword": {
      "type": "securestring"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Sql/servers",
      "apiVersion": "2021-11-01",
      "name": "[parameters('sqlServerName')]",
      "location": "[parameters('location')]",
      "properties": {
        "administratorLogin": "[parameters('adminLogin')]",
        "administratorLoginPassword": "[parameters('adminPassword')]",
        "version": "12.0"
      }
    }
  ]
}

Teď vytvořte soubor parametrů pro předchozí šablonu. V souboru parametrů zadejte parametr, který odpovídá názvu parametru v šabloně. Pro hodnotu parametru odkazujte na tajný klíč z trezoru klíčů. Na tajný kód odkazujete předáním identifikátoru prostředku trezoru klíčů a názvu tajného kódu:

V následujícím souboru parametrů musí tajný klíč trezoru klíčů již existovat a pro ID prostředku zadáte statickou hodnotu.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-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>"
    }
  }
}

Pokud potřebujete použít jinou verzi tajného kódu než aktuální verzi, uveďte secretVersion vlastnost.

"secretName": "ExamplePassword",
"secretVersion": "cd91b2b7e10e492ebb870a6ee0591b68"

Nasaďte šablonu a předejte soubor parametrů:

az group create --name SqlGroup --location westus2
az deployment group create \
  --resource-group SqlGroup \
  --template-uri <template-file-URI> \
  --parameters <parameter-file>

Referenční tajné kódy s dynamickým ID

Předchozí část ukázala, jak předat statické ID prostředku pro tajný klíč trezoru klíčů z parametru. V některých scénářích potřebujete odkazovat na tajný klíč trezoru klíčů, který se liší podle aktuálního nasazení. Nebo můžete chtít předat do šablony hodnoty parametrů místo vytvoření referenčního parametru v souboru parametrů. Řešením je dynamicky generovat ID prostředku pro tajný klíč trezoru klíčů pomocí propojené šablony.

ID prostředku v souboru parametrů nelze dynamicky generovat, protože v souboru parametrů nejsou povolené výrazy šablony.

Do nadřazené šablony přidáte vnořenou šablonu a předáte parametr, který obsahuje dynamicky generované ID prostředku. Následující obrázek ukazuje, jak parametr v propojené šabloně odkazuje na tajný klíč.

Diagram znázorňující dynamické generování ID pro tajný klíč trezoru klíčů

Následující šablona dynamicky vytvoří ID trezoru klíčů a předá ho jako parametr.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
      "location": {
        "type": "string",
        "defaultValue": "[resourceGroup().location]",
        "metadata": {
          "description": "The location where the resources will be deployed."
        }
      },
      "vaultName": {
        "type": "string",
        "metadata": {
          "description": "The name of the keyvault that contains the secret."
        }
      },
      "secretName": {
        "type": "string",
        "metadata": {
          "description": "The name of the secret."
        }
      },
      "vaultResourceGroupName": {
        "type": "string",
        "metadata": {
          "description": "The name of the resource group that contains the keyvault."
        }
      },
      "vaultSubscription": {
        "type": "string",
        "defaultValue": "[subscription().subscriptionId]",
        "metadata": {
          "description": "The name of the subscription that contains the keyvault."
        }
      }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-10-01",
      "name": "dynamicSecret",
      "properties": {
        "mode": "Incremental",
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
            "adminLogin": {
              "type": "string"
            },
            "adminPassword": {
              "type": "securestring"
            },
            "location": {
              "type": "string"
            }
          },
          "variables": {
            "sqlServerName": "[concat('sql-', uniqueString(resourceGroup().id, 'sql'))]"
          },
          "resources": [
            {
              "type": "Microsoft.Sql/servers",
              "apiVersion": "2021-11-01",
              "name": "[variables('sqlServerName')]",
              "location": "[parameters('location')]",
              "properties": {
                "administratorLogin": "[parameters('adminLogin')]",
                "administratorLoginPassword": "[parameters('adminPassword')]"
              }
            }
          ],
          "outputs": {
            "sqlFQDN": {
              "type": "string",
              "value": "[reference(variables('sqlServerName')).fullyQualifiedDomainName]"
            }
          }
        },
        "parameters": {
          "location": {
            "value": "[parameters('location')]"
          },
          "adminLogin": {
            "value": "ghuser"
          },
          "adminPassword": {
            "reference": {
              "keyVault": {
                "id": "[resourceId(parameters('vaultSubscription'), parameters('vaultResourceGroupName'), 'Microsoft.KeyVault/vaults', parameters('vaultName'))]"
              },
              "secretName": "[parameters('secretName')]"
            }
          }
        }
      }
    }
  ]
}

Další kroky