S’authentifier auprès d’Azure avec le principal de service

Cet article explique comment authentifier Terraform sur Azure avec un principal de service.

Dans cet article, vous apprendrez comment :

  • Créer un principal du service
  • Spécification des informations d’identification du principal de service dans les variables d’environnement
  • Spécifier les informations d’identification du principal de service dans un bloc provider Terraform

Créer un principal du service

Si vous n’avez pas accès à un principal de service, poursuivez avec cette section pour créer un principal de service. Si vous avez un principal de service que vous pouvez utiliser, passez à la section, spécifiez les informations d’identification du principal de service.

Les outils automatisés qui déploient ou utilisent des services Azure, tels que Terraform, doivent toujours avoir des autorisations restreintes. Au lieu que les applications se connectent en tant qu’utilisateur entièrement privilégié, Azure propose des principaux de service.

La procédure la plus courante consiste à se connecter de manière interactive à Azure, à créer un principal de service, à tester ce principal de service, puis à l’utiliser à des fins d’authentification ultérieure (soit de manière interactive, soit à partir de vos scripts).

  1. Pour créer un principal de service, connectez-vous à Azure. Après vous être authentifié auprès d’Azure par le biais d’un compte Microsoft, revenez ici.

  2. Si vous créez un principal de service à partir de Git Bash, définissez la variable d’environnement MSYS_NO_PATHCONV. (Cette étape n’est pas nécessaire si vous utilisez Cloud Shell.)

    export MSYS_NO_PATHCONV=1    
    

    Points essentiels :

    • Vous pouvez définir la variable d’environnement MSYS_NO_PATHCONV globalement (pour toutes les sessions de terminal) ou localement (uniquement pour la session active). Puisque la création d’un principal de service n’est pas une opération fréquente, l’exemple définit la valeur pour la session active. Pour définir cette variable d’environnement globalement, ajoutez le paramètre au fichier ~/.bashrc.
  3. Pour créer un principal de service, exécutez az ad sp create-for-rbac.

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    Points essentiels :

    • Vous pouvez remplacer <service-principal-name> par un nom personnalisé pour votre environnement ou omettre complètement le paramètre. Si vous omettez le paramètre, le nom du principal de service est généré en fonction de la date et de l’heure actuelles.
    • À la fin de l’opération, az ad sp create-for-rbac affiche plusieurs valeurs. Les valeurs appId, password et tenant sont utilisées à l’étape suivante.
    • Le mot de passe ne peut pas être récupéré en cas de perte. Par conséquent, vous devez conserver votre mot de passe en lieu sûr. Si vous oubliez votre mot de passe, vous pouvez réinitialiser les informations d’identification du principal de service.
    • Pour cet article, un principal de service doté d’un rôle Contributeur est utilisé. Pour plus d’informations sur les rôles de contrôle d’accès en fonction du rôle, consultez RBAC : rôles intégrés.
    • La sortie de la création du principal de service comprend des informations d’identification sensibles. Veillez à ne pas inclure ces informations d’identification dans votre code ou vérifiez les informations d’identification dans votre contrôle de code source.
    • Pour plus d’informations sur les options lors de la création d’un principal de service avec Azure CLI, consultez l’article Créer un principal de service Azure avec Azure CLI.

Spécifier les informations d’identification du principal de service

Il existe deux façons de spécifier vos informations d’identification de principal de service. Toutefois, pour des raisons de sécurité, nous vous suggérons de ne pas stocker les informations d’identification dans le bloc fournisseur. Cette technique est présentée uniquement à des fins d’exhaustivité et de test.

Spécifier les informations d’identification du principal de service dans des variables d’environnement

Une fois que vous avez créé un principal de service, vous pouvez spécifier ses informations d’identification pour Terraform par le biais de variables d’environnement.

  1. Modifiez le fichier ~/.bashrc en ajoutant les variables d’environnement suivantes.

    export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
    export ARM_TENANT_ID="<azure_subscription_tenant_id>"
    export ARM_CLIENT_ID="<service_principal_appid>"
    export ARM_CLIENT_SECRET="<service_principal_password>"
    
  2. Pour exécuter le script ~/.bashrc, exécutez source ~/.bashrc (ou son équivalent abrégé . ~/.bashrc). Vous pouvez aussi quitter et rouvrir Cloud Shell pour que le script s’exécute automatiquement.

    . ~/.bashrc
    
  3. Une fois les variables d’environnement définies, vous pouvez vérifier leurs valeurs comme suit :

    printenv | grep ^ARM*
    

    Points essentiels :

    • Comme pour toute variable d’environnement, pour accéder à une valeur d’abonnement Azure à partir d’un script Terraform, utilisez la syntaxe suivante : ${env.<environment_variable>}. Par exemple, pour accéder à la valeur ARM_SUBSCRIPTION_ID, spécifiez ${env.ARM_SUBSCRIPTION_ID}.
    • La création et l’application de plans d’exécution Terraform apportent des modifications à l’abonnement Azure associé au principal de service. Cela peut parfois prêter à confusion si vous êtes connecté à un abonnement Azure et que les variables d’environnement pointent vers un autre abonnement Azure. Examinons l’exemple suivant pour mieux comprendre. Supposons que vous avez deux abonnements Azure : AboA et AboB. Si l’abonnement Azure actif est AboA (déterminé par le biais de la commande az account show) alors que les variables d’environnement pointent vers AboB, toutes les modifications apportées par Terraform le sont sur AboB. Vous avez donc besoin de vous connecter à votre abonnement AboB pour exécuter des commandes Azure CLI ou Azure PowerShell afin de voir vos modifications.
  4. Passez à la section, étapes suivantes

Spécifier les informations d’identification du principal de service dans un bloc provider Terraform

Attention

La possibilité de spécifier les informations d’identification de votre abonnement Azure dans un fichier de configuration Terraform peut s’avérer pratique, notamment dans le cadre de tests. Toutefois, il n’est pas recommandé de stocker des informations d’identification dans un fichier en texte clair, celui-ci pouvant être lu par des personnes non approuvées.

Le bloc provider Azure définit la syntaxe qui vous permet de spécifier les informations d’authentification de votre abonnement Azure.

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>3.0"
    }
  }
}

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

Étapes suivantes