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 souboru šablony nebo parametru můžete hodnotu načíst z Azure Key Vault během nasazení. Hodnotu načtete odkazem na trezor klíčů a tajný kód v souboru parametrů. Hodnota není nikdy vystavená, protože odkazujete pouze na 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, trezor klíčů může 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 z 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 nasazení šablony, nastavte enabledForTemplateDeployment ho v trezoru klíčů 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ý kód, 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 nechat jiného uživatele 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í nasazení jsou definována v další části.

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

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 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í.

U ostatních uživatelů 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 vlastní soubor JSON definice 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/00000000-0000-0000-0000-000000000000"
      ]
    }
    

    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řazují 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 Key Vault tajný kód při nasazování spravovaných aplikací Azure.

Referenční tajné kódy se statickým ID

V 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ě.

Resource Manager diagram statického ID integrace trezoru klíčů

Kurz: Integrace Azure Key Vault do nasazení šablony Resource Manager 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 nezadává, odkud tato hodnota pochází.

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

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ý kód 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 je potřeba odkazovat na tajný kód trezoru klíčů, který se liší podle aktuálního nasazení. Nebo můžete chtít předat hodnoty parametrů šabloně místo vytvoření referenčního parametru v souboru parametrů. Řešením je dynamicky vygenerovat ID prostředku pro tajný klíč trezoru klíčů pomocí propojené šablony.

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

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

Dynamické ID

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": "2018-06-01-preview",
              "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')]"
            }
          }
        }
      }
    }
  ],
  "outputs": {
  }
}

Další kroky