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 (jako je heslo) přímo do šablony nebo souboru parametrů můžete hodnotu načíst z azure Key Vault během nasazení. Hodnotu načtete odkazem na trezor klíčů a tajný klíč v souboru parametrů. Hodnota není nikdy zpřístupněna, 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, může trezor klíčů existovat v jiném předplatném než ve skupině prostředků, do které nasazujete.

Tento článek nepopisuje, jak nastavit vlastnost virtuálního počítače na adresu URL certifikátu v trezoru klíčů. Šablonu pro rychlý start 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 nasazování šablony, nastavte enabledForTemplateDeployment u trezoru klíčů hodnotu 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 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čítá tajný kód. 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í k oboru skupiny prostředků a trezoru klíčů. Kontrolou tohoto přístupu 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 pro trezor klíčů. Uživatelům můžete udělit přístup k nasazení, aniž byste jim udělili přístup pro zápis do tajných kódů.

Role Vlastník a Přispěvatel tento přístup uděluje. Pokud jste vytvořili trezor klíčů, jste vlastníkem a máte k tomu 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 definicí vlastní 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 00000000-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ého klíče při nasazování spravovaných aplikací Azure.

Odkaz 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ává danou hodnotu šabloně.

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

Kurz: Integrace Azure Key Vault v nasazení šablony Resource Manager používá tuto metodu.

Následující šablona nasadí SQL Server, který obsahuje heslo správce. Parametr password 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ě. Jako hodnotu parametru odkážte 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ů už musí tajný kód trezoru klíčů existovat a zadat statickou hodnotu pro jeho ID prostředku.

{
  "$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ž je aktuální verze, zahrň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 ID statického 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ší v závislosti na aktuálním 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 vygenerovat ID prostředku pro tajný klíč trezoru klíčů pomocí propojené šablony.

V souboru parametrů nemůžete dynamicky vygenerovat ID prostředku, protože výrazy šablony nejsou v souboru parametrů povoleny.

V nadřazené šabloně 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ý kód 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