Testfall för ARM-mallar

I den här artikeln beskrivs tester som körs med malltestverktyget för Azure Resource Manager-mallar (ARM-mallar). Den innehåller exempel som klarar eller misslyckas med testet och innehåller namnet på varje test. Mer information om hur du kör tester eller hur du kör ett visst test finns i Testparametrar.

Använd rätt schema

Testnamn: DeploymentTemplate-schemat är korrekt

I mallen måste du ange ett giltigt schemavärde.

Följande exempel misslyckas eftersom schemat är ogiltigt.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-01-01/deploymentTemplate.json#",
}

I följande exempel visas en varning eftersom schemaversionen 2015-01-01 är inaktuell och inte underhålls.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
}

Följande exempel skickas med ett giltigt schema.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
}

Mallens schema egenskap måste anges till något av följande scheman:

  • https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#
  • https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#
  • https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#
  • https://schema.management.azure.com/schemas/2019-08-01/tenantDeploymentTemplate.json#
  • https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json

Deklarerade parametrar måste användas

Testnamn: Parametrar måste refereras

Det här testet hittar parametrar som inte används i mallen eller parametrar som inte används i ett giltigt uttryck.

Du kan minska förvirringen i mallen genom att ta bort alla parametrar som har definierats men inte används. Om du eliminerar oanvända parametrar förenklas malldistributioner eftersom du inte behöver ange onödiga värden.

I Bicep använder du Linter rule – inga oanvända parametrar.

Följande exempel misslyckas eftersom uttrycket som refererar till en parameter saknar den inledande hakparentesen ([).

"resources": [
  {
    "location": " parameters('location')]"
  }
]

Följande exempel skickas eftersom uttrycket är giltigt.

"resources": [
  {
    "location": "[parameters('location')]"
  }
]

Säkra parametrar kan inte ha hårdkodade standardvärden

Testnamn: Parametrar för säker sträng kan inte ha standard

Ange inte ett hårdkodat standardvärde för en säker parameter i mallen. En säker parameter kan ha en tom sträng som standardvärde eller använda funktionen newGuid i ett uttryck.

Du använder typerna secureString eller secureObject på parametrar som innehåller känsliga värden, till exempel lösenord. När en parameter använder en säker typ loggas eller lagras inte värdet för parametern i distributionshistoriken. Den här åtgärden hindrar en obehörig användare från att identifiera det känsliga värdet.

När du anger ett standardvärde kan det värdet identifieras av alla som har åtkomst till mallen eller distributionshistoriken.

I Bicep använder du Linter rule – standard för säker parameter.

Följande exempel misslyckas.

"parameters": {
  "adminPassword": {
    "defaultValue": "HardcodedPassword",
    "type": "secureString"
  }
}

Nästa exempel skickas.

"parameters": {
  "adminPassword": {
    "type": "secureString"
  }
}

Följande exempel skickas eftersom newGuid funktionen används.

"parameters": {
  "secureParameter": {
    "type": "secureString",
    "defaultValue": "[newGuid()]"
  }
}

Miljö-URL:er kan inte hårdkodas

Testnamn: DeploymentTemplate får inte innehålla hårdkodad URI

Hårdkoda inte miljö-URL:er i mallen. Använd i stället miljöfunktionen för att dynamiskt hämta dessa URL:er under distributionen. En lista över DE URL-värdar som blockeras finns i testfallet.

I Bicep använder du Linter rule – ingen hårdkodad miljö-URL.

Följande exempel misslyckas eftersom URL:en är hårdkodad.

"variables":{
  "AzureURL":"https://management.azure.com"
}

Testet misslyckas också när det används med concat eller URI.

"variables":{
  "AzureSchemaURL1": "[concat('https://','gallery.azure.com')]",
  "AzureSchemaURL2": "[uri('gallery.azure.com','test')]"
}

Följande exempel skickas.

"variables": {
  "AzureSchemaURL": "[environment().gallery]"
}

Platsen använder parametern

Testnamn: Platsen ska inte vara hårdkodad

Om du vill ange en resurss plats ska dina mallar ha en parameter med namnet location med typen inställd på string. I huvudmallen , azuredeploy.json eller mainTemplate.json, kan den här parametern som standard vara platsen för resursgruppen. I länkade eller kapslade mallar ska platsparametern inte ha någon standardplats.

Mallanvändare kan ha begränsad åtkomst till regioner där de kan skapa resurser. En hårdkodad resursplats kan blockera användare från att skapa en resurs. Uttrycket "[resourceGroup().location]" kan blockera användare om resursgruppen har skapats i en region som användaren inte kan komma åt. Användare som blockeras kan inte använda mallen.

Genom att ange en location parameter som är standard för resursgruppens plats kan användarna använda standardvärdet när det är praktiskt men också ange en annan plats.

I Bicep använder du Linter rule – inga platsuttryck utanför parameterns standardvärden.

Följande exempel misslyckas eftersom resursens location är inställd på resourceGroup().location.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-02-01",
      "name": "storageaccount1",
      "location": "[resourceGroup().location]",
      "kind": "StorageV2",
      "sku": {
        "name": "Premium_LRS",
        "tier": "Premium"
      }
    }
  ]
}

