Övning – Lägga till en parameterfil och säkra parametrar
I den här övningen skapar du en parameterfil som innehåller värden för den Bicep-fil som du skapade tidigare. I samma parameterfil lägger du också till Azure Key Vault-referenser för att på ett säkert sätt tillhandahålla känslig information.
Under processen utför du följande uppgifter:
- Lägg till några säkra parametrar.
- Skapa en parameterfil.
- Testa distributionen för att säkerställa att parameterfilen är giltig.
- Skapa ett nyckelvalv och hemligheter.
- Uppdatera parameterfilen så att den refererar till key vault-hemligheterna.
- Testa distributionen igen för att säkerställa att parameterfilen fortfarande är giltig.
Ta bort standardvärdet för App Service-planens SKU
Om du vill att mallen ska fungera i olika miljöer kommer Azure App Service-planens SKU-information att anges i en parameterfil i stället för som ett standardvärde.
I filen main.bicep i Visual Studio Code uppdaterar du parametern appServicePlanSku
för att ta bort standardvärdet.
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
Lägg till nya parametrar
Nu måste du lägga till en SQL-server och databas. Först lägger du till parametrar för administratörsinloggning och lösenord samt databasens SKU. Du anger deras värden senare.
I filen main.bicep i Visual Studio Code lägger du till parametrarna sqlServerAdministratorLogin
, sqlServerAdministratorPassword
och sqlDatabaseSku
under de aktuella parameterdeklarationerna. När du är klar bör parameterdeklarationerna se ut så här:
@description('The name of the environment. This must be dev, test, or prod.')
@allowed([
'dev'
'test'
'prod'
])
param environmentName string = 'dev'
@description('The unique name of the solution. This is used to ensure that resource names are unique.')
@minLength(5)
@maxLength(30)
param solutionName string = 'toyhr${uniqueString(resourceGroup().id)}'
@description('The number of App Service plan instances.')
@minValue(1)
@maxValue(10)
param appServicePlanInstanceCount int = 1
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
@description('The Azure region into which the resources should be deployed.')
param location string = 'eastus'
@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string
@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorPassword string
@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object
Observera att du inte anger standardvärden för parametrarna sqlServerAdministratorLogin
och sqlServerAdministratorPassword
. Det är en felaktig säkerhetspraxis att lägga till standardvärden för säkra parametrar. Du anger inte heller något standardvärde för sqlDatabaseSku
. Du anger ett värde i en parameterfil.
Lägga till nya variabler
I filen main.bicep i Visual Studio Code lägger du till sqlServerName
variablerna och sqlDatabaseName
under de befintliga variablerna. När du är klar bör dina variabeldeklarationer se ut så här:
var appServicePlanName = '${environmentName}-${solutionName}-plan'
var appServiceAppName = '${environmentName}-${solutionName}-app'
var sqlServerName = '${environmentName}-${solutionName}-sql'
var sqlDatabaseName = 'Employees'
Lägga till SQL-server- och databasresurser
I filen main.bicep i Visual Studio Code lägger du till följande kod längst ned i filen:
resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = { name: sqlServerName location: location properties: { administratorLogin: sqlServerAdministratorLogin administratorLoginPassword: sqlServerAdministratorPassword } } resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-08-01-preview' = { parent: sqlServer name: sqlDatabaseName location: location sku: { name: sqlDatabaseSku.name tier: sqlDatabaseSku.tier } }
Spara ändringarna i filen.
Verifiera Bicep-filen
När du har slutfört alla föregående ändringar bör Bicep-filen se ut så här:
@description('The name of the environment. This must be dev, test, or prod.')
@allowed([
'dev'
'test'
'prod'
])
param environmentName string = 'dev'
@description('The unique name of the solution. This is used to ensure that resource names are unique.')
@minLength(5)
@maxLength(30)
param solutionName string = 'toyhr${uniqueString(resourceGroup().id)}'
@description('The number of App Service plan instances.')
@minValue(1)
@maxValue(10)
param appServicePlanInstanceCount int = 1
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
@description('The Azure region into which the resources should be deployed.')
param location string = 'eastus'
@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string
@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorPassword string
@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object
var appServicePlanName = '${environmentName}-${solutionName}-plan'
var appServiceAppName = '${environmentName}-${solutionName}-app'
var sqlServerName = '${environmentName}-${solutionName}-sql'
var sqlDatabaseName = 'Employees'
resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
name: appServicePlanName
location: location
sku: {
name: appServicePlanSku.name
tier: appServicePlanSku.tier
capacity: appServicePlanInstanceCount
}
}
resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
name: appServiceAppName
location: location
properties: {
serverFarmId: appServicePlan.id
httpsOnly: true
}
}
resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
name: sqlServerName
location: location
properties: {
administratorLogin: sqlServerAdministratorLogin
administratorLoginPassword: sqlServerAdministratorPassword
}
}
resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-08-01-preview' = {
parent: sqlServer
name: sqlDatabaseName
location: location
sku: {
name: sqlDatabaseSku.name
tier: sqlDatabaseSku.tier
}
}
Om den inte gör det kopierar du antingen exemplet eller justerar mallen så att den matchar exemplet.
Skapa en parameterfil
Öppna Visual Studio Code och öppna mappen där filen main.bicep finns. Skapa en ny fil med namnet main.parameters.dev.json i samma mapp.
Lägg till följande kod i filen main.parameters.dev.json :
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "appServicePlanSku": { "value": { "name": "F1", "tier": "Free" } }, "sqlDatabaseSku": { "value": { "name": "Standard", "tier": "Standard" } } } }
Spara ändringarna i filen.
Distribuera Bicep-mallen med parameterfilen
Kör följande Azure CLI-kommando i terminalen. Observera att du tillhandahåller en parameterfil för distributionen.
az deployment group create \
--template-file main.bicep \
--parameters main.parameters.dev.json
Kör följande Azure PowerShell-kommando i terminalen. Observera att du tillhandahåller en parameterfil för distributionen.
New-AzResourceGroupDeployment `
-TemplateFile main.bicep `
-TemplateParameterFile main.parameters.dev.json
Du uppmanas att ange värdena för sqlServerAdministratorLogin
och sqlServerAdministratorPassword
parametrarna när du kör distributionen. Du behöver inte ange solutionName
eftersom det har ett standardvärde som anges i mallen. Du behöver inte ange de andra parametervärdena eftersom deras värden anges i parameterfilen.
Dricks
När du anger de säkra parametrarna måste de värden du väljer följa några regler:
sqlServerAdministratorLogin
får inte vara ett lätt att gissa inloggningsnamn somadmin
ellerroot
. Den kan bara innehålla alfanumeriska tecken och måste börja med en bokstav.sqlServerAdministratorPassword
måste vara minst åtta tecken långt och innehålla gemener, versaler, siffror och symboler. Mer information om lösenordskomplexitet finns i SQL Azure-lösenordsprincipen.
Om parametervärdena inte uppfyller kraven distribuerar Inte Azure SQL servern.
Se också till att du har en anteckning om inloggningen och lösenordet som du anger. Du använder dem i nästa avsnitt.
Distributionen kan ta några minuter att slutföra.
Skapa ett nyckelvalv och hemligheter
Ditt leksaksföretag har redan ett nyckelvalv med de hemligheter som behövs för dess distributioner. Om du vill simulera det här scenariot skapar du ett nytt nyckelvalv och lägger till några hemligheter att använda.
I terminalen kör du följande kommandon för att skapa nyckelvalvet och hemligheterna. Uppdatera variabelvärdena innan du kör dessa kommandon. Nyckelvalvsnamn måste vara en globalt unik sträng på 3 till 24 tecken som endast kan innehålla versaler och gemener, bindestreck (-
) och siffror. Till exempel demo-kv-1234567abcdefg.
Varning
Kontrollera att du använder samma inloggning och lösenord som du använde i föregående steg. Om du inte gör det slutförs inte nästa distribution.
För ersätt keyVaultName
YOUR-KEY-VAULT-NAME
med ett namn för ditt nyckelvalv. Kommandona read
för variablerna login
och password
uppmanar dig att ange värden. När du skriver visas inte värdena i terminalen och sparas inte i kommandohistoriken.
Om du vill skydda variabelvärdena i Bash-terminalsessionen bör du vara medveten om följande:
- Variabelvärden lagras inte som en säker sträng och kan visas genom att ange ett kommando som
$yourVariableName
på kommandoradenecho
eller med kommandot . I den här övningenread
, när dina valvhemligheter har skapats, kan du ta bort varje variabels befintliga värde genom att köra kommandona utan att ange ett värde. az keyvault secret set
Använder parametern--value
för att skapa en hemlighets värde. Kommandots utdata visar en egenskap med namnetvalue
som innehåller hemlighetens värde. Du kan utelämna kommandots hela utdata med parametern--output none
enligt exemplet.
Om du vill skapa variablerna keyVaultName
, login
och password
kör du varje kommando separat. Sedan kan du köra kommandoblocket för att skapa nyckelvalvet och hemligheterna.
keyVaultName='YOUR-KEY-VAULT-NAME'
read -s -p "Enter the login name: " login
read -s -p "Enter the password: " password
az keyvault create --name $keyVaultName --location eastus --enabled-for-template-deployment true
az keyvault secret set --vault-name $keyVaultName --name "sqlServerAdministratorLogin" --value $login --output none
az keyvault secret set --vault-name $keyVaultName --name "sqlServerAdministratorPassword" --value $password --output none
Kommentar
Du ställer in --enabled-for-template-deployment
inställningen på valvet så att Azure kan använda hemligheterna från valvet under distributionerna. Om du inte anger den här inställningen kan dina distributioner som standard inte komma åt hemligheter i valvet.
Den som kör distributionen måste också ha behörighet att komma åt valvet. Eftersom du har skapat nyckelvalvet är du ägare, så du behöver inte uttryckligen bevilja behörigheten i den här övningen. För dina egna valv måste du ge åtkomst till hemligheterna.
För ersätt keyVaultName
YOUR-KEY-VAULT-NAME
med ett namn för ditt nyckelvalv. Kommandona Read-Host
för variablerna login
och password
uppmanar dig att ange värden. När du skriver visas inte värdena i terminalen och sparas inte i kommandohistoriken. Värdena lagras som en säker sträng.
Om du vill skapa variablerna keyVaultName
, login
och password
kör du varje kommando separat. Sedan kan du köra kommandoblocket för att skapa nyckelvalvet och hemligheterna.
$keyVaultName = 'YOUR-KEY-VAULT-NAME'
$login = Read-Host "Enter the login name" -AsSecureString
$password = Read-Host "Enter the password" -AsSecureString
New-AzKeyVault -VaultName $keyVaultName -Location eastus -EnabledForTemplateDeployment
Set-AzKeyVaultSecret -VaultName $keyVaultName -Name 'sqlServerAdministratorLogin' -SecretValue $login
Set-AzKeyVaultSecret -VaultName $keyVaultName -Name 'sqlServerAdministratorPassword' -SecretValue $password
Kommentar
Du ställer in -EnabledForTemplateDeployment
inställningen på valvet så att Azure kan använda hemligheterna från valvet under distributionerna. Om du inte anger den här inställningen kan dina distributioner som standard inte komma åt hemligheter i valvet.
Den som kör distributionen måste också ha behörighet att komma åt valvet. Eftersom du har skapat nyckelvalvet är du ägare, så du behöver inte uttryckligen bevilja behörigheten i den här övningen. För dina egna valv måste du ge åtkomst till hemligheterna.
Hämta nyckelvalvets resurs-ID
Om du vill använda nyckelvalvshemligheterna i distributionen behöver du resurs-ID:t för valvet. Kör följande kommando för att hämta nyckelvalvets resurs-ID:
az keyvault show --name $keyVaultName --query id --output tsv
(Get-AzKeyVault -Name $keyVaultName).ResourceId
Resurs-ID ser ut ungefär så här:
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets
Kopiera resurs-ID:t. Du ska använda den i nästa steg.
Lägga till en key vault-referens till en parameterfil
I filen main.parameters.dev.json lägger du till följande kod efter
sqlDatabaseSku
parameterns avslutande klammerparentes. Se till att du ersätterYOUR-KEY-VAULT-RESOURCE-ID
med värdet för det nyckelvalvsresurs-ID som du kopierade i föregående steg. När du är klar bör parameterfilen se ut så här:{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "appServicePlanSku": { "value": { "name": "F1", "tier": "Free" } }, "sqlDatabaseSku": { "value": { "name": "Standard", "tier": "Standard" } }, "sqlServerAdministratorLogin": { "reference": { "keyVault": { "id": "YOUR-KEY-VAULT-RESOURCE-ID" }, "secretName": "sqlServerAdministratorLogin" } }, "sqlServerAdministratorPassword": { "reference": { "keyVault": { "id": "YOUR-KEY-VAULT-RESOURCE-ID" }, "secretName": "sqlServerAdministratorPassword" } } } }
Spara ändringarna i filen.
Distribuera Bicep-mallen med parameterfilen och Azure Key Vault-referenser
Kör följande Azure CLI-kommando i terminalen. Du tillhandahåller en parameterfil tillsammans med en Bicep-fil.
az deployment group create \
--template-file main.bicep \
--parameters main.parameters.dev.json
Kör följande Azure PowerShell-kommando i terminalen. Du tillhandahåller en parameterfil tillsammans med en Bicep-fil.
New-AzResourceGroupDeployment `
-TemplateFile main.bicep `
-TemplateParameterFile main.parameters.dev.json
Du uppmanas inte att ange värdena för sqlServerAdministratorLogin
och sqlServerAdministratorPassword
parametrarna när du kör distributionen den här gången. Azure hämtar värdena från ditt nyckelvalv i stället.
Distributionen slutförs snabbare den här gången eftersom Azure-resurserna redan finns.
Kontrollera distributionen
Gå tillbaka till Azure Portal i webbläsaren. Gå till resursgruppen. Du ser fortfarande en lyckad distribution eftersom distributionen använde samma namn som den första distributionen.
Välj länken 1 Lyckades .
Välj distributionen som kallas main.
Välj Indata på den vänstra menyn.
Observera att parametervärdena
appServicePlanSku
ochsqlDatabaseSku
båda har angetts till värdena i parameterfilen. Observera också attsqlServerAdministratorLogin
parametervärdena ochsqlServerAdministratorPassword
inte visas eftersom du har tillämpat dekoratören@secure()
på dem.