Exercice – ajouter un fichier de paramètres et des paramètres sécurisés

Effectué

Dans cet exercice, vous allez créer un fichier de paramètres qui fournit des valeurs pour le fichier Bicep que vous avez créé précédemment. Dans le même fichier de paramètres, vous ajouterez également des références Azure Key Vault pour fournir des informations sensibles en toute sécurité.

Au cours du processus, vous allez effectuer les tâches suivantes :

  • Ajoutez des paramètres sécurisés.
  • Créez un fichier de paramètres.
  • Tester le déploiement pour vous assurer que le fichier de paramètres est valide.
  • Créez un coffre de clés et des secrets.
  • Mettez à jour le fichier de paramètres pour faire référence aux secrets du coffre de clés.
  • Testez à nouveau le déploiement pour vous assurer que le fichier de paramètres est toujours valide.

Supprimer la valeur par défaut de la référence SKU du plan App Service

Pour que votre modèle fonctionne dans différents environnements, les détails de la référence SKU du plan Azure App Service sont fournis dans un fichier de paramètres plutôt que par une valeur par défaut.

Dans le fichier main.bicep dans Visual Studio Code, mettez à jour le paramètre appServicePlanSku pour supprimer sa valeur par défaut.

@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object

Ajouter de nouveaux paramètres

Vous devez maintenant ajouter une instance et une base de données SQL Server. Tout d’abord, vous allez ajouter des paramètres pour les informations de connexion et le mot de passe d’administrateur, ainsi que pour la référence SKU de base de données. Vous définirez leurs valeurs ultérieurement.

Dans le fichier main.bicep dans Visual Studio Code, ajoutez les paramètres sqlServerAdministratorLogin, sqlServerAdministratorPassword et sqlDatabaseSku sous les déclarations de paramètre actuelles. Quand vous avez terminé, vos déclarations de paramètres doivent ressembler à cet exemple :

@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

Notez que vous ne spécifiez pas de valeurs par défaut pour les paramètres sqlServerAdministratorLogin et sqlServerAdministratorPassword. Pour des raisons de sécurité, il est déconseillé d’ajouter des valeurs par défaut aux paramètres sécurisés. En outre, vous ne spécifiez pas de valeur par défaut pour sqlDatabaseSku. Vous allez spécifier une valeur dans un fichier de paramètres.

Ajouter de nouvelles variables

Dans le fichier main.bicep dans Visual Studio Code, ajoutez les variables sqlServerName et sqlDatabaseName sous les variables existantes. Quand vous avez terminé, vos déclarations de variables doivent ressembler à cet exemple :

var appServicePlanName = '${environmentName}-${solutionName}-plan'
var appServiceAppName = '${environmentName}-${solutionName}-app'
var sqlServerName = '${environmentName}-${solutionName}-sql'
var sqlDatabaseName = 'Employees'

Ajouter des ressources d’instance et de base de données SQL Server

  1. Dans le fichier main.bicep dans Visual Studio Code, ajoutez le code suivant en bas du fichier :

    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. Enregistrez les modifications du fichier.

Vérifier votre fichier Bicep

Une fois que vous avez effectué toutes les modifications précédentes, votre fichier Bicep doit ressembler à l’exemple suivant :

@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
  }
}

Si ce n’est pas le cas, copiez l’exemple ou ajustez votre modèle pour qu’il corresponde à l’exemple.