I nästa exempel används en location parameter men misslyckas eftersom parametern som standard är en hårdkodad plats.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "westus"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-02-01",
      "name": "storageaccount1",
      "location": "[parameters('location')]",
      "kind": "StorageV2",
      "sku": {
        "name": "Premium_LRS",
        "tier": "Premium"
      }
    }
  ],
  "outputs": {}
}

Följande exempel skickas när mallen används som huvudmall. Skapa en parameter som standard till resursgruppens plats, men som gör att användarna kan ange ett annat värde.

{
  "$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": "Location for the resources."
      }
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-02-01",
      "name": "storageaccount1",
      "location": "[parameters('location')]",
      "kind": "StorageV2",
      "sku": {
        "name": "Premium_LRS",
        "tier": "Premium"
      }
    }
  ],
  "outputs": {}
}

Anteckning

Om föregående exempel används som en länkad mall misslyckas testet. Ta bort standardvärdet när det används som en länkad mall.

Resurser bör ha plats

Testnamn: Resurser ska ha plats

Platsen för en resurs ska anges till ett malluttryck eller global. Malluttrycket använder vanligtvis parametern location som beskrivs i Parameter för platsanvändning.

I Bicep använder du Linter rule – inga hårdkodade platser.

Följande exempel misslyckas eftersom location inte är ett uttryck eller global.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "functions": [],
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-02-01",
      "name": "storageaccount1",
      "location": "westus",
      "kind": "StorageV2",
      "sku": {
        "name": "Premium_LRS",
        "tier": "Premium"
      }
    }
  ],
  "outputs": {}
}

Följande exempel skickas eftersom resursen location är inställd på global.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "functions": [],
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-02-01",
      "name": "storageaccount1",
      "location": "global",
      "kind": "StorageV2",
      "sku": {
        "name": "Premium_LRS",
        "tier": "Premium"
      }
    }
  ],
  "outputs": {}
}

Nästa exempel skickas också eftersom parametern location använder ett uttryck. location Resursen använder uttryckets värde.

{
  "$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": "Location for the resources."
      }
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-02-01",
      "name": "storageaccount1",
      "location": "[parameters('location')]",
      "kind": "StorageV2",
      "sku": {
        "name": "Premium_LRS",
        "tier": "Premium"
      }
    }
  ],
  "outputs": {}
}

VM-storlek använder parameter

Testnamn: Vm-storleken ska vara en parameter

Hårdkoda inte objektets hardwareProfilevmSize. Testet misslyckas när utelämnas hardwareProfile eller innehåller ett hårdkodat värde. Ange en parameter så att användare av mallen kan ändra storleken på den distribuerade virtuella datorn. Mer information finns i Microsoft.Compute virtualMachines.

Följande exempel misslyckas eftersom hardwareProfile objektets vmSize är ett hårdkodat värde.

