Module 1 : Portail Azure, Subscriptions & Entra ID
Durée estimée : 30 minutes
Objectifs du Module
À la fin de ce module, vous serez capable de :
- Naviguer efficacement dans le Portail Azure
- Comprendre la hiérarchie Azure (Tenants, Subscriptions, Resource Groups)
- Configurer Microsoft Entra ID (ex-Azure AD)
- Implémenter Azure RBAC (Role-Based Access Control)
- Utiliser Azure CLI et PowerShell
Prérequis
- Compte Azure avec accès administrateur
- Connaissances Windows/Linux de base
- Familiarité avec les concepts d'authentification
1. Découverte du Portail Azure
1.1 Accès au Portail
Le Portail Azure est l'interface web principale pour gérer vos ressources.
URL : https://portal.azure.com
Types de connexion :
├── Microsoft Account (personnel) → @outlook.com, @hotmail.com
├── Work/School Account (Entra ID) → @company.onmicrosoft.com
├── B2B Guest (invité) → Accès via invitation
└── Federated (ADFS/SAML) → SSO entreprise
1.2 Navigation dans le Portail
Éléments clés :
| Élément | Description |
|---|---|
| Home | Dashboard personnalisable |
| All services | Catalogue de tous les services Azure (200+) |
| Resource groups | Conteneurs logiques pour les ressources |
| Cloud Shell | Terminal intégré (Bash/PowerShell) |
| Subscriptions | Conteneurs de facturation |
| Microsoft Entra ID | Gestion des identités |
1.3 Azure Cloud Shell
Cloud Shell est un terminal basé navigateur avec Azure CLI et PowerShell préinstallés :
# Vérifier l'identité connectée
az account show
# Lister les subscriptions
az account list --output table
# Changer de subscription
az account set --subscription "My Subscription"
# Lister les resource groups
az group list --output table
# Outils disponibles
az --version
pwsh --version
terraform --version
kubectl version --client
2. Hiérarchie Azure
2.1 Structure Organisationnelle


