Share via


Azure Key Vault gebruiken om tijdens de implementatie een veilige parameterwaarde door te geven

In plaats van een veilige waarde (zoals een wachtwoord) rechtstreeks in uw sjabloon- of parameterbestand te plaatsen, kunt u de waarde ophalen uit een Azure Key Vault tijdens een implementatie. U haalt de waarde op door te verwijzen naar de sleutelkluis en het geheim in uw parameterbestand. De waarde zelf wordt nooit getoond, omdat u alleen verwijst naar de sleutelkluis-id.

Belangrijk

In dit artikel wordt uitgelegd hoe u een gevoelige waarde als sjabloonparameter doorgeeft. Wanneer het geheim wordt doorgegeven als parameter, kan de sleutelkluis bestaan in een ander abonnement dan de resourcegroep waarin u implementeert.

In dit artikel wordt niet beschreven hoe u een eigenschap van een virtuele machine instelt op de URL van een certificaat in een sleutelkluis. Zie Een certificaat van Azure Key Vault installeren op een virtuele machine voor een quickstartsjabloon van dat scenario.

Sleutelkluizen en geheimen implementeren

Als u tijdens de implementatie van een sjabloon toegang wilt krijgen tot een sleutelkluis, stelt u deze in enabledForTemplateDeployment op de sleutelkluis.true

Als u al een sleutelkluis hebt, moet u ervoor zorgen dat sjabloonimplementaties zijn toegestaan.

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

Als u een nieuwe sleutelkluis wilt maken en een geheim wilt toevoegen, gebruikt u:

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"

Als eigenaar van de sleutelkluis hebt u automatisch toegang tot het maken van geheimen. Als u een andere gebruiker geheimen wilt laten maken, gebruikt u:

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

Het toegangsbeleid is niet nodig als de gebruiker een sjabloon implementeert waarmee een geheim wordt opgehaald. Voeg alleen een gebruiker toe aan het toegangsbeleid als de gebruiker rechtstreeks met de geheimen moet werken. De implementatiemachtigingen worden gedefinieerd in de volgende sectie.

Zie voor meer informatie over het maken van sleutelkluizen en het toevoegen van geheimen:

Implementatietoegang verlenen tot de geheimen

De gebruiker die de sjabloon implementeert, moet de Microsoft.KeyVault/vaults/deploy/action machtiging hebben voor het bereik van de resourcegroep en sleutelkluis. Door deze toegang te controleren, voorkomt Azure Resource Manager dat een niet-goedgekeurde gebruiker toegang heeft tot het geheim door de resource-id voor de sleutelkluis door te geven. U kunt implementatietoegang verlenen aan gebruikers zonder schrijftoegang te verlenen tot de geheimen.

De rollen Eigenaar en Inzender verlenen beide deze toegang. Als u de sleutelkluis hebt gemaakt, bent u de eigenaar en hebt u de machtiging.

Voor andere gebruikers verleent u de Microsoft.KeyVault/vaults/deploy/action machtiging. In de volgende procedure ziet u hoe u een rol maakt met de minimale machtiging en deze toewijst aan een gebruiker.

  1. Een JSON-bestand voor een aangepaste roldefinitie maken:

    {
      "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"
      ]
    }
    

    Vervang '00000000-0000-0000-00000-000000000000' door de abonnements-id.

  2. Maak de nieuwe rol met behulp van het JSON-bestand:

    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
    

    De voorbeelden wijzen de aangepaste rol toe aan de gebruiker op het niveau van de resourcegroep.

Wanneer u een sleutelkluis gebruikt met de sjabloon voor een beheerde toepassing, moet u toegang verlenen tot de service-principal van de resourceprovider van het apparaat. Zie Toegangssleutelkluisgeheim bij het implementeren van Azure Managed Applications voor meer informatie.

Naslaginformatie over geheimen met statische id

Met deze methode verwijst u naar de sleutelkluis in het parameterbestand, niet naar de sjabloon. In de volgende afbeelding ziet u hoe het parameterbestand verwijst naar het geheim en deze waarde doorgeeft aan de sjabloon.

Diagram met Integratie van Resource Manager-sleutelkluis met statische id.

Zelfstudie: Azure Key Vault integreren in resource manager-sjabloonimplementatie maakt gebruik van deze methode.

Met de volgende sjabloon wordt een SQL-server geïmplementeerd die een beheerderswachtwoord bevat. De wachtwoordparameter is ingesteld op een beveiligde tekenreeks. De sjabloon geeft echter niet op waar die waarde vandaan komt.

{
  "$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"
      }
    }
  ]
}

Maak nu een parameterbestand voor de voorgaande sjabloon. Geef in het parameterbestand een parameter op die overeenkomt met de naam van de parameter in de sjabloon. Voor de parameterwaarde verwijst u naar het geheim uit de sleutelkluis. U verwijst naar het geheim door de resource-id van de sleutelkluis en de naam van het geheim door te geven:

In het volgende parameterbestand moet het sleutelkluisgeheim al bestaan en geeft u een statische waarde op voor de resource-id.

{
  "$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>"
    }
  }
}

Als u een andere versie van het geheim dan de huidige versie wilt gebruiken, neemt u de secretVersion eigenschap op.

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

Implementeer de sjabloon en geef het parameterbestand door:

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

Referentiegeheimen met dynamische id

In de vorige sectie hebt u gezien hoe u een statische resource-id doorgeeft voor het sleutelkluisgeheim van de parameter. In sommige scenario's moet u verwijzen naar een sleutelkluisgeheim dat varieert op basis van de huidige implementatie. U kunt ook parameterwaarden doorgeven aan de sjabloon in plaats van een verwijzingsparameter te maken in het parameterbestand. De oplossing is het dynamisch genereren van de resource-id voor een sleutelkluisgeheim met behulp van een gekoppelde sjabloon.

U kunt de resource-id niet dynamisch genereren in het parameterbestand omdat sjabloonexpressies niet zijn toegestaan in het parameterbestand.

In de bovenliggende sjabloon voegt u de geneste sjabloon toe en geeft u een parameter door die de dynamisch gegenereerde resource-id bevat. In de volgende afbeelding ziet u hoe een parameter in de gekoppelde sjabloon verwijst naar het geheim.

Diagram waarin het genereren van dynamische id's voor sleutelkluisgeheim wordt geïllustreerd.

Met de volgende sjabloon wordt de sleutelkluis-id dynamisch gemaakt en doorgegeven als parameter.

{
  "$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')]"
            }
          }
        }
      }
    }
  ]
}

Volgende stappen