"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2020-12-01",
    "name": "demoVM",
    "location": "[parameters('location')]",
    "properties": {
      "hardwareProfile": {
        "vmSize": "Standard_D2_v3"
      }
    }
  }
]

Exemplet skickas när en parameter anger ett värde för vmSize:

"parameters": {
  "vmSizeParameter": {
    "type": "string",
    "defaultValue": "Standard_D2_v3",
    "metadata": {
      "description": "Size for the virtual machine."
    }
  }
}

hardwareProfile Sedan använder ett uttryck för för för vmSize att referera till parameterns värde:

"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2020-12-01",
    "name": "demoVM",
    "location": "[parameters('location')]",
    "properties": {
      "hardwareProfile": {
        "vmSize": "[parameters('vmSizeParameter')]"
      }
    }
  }
]

Min- och maxvärden är tal

Testnamn: Minsta och högsta värde är tal

När du definierar en parameter med minValue och maxValueanger du dem som tal. Du måste använda minValue och maxValue som ett par, annars misslyckas testet.

Följande exempel misslyckas eftersom minValue och maxValue är strängar.

"exampleParameter": {
  "type": "int",
  "minValue": "0",
  "maxValue": "10"
}

Följande exempel misslyckas eftersom endast minValue används.

"exampleParameter": {
  "type": "int",
  "minValue": 0
}

I följande exempel skickas eftersom minValue och maxValue är tal.

"exampleParameter": {
  "type": "int",
  "minValue": 0,
  "maxValue": 10
}

Artefaktparametern har definierats korrekt

Testnamn: artefaktparameter

När du inkluderar parametrar för _artifactsLocation och _artifactsLocationSasTokenanvänder du rätt standardvärden och typer. Följande villkor måste uppfyllas för att klara det här testet:

  • Om du anger en parameter måste du ange den andra.
  • _artifactsLocation måste vara en string.
  • _artifactsLocation måste ha ett standardvärde i huvudmallen.
  • _artifactsLocation kan inte ha ett standardvärde i en kapslad mall.
  • _artifactsLocation måste ha antingen "[deployment().properties.templateLink.uri]" eller url:en för den råa lagringsplatsen för standardvärdet.
  • _artifactsLocationSasToken måste vara en secureString.
  • _artifactsLocationSasToken kan bara ha en tom sträng för standardvärdet.
  • _artifactsLocationSasToken kan inte ha ett standardvärde i en kapslad mall.

I Bicep använder du Linter rule – artifacts parameters (Parametrar för artefakter).

Deklarerade variabler måste användas

Testnamn: Variabler måste refereras

Det här testet hittar variabler som inte används i mallen eller som inte används i ett giltigt uttryck. Om du vill minska förvirringen i mallen tar du bort alla variabler som har definierats men inte används.

Variabler som använder elementet copy för att iterera värden måste refereras. Mer information finns i Variabel iteration i ARM-mallar.

I Bicep använder du Linter rule – inga oanvända variabler.

Följande exempel misslyckas eftersom variabeln som använder elementet copy inte refereras till.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "itemCount": {
      "type": "int",
      "defaultValue": 5
    }
  },
  "variables": {
    "copy": [
      {
        "name": "stringArray",
        "count": "[parameters('itemCount')]",
        "input": "[concat('item', copyIndex('stringArray', 1))]"
      }
    ]
  },
  "resources": [],
  "outputs": {}
}

Följande exempel misslyckas eftersom uttrycket som refererar till en variabel saknar den inledande hakparentesen ([).

"outputs": {
  "outputVariable": {
    "type": "string",
    "value": " variables('varExample')]"
  }
}

Följande exempel godkänns eftersom variabeln refereras till i outputs.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "itemCount": {
      "type": "int",
      "defaultValue": 5
    }
  },
  "variables": {
    "copy": [
      {
        "name": "stringArray",
        "count": "[parameters('itemCount')]",
        "input": "[concat('item', copyIndex('stringArray', 1))]"
      }
    ]
  },
  "resources": [],
  "outputs": {
    "arrayResult": {
      "type": "array",
      "value": "[variables('stringArray')]"
    }
  }
}

