Usare Azure Key Vault per passare valori di parametro protetti durante la distribuzioneUse Azure Key Vault to pass secure parameter value during deployment

Quando è necessario passare un valore protetto (ad esempio una password) come parametro durante la distribuzione, è possibile recuperare il valore da Azure Key Vault.When you need to pass a secure value (like a password) as a parameter during deployment, you can retrieve the value from an Azure Key Vault. Il valore viene recuperato facendo riferimento all'insieme di credenziali delle chiavi e alla chiave privata nel file dei parametri.You retrieve the value by referencing the key vault and secret in your parameter file. Il valore non viene mai esposto, in quanto si fa riferimento solo all'ID dell'insieme di credenziali chiave.The value is never exposed because you only reference its key vault ID. Non è necessario immettere manualmente il valore segreto ogni volta che si distribuisce le risorse.You do not need to manually enter the value for the secret each time you deploy the resources. L'insieme di credenziali delle chiavi può essere presente in una sottoscrizione diversa rispetto al gruppo di risorse in cui si sta eseguendo la distribuzione.The key vault can exist in a different subscription than the resource group you are deploying to. Quando si fa riferimento all'insieme di credenziali delle chiavi, includere l'ID sottoscrizione.When referencing the key vault, you include the subscription ID.

Quando di crea l'insieme di credenziali delle chiavi, impostare la proprietà enabledForTemplateDeployment su true.When creating the key vault, set the enabledForTemplateDeployment property to true. Impostando questo valore su true, si consente l'accesso dai modelli di Resource Manager durante la distribuzione.By setting this value to true, you permit access from Resource Manager templates during deployment.

Distribuire un insieme di credenziali chiave e una chiave privataDeploy a key vault and secret

Per creare un insieme di credenziali delle chiavi e un segreto, usare l'interfaccia della riga di comando di Azure o PowerShell.To create a key vault and secret, use either Azure CLI or PowerShell. Si noti che l'insieme di credenziali delle chiavi viene abilitato per la distribuzione dei modelli.Notice that the key vault is enabled for template deployment.

Per l'interfaccia della riga di comando di Azure usare:For Azure CLI, use:

vaultname={your-unique-vault-name}
password={password-value}

az group create --name examplegroup --location 'South Central US'
az keyvault create \
  --name $vaultname \
  --resource-group examplegroup \
  --location 'South Central US' \
  --enabled-for-template-deployment true
az keyvault secret set --vault-name $vaultname --name examplesecret --value $password

Per PowerShell, usare:For PowerShell, use:

$vaultname = "{your-unique-vault-name}"
$password = "{password-value}"

New-AzureRmResourceGroup -Name examplegroup -Location "South Central US"
New-AzureRmKeyVault `
  -VaultName $vaultname `
  -ResourceGroupName examplegroup `
  -Location "South Central US" `
  -EnabledForTemplateDeployment
$secretvalue = ConvertTo-SecureString $password -AsPlainText -Force
Set-AzureKeyVaultSecret -VaultName $vaultname -Name "examplesecret" -SecretValue $secretvalue

Abilitare l'accesso alla chiave privataEnable access to the secret

Indipendentemente dal fatto che si usi un insieme di credenziali delle chiavi nuovo o già esistente, assicurarsi che l'utente che distribuisce il modello possa accedere alla chiave privata.Whether you are using a new key vault or an existing one, ensure that the user deploying the template can access the secret. L'utente che distribuisce un modello che fa riferimento a una chiave privata deve disporre dell'autorizzazione Microsoft.KeyVault/vaults/deploy/action per l'insieme di credenziali delle chiavi.The user deploying a template that references a secret must have the Microsoft.KeyVault/vaults/deploy/action permission for the key vault. Entrambi i ruoli Proprietario e Collaboratore possono concedere l'accesso.The Owner and Contributor roles both grant this access.

Fare riferimento a un segreto con un ID staticoReference a secret with static ID

Il modello che riceve un segreto dell'insieme di credenziali delle chiavi è come qualsiasi altro modello.The template that receives a key vault secret is like any other template. Infatti si fa riferimento all'insieme di credenziali delle chiavi nel file dei parametri, non nel modello.That's because you reference the key vault in the parameter file, not the template. Il modello seguente, ad esempio, distribuisce un database SQL che include una password dell'amministratore.For example, the following template deploys a SQL database that includes an administrator password. Il parametro della password è impostato su una stringa sicura,The password parameter is set to a secure string. ma il modello non specifica la provenienza di tale valore.But, the template does not specify where that value comes from.

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

