Terraform est une véritable boite à outils open-source qui permet de gérer des infrastructures IAC (Infrastructure As Code). Elle dispose de nombreux avantages par rapport à des templates ARM de base :
- La possibilité de tester les déploiements avant d’appliquer les changements
- La possibilité de détruire les anciens déploiements de ressources
- La possibilité de modifier des déploiements existants
- Un langage de template plus facile
Dans cet article, nous allons revenir sur les fonctions permettant à Terraform de sécuriser un déploiement Azure.
L’équipe Ambient ITVous souhaitez devenir expert en développement d’applications performantes ? Notre formation React vous permettra de maitriser le développement d’applications monopage avec Redux et TypeScript.
L’équipe Ambient IT
Débuter avec terraform
Terraform doit savoir comment accéder à votre solution Azure. Il enregistre donc par défaut l’état de votre environnement Azure dans un fichier .tfstate local. L’inconvénient est que les mots de passe que vous utilisez dans votre déploiement sont également enregistrés dans ce fichier .tfstate.
La première chose que vous devez faire est de préparer votre ordinateur pour utiliser Terraform. Configurez un service Azure AD créé à l’aide des commandes bash/Azure CLI suivantes :
ARM_SUBSCRIPTION_ID=yourSubscriptionID
az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/$ARM_SUBSCRIPTION_ID
Le service est utilisé par Terraform pour s’authentifier auprès de votre environnement Azure. Pour permettre à Terraform d’utiliser ces informations, vous devez copier une partie du résultat de la commande ci-dessus qui devrait ressembler à ça :
{
"appId": "yourServicePrincipalID",
"displayName": "azure-cli-2023-03-03-11-58-24",
"name": "http://azure-cli-2023-03-03-11-58-24",
"password": "yourServicePrincipalPassword",
"tenant": "yourAzureADTenantID"
}
Vous pouvez maintenant configurer les variables d’environnement Terraform avec les informations ci-dessus et soit exporter les variables d’environnement suivantes, soit configurer un fournisseur Terraform :
echo "Setting environment variables for Terraform"
export ARM_SUBSCRIPTION_ID=$ARM_SUBSCRIPTION_ID
export ARM_CLIENT_ID=yourServicePrincipalID
export ARM_CLIENT_SECRET=yourServicePrincipalPassword
export ARM_TENANT_ID=yourAzureADtenantID
Pour exporter les variables, exécutez le code ci-dessus dans votre session shell bash ou stockez-le dans votre fichier ./bash_profile (ou équivalent). Vous pouvez également configurer un fournisseur Terraform pour définir l’accès à votre solution Azure. La section fournisseur d’un fichier modèle indique à Terraform d’utiliser un fournisseur Azure :
provider "azurerm" {
subscription_id = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
client_id = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
client_secret = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
tenant_id = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Comme mentionné plus haut, Terraform stocke les informations environnementales, y compris les mots de passe, nécessaires à un déploiement dans le fichier .tfstate. Les mots de passe ne devant pas être stockés localement sur le dispositif d’un ingénieur DevOps, vous avez encore quelques étapes à faire.
Dans un premier temps, vous pouvez configurer un compte de stockage Azure en tant que backend Terraform distant. L’avantage d’un backend distant est que les ingénieurs DevOps peuvent utiliser un fichier .tfstate commun pour un seul environnement au lieu d’en avoir un distinct sur chaque machine. Un autre bénéfice est que, par défaut, le contenu du compte de stockage est crypté au repos. Le code bash suivant créé le nouveau groupe de ressources Azure Terraformstate et un nouveau compte de stockage avec un nom aléatoire dans celui-ci :
RESOURCE_GROUP_NAME=terraformstate
STORAGE_ACCOUNT_NAME=tfstate$RANDOM
CONTAINER_NAME=tfstate
# créer un groupe de ressources
az group create --name $RESOURCE_GROUP_NAME--location westeurope
# créer un storage account
az storage account create --resource-group $RESOURCE_GROUP_NAME--name $STORAGE_ACCOUNT_NAME--sku Standard_LRS --encryption-services blob
# Obtenir la clé du storage account
ACCOUNT_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP_NAME--account-name $STORAGE_ACCOUNT_NAME--query [0].value -o tsv)
# créer un blob container
az storage container create --name $CONTAINER_NAME--account-name $STORAGE_ACCOUNT_NAME--account-key $ACCOUNT_KEY
Vous avez maintenant un compte de stockage et un conteneur de stockage et vous devez utiliser ce conteneur comme backend distant. Vous devez ajouter le code suivant à votre configuration Terraform :
terraform {
backend "azurerm" {
storage_account_name = "tfstatexxxxxx"
container_name = "tfstate"
key = "terraform.tfstate"
}
Pour ne pas enregistrer votre clé de compte de stockage localement. Vous devez créer un secret Azure Key Vault avec la clé du compte de stockage comme valeur, puis ajouter la ligne suivante à mon fichier .bash_profile :
export ARM_ACCESS_KEY=$(az keyvault secret show --name mySecretName --vault-name myKeyVaultName --query value -o tsv)
La commande export crée une variable d’environnement tant que le terminal bash est en cours d’exécution. Chaque fois que vous démarrez un nouveau terminal, la clé du compte de stockage est lue depuis Azure Key Vault, puis exportée dans la session bash. Lorsque vous fermez bash, la clé est supprimée de la mémoire.
Accéder au Key vault pendant un déploiement
Pour accéder au Key vault durant un déploiement, ajoutez une source de donnée dans le fichier du modèle.
data "azurerm_key_vault_secret" "mySecret" {
name = "mySecretName"
vault_uri = "https://myKeyVaultName.vault.azure.net/"
}
Dans la partie virtual machine deployment du fichier template, vous pouvez maintenant faire référence à ce secret comme ceci :
resource "azure_virtual_machinge" "myAzureVM" {
os_profile {
computer_name = "myvm"
admin_username= "labuser"
admin_password= "${data.azurerm_key_vault_secret.mySecret.value}"
}
}
Cette méthode est bien plus rapide et efficace l’utilisation des fichiers ARM. Pour trouver plus de références sur ce sujet, vous pouvez consulter ce github fait par un expert de Terraform et de son utilisation dans Azure