Följande exempel godkänns eftersom uttrycket är giltigt.

"outputs": {
  "outputVariable": {
    "type": "string",
    "value": "[variables('varExample')]"
  }
}

Dynamisk variabel bör inte använda concat

Testnamn: Dynamiska variabelreferenser bör inte använda concat

Ibland behöver du dynamiskt konstruera en variabel baserat på värdet för en annan variabel eller parameter. Använd inte funktionen concat när du anger värdet. Använd i stället ett objekt som innehåller tillgängliga alternativ och dynamiskt hämta en av egenskaperna från objektet under distributionen.

Följande exempel godkänns. Variabeln currentImage anges dynamiskt under distributionen.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "osType": {
      "type": "string",
      "allowedValues": [
        "Windows",
        "Linux"
      ]
    }
  },
  "variables": {
    "imageOS": {
      "Windows": {
        "image": "Windows Image"
      },
      "Linux": {
        "image": "Linux Image"
      }
    },
    "currentImage": "[variables('imageOS')[parameters('osType')].image]"
  },
  "resources": [],
  "outputs": {
    "result": {
      "type": "string",
      "value": "[variables('currentImage')]"
    }
  }
}

Använda den senaste API-versionen

Testnamn: apiVersioner bör vara senaste

API-versionen för varje resurs bör använda en ny version som är hårdkodad som en sträng. Testet utvärderar API-versionen i mallen mot resursproviderns versioner i verktygslådans cacheminne. En API-version som är mindre än två år från det datum då testet kördes anses vara ny. Använd inte en förhandsversion när en senare version är tillgänglig.

En varning om att en API-version inte bara hittades anger att versionen inte ingår i verktygslådans cacheminne. Med den senaste versionen av ett API, vilket rekommenderas, kan du generera varningen.

Läs mer om toolkit-cachen.

I Bicep använder du Linter rule – använd de senaste API-versionerna.

Följande exempel misslyckas eftersom API-versionen är mer än två år gammal.

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2019-06-01",
    "name": "storageaccount1",
    "location": "[parameters('location')]"
  }
]

Följande exempel misslyckas eftersom en förhandsversion används när en nyare version är tillgänglig.

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2020-08-01-preview",
    "name": "storageaccount1",
    "location": "[parameters('location')]"
  }
]

Följande exempel godkänns eftersom det är en ny version som inte är en förhandsversion.

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2021-02-01",
    "name": "storageaccount1",
    "location": "[parameters('location')]"
  }
]

Använda hårdkodad API-version

Testnamn: Providers apiVersions tillåts inte

API-versionen för en resurstyp avgör vilka egenskaper som är tillgängliga. Ange en hårdkodad API-version i mallen. Hämta inte en API-version som bestäms under distributionen eftersom du inte vet vilka egenskaper som är tillgängliga.

Följande exempel misslyckas.

"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "[providers('Microsoft.Compute', 'virtualMachines').apiVersions[0]]",
    ...
  }
]

Följande exempel godkänns.

"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2020-12-01",
    ...
  }
]

Egenskaper får inte vara tomma

Testnamn: Mallen får inte innehålla tomma värden

Hårdkoda inte egenskaper till ett tomt värde. Tomma värden inkluderar null- och tomma strängar, objekt eller matriser. Om en egenskap är inställd på ett tomt värde tar du bort egenskapen från mallen. Du kan ange en egenskap till ett tomt värde under distributionen, till exempel via en parameter.

Egenskapen template i en kapslad mall kan innehålla tomma egenskaper. Mer information om kapslade mallar finns i Distributioner av Microsoft.Resources.

Följande exempel misslyckas eftersom det finns tomma egenskaper.

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2021-01-01",
    "name": "storageaccount1",
    "location": "[parameters('location')]",
    "sku": {},
    "kind": ""
  }
]

Följande exempel godkänns eftersom egenskaperna innehåller värden.

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2021-01-01",
    "name": "storageaccount1",
    "location": "[parameters('location')]",
    "sku": {
      "name": "Standard_LRS",
      "tier": "Standard"
    },
    "kind": "Storage"
  }
]

