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: DistributionMallschemat ä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 vara inställd på 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 parametrarna som inte används i ett giltigt uttryck.
Om du vill minska förvirringen i mallen tar du 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-regeln – inga parametrar som inte används.
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årdkodad standard
Testnamn: Säkra strängparametrar 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 de typer 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 inte värdet för parametern eller lagras 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-regeln – 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]"
}
Plats använder parameter
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 bör 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 är blockerade 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 även ange en annan plats.
I Bicep använder du Linter-regeln – 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 är standard för 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": {}
}
Kommentar
Om föregående exempel används som en länkad mall misslyckas testet. När du använder den som en länkad mall tar du bort standardvärdet.
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 parametern Platsanvändning.
I Bicep använder du Linter-regeln – inga hårdkodade platser.
Följande exempel misslyckas eftersom location
är inte 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-storlek ska vara en parameter
Hårdkoda hardwareProfile
inte objektets 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
Använder sedan ett uttryck 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')]"
}
}
}
]
Minsta och högsta vä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 eller så 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
}
Följande exempel skickas eftersom minValue
och maxValue
är tal.
"exampleParameter": {
"type": "int",
"minValue": 0,
"maxValue": 10
}
Parametern Artifacts har definierats korrekt
Testnamn: parameter för artefakter
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 den råa lagringsplatsens URL för dess standardvärde._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-regel – artefakterparametrar.
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. För att 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-regeln – 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 skickas 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 skickas 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 måste 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 skickas. 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 gammal från det datum då testet kördes anses vara ny. Använd inte en förhandsversion när en nyare version är tillgänglig.
En varning om att en API-version inte hittades anger bara att versionen inte ingår i verktygslådans cacheminne. Med den senaste versionen av ett API, vilket rekommenderas, kan du generera varningen.
I Bicep använder du Linter-regeln – 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 skickas 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 skickas.
"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 ett tomt värde för en egenskap 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 skickas 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:ts funktioner. De tillåtna funktionerna är:
Använd inte funktionen concat för att skapa ett resurs-ID.
I Bicep använder du Linter-regeln – 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 best practices
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 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-regeln – 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 skickas.
"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 skickas.
"debugSetting": {
"detailLevel": "none"
}
Administratörsanvändarnamn får inte vara literala värden
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örens användarnamn 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: Virtuella datorer bör inte förhandsgranskas
Virtuella datorer bör inte använda förhandsgranskningsbilder. Testet kontrollerar storageProfile
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 skickas.
"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
Tillämpa inte tillägget på ManagedIdentity
en virtuell dator. Tillägget blev inaktuellt 2019 och bör inte längre användas.
Utdata kan 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 , eller list*-funktioner, till exempel listKeys
secureObject
.
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-regeln – utdata ska 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 det 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. Till exempel kan hemliga data 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 det använder klartext. Mer information finns i Microsoft.Compute virtualMachines/extensions, Windows eller Linux.
I Bicep använder du Linter-regeln – använd protectedSettings för commandToExecute-hemligheter.
Följande exempel misslyckas eftersom settings
det används commandToExecute
med en säker parameter.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
...
"properties": {
"type": "CustomScript",
"settings": {
"commandToExecute": "[parameters('adminPassword')]"
}
}
Följande exempel misslyckas eftersom settings
det används 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 gammal från det datum då testet kördes anses vara ny.
En varning om att en API-version inte hittades anger bara att versionen inte ingår i verktygslådans cacheminne. Med den senaste versionen av ett API, vilket rekommenderas, kan du generera varningen.
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 skickas 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 mallens resourceId
funktioner 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 distributionssäkerhetsparametrar
Testnamn: Säkra params i kapslade distributioner
Använd den kapslade mallens objekt med inner
omfång för att utvärdera uttryck som innehåller säkra parametrar av typen secureString
eller secureObject
eller listan* funktioner som listKeys
.expressionEvaluationOptions
Om omfånget outer
används utvärderas uttryck 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-regeln – 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 verifiera 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.