Kurz: Vytvoření certifikátu podepsaného svým držitelem pomocí skriptů nasazení

Naučte se používat skripty nasazení v šablonách Azure Resource Manageru (šablony ARM). Skripty nasazení je možné použít k provádění vlastních kroků, které není možné provádět pomocí šablon ARM. Například vytvoření certifikátu podepsaného svým držitelem. V tomto kurzu vytvoříte šablonu pro nasazení trezoru klíčů Azure a pak použijete Microsoft.Resources/deploymentScripts prostředek ve stejné šabloně k vytvoření certifikátu a následnému přidání certifikátu do trezoru klíčů. Další informace o skriptu nasazení najdete v tématu Použití skriptů nasazení v šablonách ARM.

Důležité

Dva prostředky skriptu nasazení, účet úložiště a instance kontejneru, se vytvoří ve stejné skupině prostředků pro spouštění skriptů a řešení potíží. Tyto prostředky obvykle odstraní služba skriptů, když se spuštění skriptu dostane do stavu terminálu. Prostředky se vám budou účtovat, dokud se prostředky nebudou odstraňovat. Další informace najdete v tématu Vyčištění prostředků skriptu nasazení.

Tento kurz se zabývá následujícími úkony:

  • Otevření šablony rychlého startu
  • Úprava šablony
  • Nasazení šablony
  • Ladění neúspěšného skriptu
  • Vyčištění prostředků

Modul Learn, který se zabývá skripty nasazení, najdete v tématu Rozšíření šablon ARM pomocí skriptů nasazení.

Předpoklady

K dokončení tohoto článku potřebujete:

  • Visual Studio Code s rozšířením Resource Manager Tools Viz Rychlý start: Vytváření šablon ARM pomocí editoru Visual Studio Code.

  • Spravovaná identita přiřazená uživatelem. Tato identita se používá k provádění akcí specifických pro Azure ve skriptu. Pokud ho chcete vytvořit, podívejte se na spravovanou identitu přiřazenou uživatelem. Při nasazování šablony potřebujete ID identity. Formát identity je:

    /subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<IdentityID>
    

    Pomocí následujícího skriptu rozhraní příkazového řádku získejte ID zadáním názvu skupiny prostředků a názvu identity.

    echo "Enter the Resource Group name:" &&
    read resourceGroupName &&
    az identity list -g $resourceGroupName
    

Otevření šablony pro rychlý start

Šablonu nemusíte vytvářet od začátku, ale můžete místo toho otevřít některou šablonu pro rychlý start Azure. Šablony pro rychlý start Azure jsou úložištěm pro šablony ARM.

Šablona použitá v tomto rychlém startu se nazývá Vytvoření služby Azure Key Vault a tajný klíč. Šablona vytvoří trezor klíčů a pak do trezoru klíčů přidá tajný kód.

  1. V nástroji Visual Studio Code vyberte File (Soubor) >Open File (Otevřít soubor).

  2. Do pole File name (Název souboru) vložte následující adresu URL:

    https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.keyvault/key-vault-create/azuredeploy.json
    
  3. Výběrem Open (Otevřít) soubor otevřete.

  4. Vyberte File (Soubor) >Save As (Uložit jako) a soubor uložte jako azuredeploy.json na místní počítač.

Úprava šablony

Proveďte v šabloně následující změny:

Vyčištění šablony (volitelné)

Původní šablona přidá tajný kód do trezoru klíčů. Pokud chcete tento kurz zjednodušit, odeberte následující prostředek:

  • Microsoft.KeyVault/vaults/secrets

Odeberte následující dvě definice parametrů:

  • secretName
  • secretValue

Pokud se rozhodnete tyto definice neodebrat, je potřeba zadat hodnoty parametrů během nasazení.

Konfigurace zásad přístupu trezoru klíčů