Använda resurs-ID-funktioner

Testnamn: ID:t ska härledas från ResourceID:erna

När du anger ett resurs-ID använder du någon av resurs-ID-funktionerna. De tillåtna funktionerna är:

Använd inte funktionen concat för att skapa ett resurs-ID.

I Bicep använder du Linter rule – använd resurs-ID-funktioner.

Följande exempel misslyckas.

"networkSecurityGroup": {
    "id": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/networkSecurityGroups/', variables('networkSecurityGroupName'))]"
}

Nästa exempel skickas.

"networkSecurityGroup": {
    "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}

Funktionen ResourceId har rätt parametrar

Testnamn: ResourceIds får inte innehålla

När du genererar resurs-ID:t ska du inte använda onödiga funktioner för valfria parametrar. Som standard använder funktionen resourceId den aktuella prenumerationen och resursgruppen. Du behöver inte ange dessa värden.

Följande exempel misslyckas eftersom du inte behöver ange det aktuella prenumerations-ID:t och resursgruppens namn.

"networkSecurityGroup": {
    "id": "[resourceId(subscription().subscriptionId, resourceGroup().name, 'Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}

Nästa exempel skickas.

"networkSecurityGroup": {
    "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}

Det här testet gäller för:

För reference och list*misslyckas testet när du använder concat för att konstruera resurs-ID:t.

dependsOn-metodtips

Testnamn: DependsOn Best Practices

När du ställer in distributionsberoenden ska du inte använda if-funktionen för att testa ett villkor. Om en resurs är beroende av en resurs som är villkorligt distribuerad anger du beroendet på samma sätt som med valfri resurs. När en villkorsstyrd resurs inte distribueras tar Azure Resource Manager automatiskt bort den från de beroenden som krävs.

Elementet dependsOn kan inte börja med en sammanlänkningsfunktion .

I Bicep använder du Linter rule – inga onödiga dependsOn-poster.

Följande exempel misslyckas eftersom det innehåller en if funktion.

"dependsOn": [
  "[if(equals(parameters('newOrExisting'),'new'), variables('storageAccountName'), '')]"
]

Följande exempel misslyckas eftersom det börjar med concat.

"dependsOn": [
  "[concat(variables('storageAccountName'))]"
]

Följande exempel godkänns.

"dependsOn": [
  "[variables('storageAccountName')]"
]

Kapslade eller länkade distributioner kan inte använda felsökning

Testnamn: Distributionsresurser får inte felsökas

När du definierar en kapslad eller länkad mall med Microsoft.Resources/deployments resurstypen kan du aktivera felsökning. Felsökning används när du behöver testa en mall men kan exponera känslig information. Innan mallen används i produktion inaktiverar du felsökning. Du kan ta bort debugSetting objektet eller ändra egenskapen detailLevel till none.

Följande exempel misslyckas.

"debugSetting": {
  "detailLevel": "requestContent"
}

Följande exempel godkänns.

"debugSetting": {
  "detailLevel": "none"
}

Admin användarnamn får inte vara literalvärde

Testnamn: adminUsername bör inte vara en literal

När du anger ett adminUserNameska du inte använda ett literalvärde. Skapa en parameter för användarnamnet och använd ett uttryck för att referera till parameterns värde.

I Bicep använder du Linter-regeln – administratörsanvändarnamnet ska inte vara literalt.

Följande exempel misslyckas med ett literalvärde.

"osProfile":  {
  "adminUserName": "myAdmin"
}

Följande exempel skickas med ett uttryck.

"osProfile": {
  "adminUsername": "[parameters('adminUsername')]"
}

Använda den senaste VM-avbildningen

Testnamn: VM-avbildningar bör använda den senaste versionen

Det här testet är inaktiverat, men utdata visar att det har godkänts. Det bästa sättet är att kontrollera mallen efter följande kriterier:

Om mallen innehåller en virtuell dator med en avbildning kontrollerar du att den använder den senaste versionen av avbildningen.

I Bicep använder du Linter-regeln – använd en stabil VM-avbildning.

Använda stabila VM-avbildningar

Testnamn: Virtual Machines bör inte vara förhandsversion

Virtuella datorer bör inte använda förhandsgranskningsbilder. Testet kontrollerar storageProfile för att kontrollera att imageReference inte använder en sträng som innehåller förhandsversion. Och den förhandsversionen används inte i imageReference egenskaperna offer, skueller version.

Mer information om egenskapen finns i imageReferenceMicrosoft.Compute virtualMachines och Microsoft.Compute virtualMachineScaleSets.

I Bicep använder du Linter-regeln – använd en stabil VM-avbildning.

Följande exempel misslyckas eftersom imageReference är en sträng som innehåller förhandsversion.

"properties": {
  "storageProfile": {
    "imageReference": "latest-preview"
  }
}

Följande exempel misslyckas när förhandsversionen används i offer, skueller version.

"properties": {
  "storageProfile": {
    "imageReference": {
      "publisher": "Canonical",
      "offer": "UbuntuServer_preview",
      "sku": "16.04-LTS-preview",
      "version": "preview"
    }
  }
}

Följande exempel godkänns.

"storageProfile": {
  "imageReference": {
    "publisher": "Canonical",
    "offer": "UbuntuServer",
    "sku": "16.04-LTS",
    "version": "latest"
  }
}

Använd inte ManagedIdentity-tillägget

Testnamn: ManagedIdentityExtension får inte användas

Använd inte tillägget på ManagedIdentity en virtuell dator. Tillägget blev inaktuellt 2019 och bör inte längre användas.

Utdata får inte innehålla hemligheter

Testnamn: Utdata får inte innehålla hemligheter

Ta inte med några värden i avsnittet outputs som potentiellt exponerar hemligheter. Till exempel säkra parametrar av typen secureString eller secureObject, eller list* -funktioner som listKeys.

Utdata från en mall lagras i distributionshistoriken, så att en obehörig användare kan hitta den informationen.

I Bicep använder du Linter rule – utdata får inte innehålla hemligheter.

Följande exempel misslyckas eftersom det innehåller en säker parameter i ett utdatavärde.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "secureParam": {
      "type": "secureString"
    }
  },
  "functions": [],
  "variables": {},
  "resources": [],
  "outputs": {
    "badResult": {
      "type": "string",
      "value": "[concat('this is the value ', parameters('secureParam'))]"
    }
  }
}

Följande exempel misslyckas eftersom den använder en list*- funktion i utdata.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageName": {
      "type": "string"
    }
  },
  "functions": [],
  "variables": {},
  "resources": [],
  "outputs": {
    "badResult": {
      "type": "object",
      "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2021-02-01')]"
    }
  }
}

