Sdílet prostřednictvím


Návod: Použití skriptů pro nasazení k vytvoření samostatně podepsaného certifikátu

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 pro nasazení skriptu, úložiště a instance kontejneru, jsou vytvořeny ve stejné skupině prostředků pro výkonnost skriptů a diagnostiku problémů. Tyto prostředky obvykle odstraní služba skriptů, když se spuštění skriptu dostane do stavu terminálu. Prostředky vám budou účtovány, dokud nebudou prostředky smazány. Další informace najdete v tématu Vyčištění prostředků skriptu nasazení.

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

  • Otevření šablony rychlého startu
  • Úprava šablony
  • Nasazení šablony
  • Ladit vadný skript
  • Vyčistěte zdroje

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

Požadavky

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

  • 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 rychlého startu

Místo vytvoření šablony úplně od začátku otevřete šablonu ze šablon Azure Pro rychlý start. Š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 editoru Visual Studio Code vyberte Soubor>otevřít.

  2. Do názvu 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 možnosti Otevřít soubor otevřete.

  4. Výběrem možnosti Uložit>jako soubor uložte soubor jako azuredeploy.json do místního počítače.

Ú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."
      }
    },
    
  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 ke klíčovému trezoru prostředku Microsoft.KeyVault/vaults 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 pouze oprávnění list 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. Přidejte deploymentScripts 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. Únikový znak PowerShellu je zpětný apostrof (`).

    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2023-08-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 nasazovacího skriptu se odstraní i přes konečný stav (Úspěšný, Neúspěšný, Zrušený). 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. Vyberte Soubor>Uložit pro uložení souboru.

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). Při změně se vyžaduje restartování prostředí.

    Nahrání souboru v Cloud Shellu na portálu Azure

  3. Vyberte Nahrát nebo stáhnout soubory a pak vyberte Nahrát. Podívejte se na 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í vytvořit další prostředky pro provádění 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íží.

Ladit vadný skript

  1. Přihlaste se do Azure Portalu.

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

    Prostředky skriptu nasazení šablony Resource Manageru

    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 zobrazíte deploymentScripts zdroj.

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

  4. Vyberte dlaždici Sdílené soubory. 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 executionresult.json a výstupní soubor skriptu. Chybová zpráva se zobrazí v executionresult.json. 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čistěte zdroje

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

  1. Na webu Azure Portal vyberte v nabídce vlevo skupinu prostředků .
  2. Do pole Filtrovat podle názvu zadejte název skupiny prostředků.
  3. Vyberte název skupiny prostředků.
  4. V horní nabídce vyberte Odstranit skupinu prostředků .

Další kroky

V tomto kurzu jste se naučili používat skript nasazení v šablonách ARM. Informace o nasazení prostředků Azure na základě podmínek najdete tady: