Exercice 05 : Gérer les identités avec Microsoft Entra ID
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Créer des utilisateurs dans Entra ID via la CLI Azure
- ✅ Créer des groupes et y ajouter des membres
- ✅ Assigner des rôles RBAC Azure à un groupe sur un groupe de ressources
- ✅ Créer un Service Principal pour les pipelines CI/CD
Durée estimée : 30 minutes
Difficulté : ⭐☆☆☆☆ (Débutant)
Prérequis : Compte Azure, permissions d'administration Entra ID
📖 Contexte
Microsoft Entra ID (anciennement Azure Active Directory) est le service d'identité et d'accès d'Azure. Il gère QUI peut se connecter (authentification). Azure RBAC (Role-Based Access Control) gère CE QUE les utilisateurs peuvent faire une fois connectés (autorisation). Ces deux systèmes fonctionnent ensemble.
📋 Énoncé
Créez une structure d'identités pour une équipe DevOps : développeurs avec accès lecture, admins avec accès complet, et un Service Principal pour les pipelines CI/CD.
🧭 Déroulement de l'exercice
Tâche 1 : Créer des utilisateurs et des groupes
# Récupérer le domaine Entra ID de votre tenant
DOMAIN=$(az ad signed-in-user show --query 'userPrincipalName' -o tsv | cut -d@ -f2)
echo "Domaine : $DOMAIN"
# Créer un groupe de ressources pour les exercices
az group create --name rg-equipe-devops --location francecentral
# Créer les utilisateurs
az ad user create \
--display-name "Alice Dupont" \
--user-principal-name "alice.dupont@$DOMAIN" \
--password "MotDePasseTemp123!" \
--force-change-password-next-sign-in true \
--mail-nickname "alice.dupont"
az ad user create \
--display-name "Bob Martin" \
--user-principal-name "bob.martin@$DOMAIN" \
--password "MotDePasseTemp123!" \
--force-change-password-next-sign-in true \
--mail-nickname "bob.martin"
# Vérifier les utilisateurs créés
az ad user list --display-name "Alice" --query '[].{Nom:displayName,UPN:userPrincipalName}' -o tableTâche 2 : Créer des groupes et assigner des membres
# Créer le groupe développeurs
GROUP_DEV_ID=$(az ad group create \
--display-name "Developers" \
--mail-nickname "developers" \
--query id -o tsv)
# Créer le groupe admins
GROUP_ADMIN_ID=$(az ad group create \
--display-name "DevOps-Admins" \
--mail-nickname "devops-admins" \
--query id -o tsv)
echo "Groupe Developers : $GROUP_DEV_ID"
echo "Groupe Admins : $GROUP_ADMIN_ID"
# Récupérer les IDs des utilisateurs
ALICE_ID=$(az ad user show --id "alice.dupont@$DOMAIN" --query id -o tsv)
BOB_ID=$(az ad user show --id "bob.martin@$DOMAIN" --query id -o tsv)
# Ajouter Alice au groupe développeurs
az ad group member add --group $GROUP_DEV_ID --member-id $ALICE_ID
# Ajouter Bob au groupe admins
az ad group member add --group $GROUP_ADMIN_ID --member-id $BOB_ID
# Vérifier les membres
az ad group member list --group $GROUP_DEV_ID --query '[].displayName' -o tsvTâche 3 : Assigner des rôles RBAC Azure
# Récupérer l'ID du groupe de ressources
RG_ID=$(az group show --name rg-equipe-devops --query id -o tsv)
# Donner le rôle "Reader" au groupe Developers sur le RG
az role assignment create \
--assignee $GROUP_DEV_ID \
--role "Reader" \
--scope $RG_ID
# Donner le rôle "Contributor" au groupe Admins sur le RG
az role assignment create \
--assignee $GROUP_ADMIN_ID \
--role "Contributor" \
--scope $RG_ID
# Voir toutes les assignations de rôle sur le RG
az role assignment list \
--scope $RG_ID \
--query '[].{Role:roleDefinitionName,Assignee:principalName}' \
--output tableIndice : La portée (scope) détermine où s'applique le rôle. Du plus large au plus étroit :
Management Group > Subscription > Resource Group > Resource. Les permissions sont héritées vers le bas : un rôle sur un RG s'applique à toutes les ressources du RG.
Tâche 4 : Créer un Service Principal pour CI/CD
Un Service Principal est l'équivalent d'un "utilisateur technique" pour les applications et pipelines CI/CD.
# Créer un Service Principal avec le rôle Contributor sur le RG
SP_CREDENTIALS=$(az ad sp create-for-rbac \
--name "sp-cicd-pipeline" \
--role "Contributor" \
--scopes $RG_ID \
--json-auth)
echo "$SP_CREDENTIALS" | jq .
# Extraire les valeurs pour les secrets CI/CD
CLIENT_ID=$(echo $SP_CREDENTIALS | jq -r .clientId)
CLIENT_SECRET=$(echo $SP_CREDENTIALS | jq -r .clientSecret)
TENANT_ID=$(echo $SP_CREDENTIALS | jq -r .tenantId)
SUBSCRIPTION_ID=$(echo $SP_CREDENTIALS | jq -r .subscriptionId)
echo "Stocker ces valeurs comme secrets dans votre CI/CD :"
echo "AZURE_CLIENT_ID=$CLIENT_ID"
echo "AZURE_TENANT_ID=$TENANT_ID"
echo "AZURE_SUBSCRIPTION_ID=$SUBSCRIPTION_ID"
echo "AZURE_CLIENT_SECRET=*** (ne jamais afficher)"# Tester l'authentification avec le Service Principal
az login \
--service-principal \
--username $CLIENT_ID \
--password $CLIENT_SECRET \
--tenant $TENANT_ID
az account show
# Se reconnecter avec votre compte
az loginTâche 5 : Nettoyer
# Supprimer le Service Principal
az ad sp delete --id $CLIENT_ID
# Supprimer les utilisateurs
az ad user delete --id "alice.dupont@$DOMAIN"
az ad user delete --id "bob.martin@$DOMAIN"
# Supprimer les groupes
az ad group delete --group $GROUP_DEV_ID
az ad group delete --group $GROUP_ADMIN_ID
# Supprimer le groupe de ressources
az group delete --name rg-equipe-devops --yes --no-wait✅ Vérification du résultat
- Les utilisateurs Alice et Bob sont créés dans Entra ID
- Alice est dans le groupe
Developers, Bob dansDevOps-Admins - Le groupe
Developersa le rôleReadersur le Resource Group - Le Service Principal
sp-cicd-pipelinepeut s'authentifier avec ses credentials
💡 À retenir
Entra ID vs Azure RBAC :
| Entra ID (qui ?) | Azure RBAC (quoi ?) | |
|---|---|---|
| Gère | Identités, groupes, apps | Permissions sur ressources Azure |
| Exemple | "Alice est dans le groupe Devs" | "Le groupe Devs peut lire les VMs" |
| Scope | Tenant | Management Group, Sub, RG, Resource |
Rôles built-in essentiels :
Reader: lecture seule sur toutes les ressourcesContributor: créer/modifier, pas gérer les accèsOwner: tout, y compris gérer les accès
✨ Solution Complète
# Créer un Service Principal minimal pour CI/CD
az ad sp create-for-rbac \
--name "sp-mon-projet-cicd" \
--role "Contributor" \
--scopes "/subscriptions/$(az account show --query id -o tsv)" \
--json-auth > azure-credentials.json
# Utiliser dans GitHub Actions :
# AZURE_CREDENTIALS: $(cat azure-credentials.json)