Använda protectedSettings för commandToExecute-hemligheter

Testnamn: CommandToExecute måste använda protectedSettings för hemligheter

För resurser med typen CustomScriptanvänder du krypterade protectedSettings när commandToExecute innehåller hemliga data, till exempel ett lösenord. Hemliga data kan till exempel användas i säkra parametrar av typen secureString eller secureObject, list* -funktioner som listKeys, eller anpassade skript.

Använd inte hemliga data i settings objektet eftersom de använder klartext. Mer information finns i Microsoft.Compute virtualMachines/extensions, Windows eller Linux.

I Bicep använder du Linter rule – använd protectedSettings för commandToExecute-hemligheter.

Följande exempel misslyckas eftersom settings använder commandToExecute med en säker parameter.

"parameters": {
  "adminPassword": {
    "type": "secureString"
  }
}
...
"properties": {
  "type": "CustomScript",
  "settings": {
    "commandToExecute": "[parameters('adminPassword')]"
  }
}

Följande exempel misslyckas på grund av settings användning commandToExecute med en listKeys funktion.

"properties": {
  "type": "CustomScript",
  "settings": {
    "commandToExecute": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2021-02-01')]"
  }
}

Följande exempel skickas eftersom protectedSettings använder commandToExecute med en säker parameter.