Créer un fichier de paramètres

  1. Ouvrez Visual Studio Code, puis ouvrez le dossier où se trouve le fichier main.bicep. Dans le même dossier, créez un nouveau fichier appelé main.parameters.dev.json.

  2. Dans le fichier main.parameters.dev.json, ajoutez le code suivant :

    {
      "$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. Enregistrez les modifications du fichier.

Déployer le modèle Bicep avec le fichier de paramètres

Exécutez la commande Azure CLI suivante dans le terminal. Notez que vous fournissez un fichier de paramètres pour le déploiement.

az deployment group create \
  --template-file main.bicep \
  --parameters main.parameters.dev.json

Exécutez la commande Azure PowerShell suivante dans le terminal. Notez que vous fournissez un fichier de paramètres pour le déploiement.

New-AzResourceGroupDeployment `
  -TemplateFile main.bicep `
  -TemplateParameterFile main.parameters.dev.json

Vous êtes invité à entrer les valeurs des paramètres sqlServerAdministratorLogin et sqlServerAdministratorPassword quand vous exécutez le déploiement. Vous n’avez pas besoin de spécifier solutionName car ce paramètre a une valeur par défaut spécifiée dans le modèle. Vous n’avez pas besoin de spécifier les autres valeurs de paramètres, car ces valeurs sont spécifiées dans le fichier de paramètres.

Conseil

Quand vous entrez les paramètres sécurisés, les valeurs que vous choisissez doivent respecter certaines règles :

  • sqlServerAdministratorLogin ne doit pas être un nom de connexion facile à deviner, tel que admin ou root. Ce paramètre doit contenir uniquement des caractères alphanumériques et commencer par une lettre.
  • sqlServerAdministratorPassword doit comporter au moins huit caractères et inclure des lettres minuscules, des lettres majuscules, des chiffres et des symboles. Pour plus d’informations sur la complexité des mots de passe, consultez la Stratégie de mot de passe pour Azure SQL.

Si les valeurs de paramètres ne satisfont pas aux exigences, Azure SQL ne déploiera pas votre serveur.

Veillez également à bien noter les informations de connexion et le mot de passe que vous entrez. Vous les utiliserez dans la section suivante.

Le déploiement peut prendre quelques minutes.

Créer un coffre de clés et des secrets

Votre entreprise de jouets dispose déjà d’un coffre de clés avec les secrets nécessaires aux déploiements. Pour simuler ce scénario, vous allez créer un coffre de clés et ajouter des secrets à utiliser.

Dans le terminal, exécutez les commandes suivantes pour créer le coffre de clés et les secrets. Mettez à jour les valeurs des variables avant d’exécuter ces commandes. Les noms de coffre de clés doivent être une chaîne globale unique de 3 à 24 caractères qui peut contenir uniquement des lettres majuscules et minuscules, des traits d’union (-) et des nombres. Par exemple, demo-kv-1234567abcdefg.

Attention

Veillez à utiliser les mêmes informations de connexion et le même mot de passe qu’à l’étape précédente. Si ce n’est pas le cas, le prochain déploiement ne s’effectuera pas correctement.

Pour le keyVaultName, remplacez YOUR-KEY-VAULT-NAME par un nom pour votre coffre de clés. Les commandes read pour les variables login et password vous invitent à entrer des valeurs. Lors de votre saisie, les valeurs ne sont pas affichées dans le terminal et ne sont pas enregistrées dans votre historique de commandes.

Pour protéger les valeurs de variable dans votre session de terminal Bash, tenez compte des éléments suivants :

  • Les valeurs de variable ne sont pas stockées sous forme de chaîne sécurisée et peuvent être affichées en entrant une commande comme $yourVariableName sur la ligne de commande ou avec la commande echo. Dans cet exercice, une fois que les secrets de votre coffre ont été créés, vous pouvez supprimer la valeur existante de chaque variable en exécutant les commandes read sans insérer de valeur.
  • az keyvault secret set utilise le paramètre --value pour créer la valeur d’un secret. La sortie de la commande affiche une propriété nommée value qui contient la valeur du secret. Vous pouvez supprimer l’intégralité de la sortie de la commande avec le paramètre --output none, comme indiqué dans l’exemple.

Pour créer les variables keyVaultName, login et password, exécutez chaque commande séparément. Ensuite, vous pouvez exécuter le bloc de commandes pour créer le coffre de clés et les secrets.

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

Notes

Vous définissez le paramètre --enabled-for-template-deployment sur le coffre pour qu’Azure puisse utiliser les secrets de votre coffre lors des déploiements. Si vous ne définissez pas ce paramètre, par défaut, vos déploiements ne peuvent ensuite pas accéder aux secrets de votre coffre.

En outre, toute personne qui exécute le déploiement doit également avoir l’autorisation d’accéder au coffre. Étant donné que vous avez créé le coffre de clés, vous êtes le propriétaire, vous n’aurez donc pas à accorder explicitement l’autorisation dans cet exercice. Pour vos propres coffres, vous devez accorder l’accès aux secrets.

Pour le keyVaultName, remplacez YOUR-KEY-VAULT-NAME par un nom pour votre coffre de clés. Les commandes Read-Host pour les variables login et password vous invitent à entrer des valeurs. Lors de votre saisie, les valeurs ne sont pas affichées dans le terminal et ne sont pas enregistrées dans votre historique de commandes. Les valeurs sont stockées sous forme de chaîne sécurisée.

Pour créer les variables keyVaultName, login et password, exécutez chaque commande séparément. Ensuite, vous pouvez exécuter le bloc de commandes pour créer le coffre de clés et les secrets.

$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

Notes

Vous définissez le paramètre -EnabledForTemplateDeployment sur le coffre pour qu’Azure puisse utiliser les secrets de votre coffre lors des déploiements. Si vous ne définissez pas ce paramètre, par défaut, vos déploiements ne peuvent ensuite pas accéder aux secrets de votre coffre.

En outre, toute personne qui exécute le déploiement doit également avoir l’autorisation d’accéder au coffre. Étant donné que vous avez créé le coffre de clés, vous êtes le propriétaire, vous n’aurez donc pas à accorder explicitement l’autorisation dans cet exercice. Pour vos propres coffres, vous devez accorder l’accès aux secrets.

Récupération de l’ID de ressource du coffre de clés

Pour utiliser les secrets de coffre de clés dans votre déploiement, vous avez besoin de l’ID de ressource du coffre. Exécutez la commande suivante pour récupérer l’ID de ressource du coffre de clés :

az keyvault show --name $keyVaultName --query id --output tsv
(Get-AzKeyVault -Name $keyVaultName).ResourceId

L’ID de la ressource ressemble à l’exemple suivant :

/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets

Copiez l’ID de la ressource. Vous l’utiliserez à l’étape suivante.

Ajouter une référence de coffre de clés à un fichier de paramètres

  1. Dans le fichier main.parameters.dev.json, ajoutez le code suivant après l’accolade fermante du paramètre sqlDatabaseSku. Veillez à remplacer YOUR-KEY-VAULT-RESOURCE-ID par la valeur de l’ID de la ressource du coffre de clés que vous avez copié à l’étape précédente. Une fois que vous avez terminé, votre fichier de paramètres doit ressembler à cet exemple :

    {
      "$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. Enregistrez les modifications du fichier.

Déployer le modèle Bicep avec un fichier de paramètres et des références Azure Key Vault

Exécutez la commande Azure CLI suivante dans le terminal. Vous fournissez un fichier de paramètres avec un fichier Bicep.

az deployment group create \
  --template-file main.bicep \
  --parameters main.parameters.dev.json

Exécutez la commande Azure PowerShell suivante dans le terminal. Vous fournissez un fichier de paramètres avec un fichier Bicep.

New-AzResourceGroupDeployment `
  -TemplateFile main.bicep `
  -TemplateParameterFile main.parameters.dev.json

Cette fois, vous n’êtes pas invité à entrer les valeurs des paramètres sqlServerAdministratorLogin et sqlServerAdministratorPassword quand vous exécutez le déploiement. Azure récupère les valeurs à partir de votre coffre de clés à la place.

Le déploiement se termine plus rapidement cette fois, car les ressources Azure existent déjà.

Vérifier votre déploiement

  1. Dans votre navigateur, retournez au portail Azure. Accédez à votre groupe de ressources. Vous verrez toujours un déploiement réussi parce que le déploiement a utilisé le même nom que le premier déploiement.

  2. Sélectionnez le lien 1 Réussi.

  3. Sélectionnez le déploiement nommé main.

  4. Dans le menu de gauche, sélectionnez Entrées.

  5. Notez que les valeurs de paramètres appServicePlanSku et sqlDatabaseSku ont toutes les deux été définies sur la valeur du fichier de paramètres. Notez également que les valeurs de paramètres sqlServerAdministratorLogin et sqlServerAdministratorPassword ne sont pas affichées, car vous leur avez appliqué l’élément décoratif @secure().

    Capture d’écran de l’interface du portail Azure pour le déploiement spécifique montrant les valeurs de paramètres.