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 hardwareProfile
vmSize
. 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 maxValue
anger 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 _artifactsLocationSasToken
anvä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 enstring
._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 ensecureString
._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 adminUserName
ska 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
, sku
eller version
.
Mer information om egenskapen finns i imageReference
Microsoft.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
, sku
eller 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 CustomScript
anvä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
- Mer information om hur du kör testverktyget finns i Använda TESTverktyg för ARM-mallar.
- En Learn-modul som beskriver hur du använder testverktyget finns i Förhandsgranska ändringar och validera Azure-resurser med hjälp av what-if och testverktyget för ARM-mallar.
- Information om hur du testar parameterfiler finns i Testfall för parameterfiler.
- För createUiDefinition-tester, se Testfall för createUiDefinition.json.
- Mer information om tester för alla filer finns i Testfall för alla filer.