"parameters": {
  "adminPassword": {
    "type": "secureString"
  }
}
...
"properties": {
  "type": "CustomScript",
  "protectedSettings": {
    "commandToExecute": "[parameters('adminPassword')]"
  }
}

Följande exempel skickas eftersom protectedSettings använder commandToExecute med en listKeys funktion.

"properties": {
  "type": "CustomScript",
  "protectedSettings": {
    "commandToExecute": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2021-02-01')]"
  }
}

Använda de senaste API-versionerna i referensfunktioner

Testnamn: apiVersioner bör vara senaste i referensfunktioner

API-versionen som används i en referensfunktion måste vara ny och inte en förhandsversion. Testet utvärderar API-versionen i mallen mot resursproviderns versioner i verktygslådans cacheminne. En API-version som är mindre än två år från det datum då testet kördes anses vara ny.

En varning om att en API-version inte bara hittades anger att versionen inte ingår i verktygslådans cacheminne. Med den senaste versionen av ett API, vilket rekommenderas, kan du generera varningen.

Läs mer om toolkit-cachen.

Följande exempel misslyckas eftersom API-versionen är mer än två år gammal.

"outputs": {
  "stgAcct": {
    "type": "string",
    "value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01')]"
  }
}

Följande exempel misslyckas eftersom API-versionen är en förhandsversion.

"outputs": {
  "stgAcct": {
    "type": "string",
    "value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2020-08-01-preview')]"
  }
}

Följande exempel godkänns eftersom API-versionen är mindre än två år gammal och inte är en förhandsversion.

"outputs": {
  "stgAcct": {
    "type": "string",
    "value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-02-01')]"
  }
}

Använda typ och namn i resourceId-funktioner

Testnamn: Resurser bör inte vara tvetydiga

Det här testet är inaktiverat, men utdata visar att det har godkänts. Det bästa sättet är att kontrollera mallen efter följande kriterier:

Ett resourceId måste innehålla en resurstyp och ett resursnamn. Det här testet hittar alla mallfunktioner resourceId och verifierar att resursen används i mallen med rätt syntax. Annars anses funktionen vara tvetydig.

En funktion anses till exempel resourceId vara tvetydig:

  • När en resurs inte hittas i mallen och en resursgrupp inte har angetts.
  • Om en resurs innehåller ett villkor och en resursgrupp inte har angetts.
  • Om en relaterad resurs innehåller vissa men inte alla namnsegment. En underordnad resurs innehåller till exempel mer än ett namnsegment. Mer information finns i resourceId-kommentarer.

Använda inre omfång för kapslade parametrar för säker distribution

Testnamn: Säkra params i kapslade distributioner

Använd den kapslade mallens expressionEvaluationOptions objekt med inner omfång för att utvärdera uttryck som innehåller säkra parametrar av typen secureString eller secureObject eller list* -funktioner som listKeys. Om omfånget outer används utvärderas uttrycken i klartext inom den överordnade mallens omfång. Det säkra värdet visas sedan för alla som har åtkomst till distributionshistoriken. Standardvärdet expressionEvaluationOptions för är outer.

Mer information om kapslade mallar finns i Distributioner av Microsoft.Resources och Utvärderingsomfång för uttryck i kapslade mallar.

I Bicep använder du Linter rule – säkra params i kapslad distribution.

Följande exempel misslyckas eftersom expressionEvaluationOptions använder outer omfång för att utvärdera säkra parametrar eller list* funktioner.

"resources": [
  {
    "type": "Microsoft.Resources/deployments",
    "apiVersion": "2021-04-01",
    "name": "nestedTemplate",
    "properties": {
      "expressionEvaluationOptions": {
        "scope": "outer"
      }
    }
  }
]

Följande exempel skickas eftersom expressionEvaluationOptions använder inner omfång för att utvärdera säkra parametrar eller list* funktioner.

"resources": [
  {
    "type": "Microsoft.Resources/deployments",
    "apiVersion": "2021-04-01",
    "name": "nestedTemplate",
    "properties": {
      "expressionEvaluationOptions": {
        "scope": "inner"
      }
    }
  }
]

Nästa steg