Skript nasazení přidá do trezoru klíčů certifikát. Nakonfigurujte zásady přístupu trezoru klíčů tak, aby udělily oprávnění spravované identitě:

  1. Přidejte parametr pro získání ID spravované identity:

    "identityId": {
      "type": "string",
      "metadata": {
        "description": "Specifies the ID of the user-assigned managed identity."
      }
    },
    

    Poznámka:

    Rozšíření šablony Resource Manageru editoru Visual Studio Code zatím nedokáže formátovat skripty nasazení. Nepoužívejte Shift+Alt+F k formátování deploymentScripts prostředků, jako je následující.

  2. Přidejte parametr pro konfiguraci zásad přístupu trezoru klíčů, aby spravovaná identita dokázala přidat certifikáty do trezoru klíčů:

    "certificatesPermissions": {
      "type": "array",
      "defaultValue": [
        "get",
        "list",
        "update",
        "create"
      ],
      "metadata": {
      "description": "Specifies the permissions to certificates in the vault. Valid values are: all, get, list, update, create, import, delete, recover, backup, restore, manage contacts, manage certificate authorities, get certificate authorities, list certificate authorities, set certificate authorities, delete certificate authorities."
      }
    }
    
  3. Aktualizujte stávající zásady přístupu trezoru klíčů na:

    "accessPolicies": [
      {
        "objectId": "[parameters('objectId')]",
        "tenantId": "[parameters('tenantId')]",
        "permissions": {
          "keys": "[parameters('keysPermissions')]",
          "secrets": "[parameters('secretsPermissions')]",
          "certificates": "[parameters('certificatesPermissions')]"
        }
      },
      {
        "objectId": "[reference(parameters('identityId'), '2018-11-30').principalId]",
        "tenantId": "[parameters('tenantId')]",
        "permissions": {
          "keys": "[parameters('keysPermissions')]",
          "secrets": "[parameters('secretsPermissions')]",
          "certificates": "[parameters('certificatesPermissions')]"
        }
      }
    ],
    

    Jsou definovány dvě zásady, jedna pro přihlášeného uživatele a druhá pro spravovanou identitu. Přihlášený uživatel potřebuje jenom oprávnění seznamu k ověření nasazení. Pro zjednodušení kurzu se ke spravované identitě i přihlášeným uživatelům přiřadí stejný certifikát.