Creare ora un file dei parametri per il modello precedente.Now, create a parameter file for the preceding template. Nel file dei parametri specificare un parametro corrispondente al nome del parametro nel modello.In the parameter file, specify a parameter that matches the name of the parameter in the template. Per il valore del parametro, fare riferimento al segreto dall'insieme di credenziali delle chiavi.For the parameter value, reference the secret from the key vault. Si fa riferimento alla chiave privata passando l'identificatore della risorsa dell'insieme di credenziali chiave e il nome della chiave privata.You reference the secret by passing the resource identifier of the key vault and the name of the secret. Nell'esempio seguente il segreto dell'insieme di credenziali delle chiavi deve esistere già e si deve fornire un valore statico per il relativo ID risorsa.In the following example, the key vault secret must already exist, and you provide a static value for its resource ID.

{
    "$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/examplegroup/providers/Microsoft.KeyVault/vaults/<vault-name>"
              },
              "secretName": "examplesecret"
            }
        },
        "sqlServerName": {
            "value": "<your-server-name>"
        }
    }
}

A questo punto, distribuire il modello e passare il file dei parametri.Now, deploy the template and pass in the parameter file. Per l'interfaccia della riga di comando di Azure usare:For Azure CLI, use:

az group create --name datagroup --location "Central US"
az group deployment create \
    --name exampledeployment \
    --resource-group datagroup \
    --template-file sqlserver.json \
    --parameters @sqlserver.parameters.json

Per PowerShell, usare:For PowerShell, use:

New-AzureRmResourceGroup -Name datagroup -Location "Central US"
New-AzureRmResourceGroupDeployment `
  -Name exampledeployment `
  -ResourceGroupName datagroup `
  -TemplateFile sqlserver.json `
  -TemplateParameterFile sqlserver.parameters.json

Fare riferimento a un segreto con un ID dinamicoReference a secret with dynamic ID

La sezione precedente ha illustrato come passare un ID risorsa statico per il segreto dell'insieme di credenziali delle chiavi.The previous section showed how to pass a static resource ID for the key vault secret. In alcuni scenari, tuttavia, è necessario fare riferimento a un segreto dell'insieme di credenziali delle chiavi che varia a seconda della distribuzione corrente.However, in some scenarios, you need to reference a key vault secret that varies based on the current deployment. In questo caso non è possibile impostare come hardcoded l'ID risorsa nel file dei parametri.In that case, you cannot hard-code the resource ID in the parameters file. Non è sfortunatamente possibile generare in modo dinamico l'ID risorsa nel file dei parametri, perché le espressioni del modello non sono consentite nel file dei parametri.Unfortunately, you cannot dynamically generate the resource ID in the parameters file because template expressions are not permitted in the parameters file.

Per generare in modo dinamico l'ID risorsa per un segreto dell'insieme di credenziali delle chiavi, è necessario spostare la risorsa che necessita del segreto in un modello annidato.To dynamically generate the resource ID for a key vault secret, you must move the resource that needs the secret into a nested template. Nel modello principale aggiungere il modello annidato e passare un parametro che include l'ID risorsa generato in modo dinamico.In your master template, you add the nested template and pass in a parameter that contains the dynamically generated resource ID. Il modello annidato deve essere disponibile tramite un URI esterno.Your nested template must be available through an external URI. Nel resto di questo articolo si presuppone che il modello precedente sia stato aggiunto a un account di archiviazione e sia disponibile tramite l'URI - https://<storage-name>.blob.core.windows.net/templatecontainer/sqlserver.json.The rest of this article assumes you have added the preceding template to a storage account, and it is available through the URI - https://<storage-name>.blob.core.windows.net/templatecontainer/sqlserver.json.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "vaultName": {
        "type": "string"
      },
      "vaultResourceGroup": {
        "type": "string"
      },
      "secretName": {
        "type": "string"
      },
      "adminLogin": {
        "type": "string"
      },
      "sqlServerName": {
        "type": "string"
      }
    },
    "resources": [
    {
      "apiVersion": "2015-01-01",
      "name": "nestedTemplate",
      "type": "Microsoft.Resources/deployments",
      "properties": {
        "mode": "incremental",
        "templateLink": {
          "uri": "https://<storage-name>.blob.core.windows.net/templatecontainer/sqlserver.json",
          "contentVersion": "1.0.0.0"
        },
        "parameters": {
          "adminPassword": {
            "reference": {
              "keyVault": {
                "id": "[resourceId(subscription().subscriptionId,  parameters('vaultResourceGroup'), 'Microsoft.KeyVault/vaults', parameters('vaultName'))]"
              },
              "secretName": "[parameters('secretName')]"
            }
          },
          "adminLogin": { "value": "[parameters('adminLogin')]" },
          "sqlServerName": {"value": "[parameters('sqlServerName')]"}
        }
      }
    }],
    "outputs": {}
}

Distribuire il modello precedente e specificare i valori dei parametri.Deploy the preceding template, and provide values for the parameters.

Passaggi successiviNext steps