graph TD
subgraph "Microsoft Entra ID Tenant"
TENANT["🏢 Tenant<br/>contoso.onmicrosoft.com"]
subgraph "Management Groups"
MG_ROOT["📁 Root Management Group"]
MG_PROD["📁 MG: Production"]
MG_DEV["📁 MG: Development"]
end
subgraph "Subscriptions"
SUB_PROD["💳 Sub: Production"]
SUB_STAGING["💳 Sub: Staging"]
SUB_DEV["💳 Sub: Development"]
end
subgraph "Resource Groups"
RG_APP["📦 RG: app-prod-rg"]
RG_DATA["📦 RG: data-prod-rg"]
RG_NET["📦 RG: network-prod-rg"]
end
subgraph "Resources"
VM["💻 VM"]
SQL["🗄️ SQL Database"]
VNET["🔗 Virtual Network"]
end
TENANT --> MG_ROOT
MG_ROOT --> MG_PROD
MG_ROOT --> MG_DEV
MG_PROD --> SUB_PROD
MG_PROD --> SUB_STAGING
MG_DEV --> SUB_DEV
SUB_PROD --> RG_APP
SUB_PROD --> RG_DATA
SUB_PROD --> RG_NET
RG_APP --> VM
RG_DATA --> SQL
RG_NET --> VNET
end
style TENANT fill:#0078d4,color:#fff
style MG_ROOT fill:#50e6ff,color:#000
style SUB_PROD fill:#ffb900,color:#000
2.2 Créer des Resource Groups
# Créer un resource group
az group create \
--name app-prod-rg \
--location westeurope \
--tags Environment=Production Team=DevOps
# Lister les resources dans un groupe
az resource list \
--resource-group app-prod-rg \
--output table
# Appliquer des tags
az group update \
--name app-prod-rg \
--tags Environment=Production Team=DevOps CostCenter=IT001
# Supprimer un resource group (et toutes ses resources !)
az group delete --name app-prod-rg --yes --no-wait
2.3 Azure Policy
# Lister les policy definitions built-in
az policy definition list \
--query "[?policyType=='BuiltIn'].{Name:displayName, Description:description}" \
--output table
# Assigner une policy (ex: Require tag on resources)
az policy assignment create \
--name "require-environment-tag" \
--display-name "Require Environment tag on resources" \
--policy "/providers/Microsoft.Authorization/policyDefinitions/871b6d14-10aa-478d-b590-94f262ecfa99" \
--scope "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
--params '{"tagName": {"value": "Environment"}}'
# Vérifier la compliance
az policy state list \
--resource-group app-prod-rg \
--query "[].{Resource:resourceId, Compliance:complianceState}" \
--output table
3. Microsoft Entra ID (ex-Azure AD)
3.1 Concepts Fondamentaux
graph LR
subgraph "Identities"
USER["👤 User"]
GROUP["👥 Group"]
SP["🤖 Service Principal"]
MI["🔐 Managed Identity"]
end
subgraph "Entra ID Tenant"
TENANT["🏢 Tenant"]
APP["📱 App Registration"]
ROLE["🎭 Directory Role"]
end
subgraph "Azure Resources"
SUB["💳 Subscription"]
RG["📦 Resource Group"]
RES["💻 Resource"]
end
USER --> GROUP
GROUP --> ROLE
SP --> APP
MI --> RES
ROLE --> TENANT
USER --> SUB
GROUP --> RG
SP --> RES
style TENANT fill:#0078d4,color:#fff
style MI fill:#50e6ff,color:#000
3.2 Gérer les Utilisateurs
# Créer un utilisateur
az ad user create \
--display-name "John Doe" \
--user-principal-name "john.doe@contoso.onmicrosoft.com" \
--password "TempPassword123!" \
--force-change-password-next-sign-in true
# Lister les utilisateurs
az ad user list \
--query "[].{Name:displayName, UPN:userPrincipalName, ObjectId:id}" \
--output table
# Créer un groupe
az ad group create \
--display-name "Developers" \
--mail-nickname "developers"
# Ajouter un membre au groupe
az ad group member add \
--group "Developers" \
--member-id $(az ad user show --id "john.doe@contoso.onmicrosoft.com" --query id -o tsv)
# Lister les membres d'un groupe
az ad group member list \
--group "Developers" \
--query "[].displayName" \
--output table
3.3 Service Principals et Managed Identities
# Créer un Service Principal
az ad sp create-for-rbac \
--name "sp-github-actions" \
--role Contributor \
--scopes /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# Sortie :
# {
# "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
# "displayName": "sp-github-actions",
# "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
# "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
# }
# Créer une Managed Identity (User-Assigned)
az identity create \
--name mi-app-identity \
--resource-group app-prod-rg \
--location westeurope
# Lister les Managed Identities
az identity list \
--resource-group app-prod-rg \
--output table
4. Azure RBAC
4.1 Modèle RBAC
flowchart LR
subgraph "Security Principal"
USER["👤 User"]
GROUP["👥 Group"]
SP["🤖 Service Principal"]
MI["🔐 Managed Identity"]
end
subgraph "Role Definition"
OWNER["👑 Owner"]
CONTRIB["✏️ Contributor"]
READER["👁️ Reader"]
CUSTOM["🔧 Custom Role"]
end
subgraph "Scope"
MG["📁 Management Group"]
SUB["💳 Subscription"]
RG["📦 Resource Group"]
RES["💻 Resource"]
end
USER --> CONTRIB
GROUP --> READER
SP --> CUSTOM
MI --> CONTRIB
CONTRIB --> SUB
READER --> RG
CUSTOM --> RES
style OWNER fill:#d83b01,color:#fff
style CONTRIB fill:#0078d4,color:#fff
style READER fill:#107c10,color:#fff
4.2 Rôles Intégrés Courants
| Rôle | Description | Actions |
|---|---|---|
| Owner | Accès complet + gestion RBAC | * |
| Contributor | Accès complet sauf RBAC | * sauf Authorization/* |
| Reader | Lecture seule | */read |
| User Access Administrator | Gestion RBAC uniquement | Authorization/* |
| Virtual Machine Contributor | Gérer les VMs | Microsoft.Compute/* |
| Storage Blob Data Contributor | Accès données Blob | Microsoft.Storage/*/read,write,delete |
4.3 Assigner des Rôles
# Assigner un rôle à un utilisateur sur une subscription
az role assignment create \
--assignee "john.doe@contoso.onmicrosoft.com" \
--role "Contributor" \
--scope "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
# Assigner un rôle à un groupe sur un resource group
az role assignment create \
--assignee $(az ad group show --group "Developers" --query id -o tsv) \
--role "Virtual Machine Contributor" \
--scope "/subscriptions/xxx/resourceGroups/app-prod-rg"
# Assigner un rôle à une Managed Identity
az role assignment create \
--assignee $(az identity show --name mi-app-identity --resource-group app-prod-rg --query principalId -o tsv) \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/xxx/resourceGroups/app-prod-rg/providers/Microsoft.Storage/storageAccounts/mystorageaccount"
# Lister les assignments
az role assignment list \
--resource-group app-prod-rg \
--output table
# Supprimer un assignment
az role assignment delete \
--assignee "john.doe@contoso.onmicrosoft.com" \
--role "Contributor" \
--scope "/subscriptions/xxx"
4.4 Créer un Rôle Custom
# Définition du rôle custom
cat > custom-role.json << 'EOF'
{
"Name": "VM Operator",
"Description": "Can start, stop and restart VMs but not create or delete",
"Actions": [
"Microsoft.Compute/virtualMachines/read",
"Microsoft.Compute/virtualMachines/start/action",
"Microsoft.Compute/virtualMachines/restart/action",
"Microsoft.Compute/virtualMachines/deallocate/action",
"Microsoft.Compute/virtualMachines/powerOff/action"
],
"NotActions": [],
"DataActions": [],
"NotDataActions": [],
"AssignableScopes": [
"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
]
}
EOF
# Créer le rôle
az role definition create --role-definition custom-role.json
# Assigner le rôle custom
az role assignment create \
--assignee "operator@contoso.onmicrosoft.com" \
--role "VM Operator" \
--scope "/subscriptions/xxx/resourceGroups/app-prod-rg"
5. Azure CLI et PowerShell
5.1 Installation Azure CLI
5.2 Authentification
# Login interactif (navigateur)
az login
# Login avec Service Principal
az login --service-principal \
--username $APP_ID \
--password $CLIENT_SECRET \
--tenant $TENANT_ID
# Login avec Managed Identity (depuis une VM Azure)
az login --identity
# Vérifier le contexte actuel
az account show
# Changer de subscription
az account set --subscription "Production"
5.3 Azure PowerShell
# Installer le module
Install-Module -Name Az -Repository PSGallery -Force
# Se connecter
Connect-AzAccount
# Lister les subscriptions
Get-AzSubscription
# Changer de contexte
Set-AzContext -Subscription "Production"
# Lister les resource groups
Get-AzResourceGroup | Format-Table Name, Location, Tags
# Créer un resource group
New-AzResourceGroup -Name "app-prod-rg" -Location "West Europe" -Tag @{Environment="Production"}
6. Exercice : À Vous de Jouer
Mise en Pratique
Objectif : Configurer un environnement Azure complet avec gestion des identités et des accès
Contexte : Votre entreprise souhaite mettre en place une structure Azure pour trois équipes : Développement, Production et Sécurité. Vous devez créer l'organisation complète avec les bonnes pratiques de sécurité.
Tâches à réaliser :
- Créer la hiérarchie de ressources (Resource Groups pour dev/prod/shared)
- Créer 5 utilisateurs Entra ID (2 développeurs, 2 ops, 1 admin sécurité)
- Créer 3 groupes (Developers, Operations, SecurityAdmins)
- Créer un Service Principal pour les pipelines CI/CD
- Configurer les rôles RBAC appropriés sur chaque Resource Group
- Créer un rôle personnalisé "VM Operator" (start/stop uniquement)
- Activer une Policy Azure pour imposer les tags obligatoires
Critères de validation :
- [ ] Les Resource Groups sont créés avec les tags Environment appropriés
- [ ] Tous les utilisateurs peuvent se connecter au portail Azure
- [ ] Les développeurs ont accès Contributor sur le RG dev uniquement
- [ ] Les ops ont accès Reader sur prod et Contributor sur dev
- [ ] Le Service Principal peut déployer sur dev mais pas sur prod
- [ ] Le rôle custom VM Operator fonctionne correctement
- [ ] La Policy bloque la création de ressources sans tag Environment
Solution
Étape 1 : Créer la structure de Resource Groups
# Variables
LOCATION="westeurope"
DOMAIN="contoso.onmicrosoft.com"
# Créer les Resource Groups
az group create --name app-dev-rg --location $LOCATION --tags Environment=Development CostCenter=IT001
az group create --name app-prod-rg --location $LOCATION --tags Environment=Production CostCenter=IT001
az group create --name shared-services-rg --location $LOCATION --tags Environment=Shared CostCenter=IT001
Étape 2 : Créer les utilisateurs Entra ID
# Créer les utilisateurs
for user in dev-alice dev-bob ops-charlie ops-david secadmin-eve; do
az ad user create \
--display-name "${user}" \
--user-principal-name "${user}@${DOMAIN}" \
--password "ChangeMe123!" \
--force-change-password-next-sign-in true
done
Étape 3 : Créer les groupes et assigner les membres
# Créer les groupes
az ad group create --display-name "Developers" --mail-nickname "developers"
az ad group create --display-name "Operations" --mail-nickname "operations"
az ad group create --display-name "SecurityAdmins" --mail-nickname "securityadmins"
# Récupérer les IDs des groupes
DEV_GROUP_ID=$(az ad group show --group "Developers" --query id -o tsv)
OPS_GROUP_ID=$(az ad group show --group "Operations" --query id -o tsv)
SEC_GROUP_ID=$(az ad group show --group "SecurityAdmins" --query id -o tsv)
# Assigner les utilisateurs aux groupes
az ad group member add --group "Developers" --member-id $(az ad user show --id "dev-alice@${DOMAIN}" --query id -o tsv)
az ad group member add --group "Developers" --member-id $(az ad user show --id "dev-bob@${DOMAIN}" --query id -o tsv)
az ad group member add --group "Operations" --member-id $(az ad user show --id "ops-charlie@${DOMAIN}" --query id -o tsv)
az ad group member add --group "Operations" --member-id $(az ad user show --id "ops-david@${DOMAIN}" --query id -o tsv)
az ad group member add --group "SecurityAdmins" --member-id $(az ad user show --id "secadmin-eve@${DOMAIN}" --query id -o tsv)
Étape 4 : Créer le Service Principal
# Créer le Service Principal pour CI/CD
SP_OUTPUT=$(az ad sp create-for-rbac \
--name "sp-cicd-pipeline" \
--role Contributor \
--scopes $(az group show --name app-dev-rg --query id -o tsv))
echo "$SP_OUTPUT"
# Sauvegarder ces credentials de manière sécurisée !
Étape 5 : Configurer les rôles RBAC
# Récupérer les IDs des Resource Groups
DEV_RG_ID=$(az group show --name app-dev-rg --query id -o tsv)
PROD_RG_ID=$(az group show --name app-prod-rg --query id -o tsv)
SHARED_RG_ID=$(az group show --name shared-services-rg --query id -o tsv)
# Developers : Contributor sur Dev
az role assignment create \
--assignee $DEV_GROUP_ID \
--role "Contributor" \
--scope $DEV_RG_ID
# Operations : Reader sur Prod, Contributor sur Dev
az role assignment create \
--assignee $OPS_GROUP_ID \
--role "Reader" \
--scope $PROD_RG_ID
az role assignment create \
--assignee $OPS_GROUP_ID \
--role "Contributor" \
--scope $DEV_RG_ID
# SecurityAdmins : User Access Administrator sur tout
SUB_ID=$(az account show --query id -o tsv)
az role assignment create \
--assignee $SEC_GROUP_ID \
--role "User Access Administrator" \
--scope "/subscriptions/${SUB_ID}"
Étape 6 : Créer le rôle custom VM Operator
# Définition du rôle
cat > vm-operator-role.json << EOF
{
"Name": "VM Operator",
"Description": "Peut démarrer, arrêter et redémarrer les VMs mais pas les créer ou supprimer",
"Actions": [
"Microsoft.Compute/virtualMachines/read",
"Microsoft.Compute/virtualMachines/start/action",
"Microsoft.Compute/virtualMachines/restart/action",
"Microsoft.Compute/virtualMachines/deallocate/action",
"Microsoft.Compute/virtualMachines/powerOff/action",
"Microsoft.Network/networkInterfaces/read",
"Microsoft.Storage/storageAccounts/read"
],
"NotActions": [],
"DataActions": [],
"NotDataActions": [],
"AssignableScopes": [
"/subscriptions/${SUB_ID}"
]
}
EOF
# Créer le rôle
az role definition create --role-definition vm-operator-role.json
# Assigner le rôle à un utilisateur
az role assignment create \
--assignee "ops-charlie@${DOMAIN}" \
--role "VM Operator" \
--scope $PROD_RG_ID
Étape 7 : Activer la Policy pour les tags obligatoires
# Assigner la policy built-in "Require tag on resource groups"
az policy assignment create \
--name "require-environment-tag" \
--display-name "Exiger le tag Environment sur les ressources" \
--policy "/providers/Microsoft.Authorization/policyDefinitions/96670d01-0a4d-4649-9c89-2d3abc0a5025" \
--scope "/subscriptions/${SUB_ID}" \
--params '{
"tagName": {
"value": "Environment"
}
}'
# Vérifier la compliance
az policy state list --output table
Validation finale
# Lister tous les role assignments
echo "=== Assignments sur app-dev-rg ==="
az role assignment list --resource-group app-dev-rg --output table
echo "=== Assignments sur app-prod-rg ==="
az role assignment list --resource-group app-prod-rg --output table
echo "=== Vérifier les groupes ==="
az ad group member list --group "Developers" --query "[].displayName"
az ad group member list --group "Operations" --query "[].displayName"
echo "=== Policies actives ==="
az policy assignment list --query "[].{Name:displayName, Scope:scope}" --output table
7. Exercices Pratiques Additionnels
Exercice 1 : Configuration IAM de Base
Objectif
Configurer un environnement Entra ID sécurisé pour une équipe.
Tâches :
- Créer 3 utilisateurs :
dev-alice,dev-bob,ops-charlie - Créer 2 groupes :
DevelopersetOperations - Assigner les utilisateurs aux groupes appropriés
- Créer un rôle custom
VM Operator - Assigner les rôles sur un resource group de test
Solution
# 1. Créer les utilisateurs
DOMAIN="contoso.onmicrosoft.com"
for user in dev-alice dev-bob ops-charlie; do
az ad user create \
--display-name "$user" \
--user-principal-name "${user}@${DOMAIN}" \
--password "ChangeMe123!" \
--force-change-password-next-sign-in true
done
# 2. Créer les groupes
az ad group create --display-name "Developers" --mail-nickname "developers"
az ad group create --display-name "Operations" --mail-nickname "operations"
# 3. Assigner aux groupes
DEV_GROUP=$(az ad group show --group "Developers" --query id -o tsv)
OPS_GROUP=$(az ad group show --group "Operations" --query id -o tsv)
az ad group member add --group "Developers" --member-id $(az ad user show --id "dev-alice@${DOMAIN}" --query id -o tsv)
az ad group member add --group "Developers" --member-id $(az ad user show --id "dev-bob@${DOMAIN}" --query id -o tsv)
az ad group member add --group "Operations" --member-id $(az ad user show --id "ops-charlie@${DOMAIN}" --query id -o tsv)
# 4. Créer le resource group de test
az group create --name rbac-test-rg --location westeurope
# 5. Assigner les rôles
RG_SCOPE="/subscriptions/$(az account show --query id -o tsv)/resourceGroups/rbac-test-rg"
az role assignment create \
--assignee $DEV_GROUP \
--role "Contributor" \
--scope $RG_SCOPE
az role assignment create \
--assignee $OPS_GROUP \
--role "Reader" \
--scope $RG_SCOPE
# Vérifier
az role assignment list --resource-group rbac-test-rg --output table
Exercice 2 : Service Principal pour CI/CD
Objectif
Créer un Service Principal pour GitHub Actions avec les permissions minimales.
Solution
# Créer le SP avec permissions limitées
SP_OUTPUT=$(az ad sp create-for-rbac \
--name "sp-github-actions-prod" \
--role "Contributor" \
--scopes "/subscriptions/xxx/resourceGroups/app-prod-rg" \
--sdk-auth)
echo "$SP_OUTPUT"
# Configurer dans GitHub Secrets :
# AZURE_CREDENTIALS = $SP_OUTPUT (JSON complet)
# Pour plus de sécurité, utiliser Federated Credentials (OIDC)
APP_ID=$(echo $SP_OUTPUT | jq -r .clientId)
az ad app federated-credential create \
--id $APP_ID \
--parameters '{
"name": "github-main-branch",
"issuer": "https://token.actions.githubusercontent.com",
"subject": "repo:myorg/myrepo:ref:refs/heads/main",
"audiences": ["api://AzureADTokenExchange"]
}'
7. Résumé
| Concept | Description | Commande clé |
|---|---|---|
| Tenant | Répertoire Entra ID | az account show |
| Subscription | Conteneur de facturation | az account list |
| Resource Group | Conteneur logique | az group create |
| User | Identité utilisateur | az ad user create |
| Group | Groupe d'utilisateurs | az ad group create |
| Service Principal | Identité application | az ad sp create-for-rbac |
| Managed Identity | Identité managée Azure | az identity create |
| RBAC Role | Définition de permissions | az role assignment create |
Navigation
| Précédent | Suivant |
|---|---|
| ↩️ Introduction | Module 2 : VMs & Compute → |
Navigation
| ← Programme | Module 2 : Virtual Machines & Compute → |