Přidání skriptu nasazení

  1. Přidejte tři parametry, které skript nasazení používá:

    "certificateName": {
      "type": "string",
      "defaultValue": "DeploymentScripts2019"
    },
    "subjectName": {
      "type": "string",
      "defaultValue": "CN=contoso.com"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
    
  2. deploymentScripts Přidejte prostředek:

    Poznámka:

    Vzhledem k tomu, že vložené skripty nasazení jsou uzavřeny v dvojitých uvozovkách, musí být řetězce uvnitř skriptů nasazení uzavřeny v jednoduchých uvozovkách. Řídicí znak PowerShellu je backtick (`).

    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "createAddCertificate",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]"
      ],
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "[parameters('identityId')]": {
          }
        }
      },
      "kind": "AzurePowerShell",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "3.0",
        "timeout": "PT30M",
        "arguments": "[format(' -vaultName {0} -certificateName {1} -subjectName {2}', parameters('keyVaultName'), parameters('certificateName'), parameters('subjectName'))]", // can pass an argument string, double quotes must be escaped
        "scriptContent": "
          param(
            [string] [Parameter(Mandatory=$true)] $vaultName,
            [string] [Parameter(Mandatory=$true)] $certificateName,
            [string] [Parameter(Mandatory=$true)] $subjectName
          )
    
          $ErrorActionPreference = 'Stop'
          $DeploymentScriptOutputs = @{}
    
          $existingCert = Get-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName
    
          if ($existingCert -and $existingCert.Certificate.Subject -eq $subjectName) {
    
            Write-Host 'Certificate $certificateName in vault $vaultName is already present.'
    
            $DeploymentScriptOutputs['certThumbprint'] = $existingCert.Thumbprint
            $existingCert | Out-String
          }
          else {
            $policy = New-AzKeyVaultCertificatePolicy -SubjectName $subjectName -IssuerName Self -ValidityInMonths 12 -Verbose
    
            # private key is added as a secret that can be retrieved in the Resource Manager template
            Add-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName -CertificatePolicy $policy -Verbose
    
            # it takes a few seconds for KeyVault to finish
            $tries = 0
            do {
              Write-Host 'Waiting for certificate creation completion...'
              Start-Sleep -Seconds 10
              $operation = Get-AzKeyVaultCertificateOperation -VaultName $vaultName -Name $certificateName
              $tries++
    
              if ($operation.Status -eq 'failed')
              {
                throw 'Creating certificate $certificateName in vault $vaultName failed with error $($operation.ErrorMessage)'
              }
    
              if ($tries -gt 120)
              {
                throw 'Timed out waiting for creation of certificate $certificateName in vault $vaultName'
              }
            } while ($operation.Status -ne 'completed')
    
            $newCert = Get-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName
            $DeploymentScriptOutputs['certThumbprint'] = $newCert.Thumbprint
            $newCert | Out-String
          }
        ",
        "cleanupPreference": "OnSuccess",
        "retentionInterval": "P1D"
      }
    }
    

    Prostředek deploymentScripts závisí na prostředku trezoru klíčů a prostředku přiřazení role. Má tyto vlastnosti:

    • identity: Skript nasazení používá spravovanou identitu přiřazenou uživatelem k provádění operací ve skriptu.
    • kind: Zadejte typ skriptu. V současné době se podporují jenom skripty PowerShellu.
    • forceUpdateTag: Určete, jestli se má spustit skript nasazení, i když se zdroj skriptu nezměnil. Může to být aktuální časové razítko nebo identifikátor GUID. Další informace najdete v tématu Spuštění skriptu více než jednou.
    • azPowerShellVersion: Určuje verzi modulu Azure PowerShellu, která se má použít. Skript nasazení v současné době podporuje verzi 2.7.0, 2.8.0 a 3.0.0.
    • timeout: Zadejte maximální povolenou dobu provádění skriptu určenou ve formátu ISO 8601. Výchozí hodnota je P1D.
    • arguments: Zadejte hodnoty parametrů. Hodnoty jsou oddělené mezerami.
    • scriptContent: Zadejte obsah skriptu. Pokud chcete spustit externí skript, použijte primaryScriptURI místo toho. Další informace naleznete v tématu Použití externího skriptu. $DeploymentScriptOutputs Deklarace se vyžaduje pouze při testování skriptu na místním počítači. Deklarace proměnné umožňuje spuštění skriptu na místním počítači a v deploymentScript prostředku bez nutnosti provádět změny. Hodnota přiřazená $DeploymentScriptOutputs je k dispozici jako výstupy v nasazeních. Další informace najdete v tématu Práce s výstupy ze skriptů nasazení PowerShellu nebo Práce s výstupy ze skriptů nasazení rozhraní příkazového řádku.
    • cleanupPreference: Určete předvolbu, kdy chcete odstranit prostředky skriptu nasazení. Výchozí hodnota je Always, což znamená, že prostředky skriptu nasazení se odstraní i přes stav terminálu (Úspěch, Selhání, Zrušeno). V tomto kurzu se používá OnSuccess, abyste získali šanci zobrazit výsledky spuštění skriptu.
    • retentionInterval: Zadejte interval, pro který služba uchovává prostředky skriptu po dosažení stavu terminálu. Prostředky budou odstraněny po uplynutí této doby trvání. Doba trvání je založena na vzoru ISO 8601. Tento kurz používá P1D, což znamená jeden den. Tato vlastnost se používá, pokud cleanupPreference je nastavena na OnExpiration. Tato vlastnost není aktuálně povolená.

    Skript nasazení má tři parametry: keyVaultNamecertificateName, a subjectName. Vytvoří certifikát a pak ho přidá do trezoru klíčů.

    $DeploymentScriptOutputs slouží k ukládání výstupní hodnoty. Další informace najdete v tématu Práce s výstupy ze skriptů nasazení PowerShellu nebo Práce s výstupy ze skriptů nasazení rozhraní příkazového řádku.

    Dokončenou šablonu najdete tady.

  3. Pokud chcete zobrazit proces ladění, umístěte do kódu chybu přidáním následujícího řádku do skriptu nasazení:

    Write-Output1 $keyVaultName
    

    Správný příkaz je Write-Output místo Write-Output1.

  4. Soubor uložte tak, že vyberete File (Soubor) >Save (Uložit).

Nasazení šablony

  1. Přihlášení ke službě Azure Cloud Shell

  2. Vyberte upřednostňované prostředí tak , že v levém horním rohu vyberete PowerShell nebo Bash (pro rozhraní příkazového řádku). Po přepnutí se vyžaduje restartování prostředí.

    Azure portal Cloud Shell upload file

  3. Vyberte Nahrát nebo stáhnout soubory a potom vyberte Nahrát. Viz předchozí snímek obrazovky. Vyberte soubor, který jste uložili v předchozí části. Po nahrání souboru můžete použít ls příkaz a cat příkaz k ověření úspěšného nahrání souboru.

  4. Spuštěním následujícího skriptu Azure CLI nebo Azure PowerShellu šablonu nasaďte.

    echo "Enter a project name that is used to generate resource names:" &&
    read projectName &&
    echo "Enter the location (i.e. centralus):" &&
    read location &&
    echo "Enter your email address used to sign in to Azure:" &&
    read upn &&
    echo "Enter the user-assigned managed identity ID:" &&
    read identityId &&
    adUserId=$((az ad user show --id ${upn}) | jq -r '.id') &&
    resourceGroupName="${projectName}rg" &&
    keyVaultName="${projectName}kv" &&
    az group create --name $resourceGroupName --location $location &&
    az deployment group create --resource-group $resourceGroupName --template-file "$HOME/azuredeploy.json" --parameters identityId=$identityId keyVaultName=$keyVaultName objectId=$adUserId
    

    Služba skriptů nasazení musí pro spuštění skriptu vytvořit další prostředky skriptu nasazení. Příprava a proces čištění může trvat až jednu minutu, než se dokončí kromě skutečné doby provádění skriptu.

    Nasazení selhalo, Write-Output1 protože v skriptu se používá neplatný příkaz. Zobrazí se chybová zpráva:

    The term 'Write-Output1' is not recognized as the name of a cmdlet, function, script file, or operable
    program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
    

    Výsledek spuštění skriptu nasazení je uložen v prostředcích skriptu nasazení pro účely řešení potíží.

Ladění neúspěšného skriptu

  1. Přihlaste se k portálu Azure.

  2. Otevřete skupinu prostředků. Jedná se o název projektu s připojeným argumentem rg . Ve skupině prostředků se zobrazí dva další prostředky. Tyto prostředky se označují jako prostředky skriptu nasazení.

    Resource Manager template deployment script resources

    Oba soubory mají příponu azscripts . Jeden je účet úložiště a druhý je instance kontejneru.

    Výběrem možnosti Zobrazit skryté typy vypíšete deploymentScripts prostředek.

  3. Vyberte účet úložiště s příponou azscripts .

  4. Vyberte dlaždici Sdílené složky . Zobrazí se složka azscripts , která obsahuje soubory spouštění skriptu nasazení.

  5. Vyberte azscripts. Zobrazí se dvě složky azscriptinput a azscriptoutput. Vstupní složka obsahuje systémový soubor skriptu PowerShellu a soubory skriptu nasazení uživatele. Výstupní složka obsahuje soubor executionresult.json a výstupní soubor skriptu. V souboru executionresult.json se zobrazí chybová zpráva. Výstupní soubor tam není, protože spuštění selhalo.

Odeberte čáru Write-Output1 a znovu nasaďte šablonu.

Po úspěšném spuštění druhého nasazení se prostředky skriptu nasazení odeberou službou skriptů, protože cleanupPreference vlastnost je nastavena na OnSuccess.

Vyčištění prostředků

Pokud už nasazené prostředky Azure nepotřebujete, vyčistěte je odstraněním skupiny prostředků.

  1. Na portálu Azure Portal vyberte v nabídce nalevo Skupina prostředků.
  2. Do pole Filtrovat podle názvu zadejte název skupiny prostředků.
  3. Vyberte název skupiny prostředků.
  4. V nabídce nahoře vyberte Odstranit skupinu prostředků.

Další kroky

V tomto kurzu jste se naučili používat skript nasazení v šablonách ARM. Informace o tom, jak nasazovat prostředky Azure na základě podmínek, najdete v tomto tématu: