Övning – Lägga till en parameterfil och säkra parametrar

Slutförd

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, sqlServerAdministratorPasswordoch 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

  1. 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
      }
    }
    
  2. 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

  1. Ö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.

  2. 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"
          }
        }
      }
    }
    
  3. 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 som admin eller root. 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å kommandoraden echo eller med kommandot . I den här övningen read , 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 namnet value 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, loginoch 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, loginoch 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

  1. I filen main.parameters.dev.json lägger du till följande kod efter sqlDatabaseSku parameterns avslutande klammerparentes. Se till att du ersätter YOUR-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"
          }
        }
      }
    }
    
  2. 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

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

  2. Välj länken 1 Lyckades .

  3. Välj distributionen som kallas main.

  4. Välj Indata på den vänstra menyn.

  5. Observera att parametervärdena appServicePlanSku och sqlDatabaseSku båda har angetts till värdena i parameterfilen. Observera också att sqlServerAdministratorLogin parametervärdena och sqlServerAdministratorPassword inte visas eftersom du har tillämpat dekoratören @secure() på dem.

    Skärmbild av Azure Portal-gränssnittet för den specifika distributionen som visar parametervärdena.