# Configuration d'Entra ID avec Scaleway IAM

Le processus de configuration de l'authentification **Entra ID** (anciennement Azure AD) avec Scaleway se fait via le protocole **SAML 2.0** (Security Assertion Markup Language) et nécessite d'échanger des informations entre les deux plateformes.

> Cet article décrit étape par étape la configuration de l'authentification SAML 2.0 entre Scaleway et Microsoft Entra ID (anciennement Azure AD). Le processus comprend la mise en place de l'authentification unique (SSO) dans Scaleway, la configuration d'une application d'entreprise dans Entra ID et l'échange des URL et certificats nécessaires entre les plateformes. Il aborde également la gestion manuelle des utilisateurs dans Scaleway, les procédures de renouvellement des certificats et un script d'automatisation utilisant Azure DevOps pour le renouvellement régulier des certificats SAML. Les points clés à prendre en compte sont l'octroi d'autorisations adéquates pour Scaleway IAM, la gestion sécurisée des secrets et l'utilisation de l'API Scaleway IAM pour les mises à jour de configuration.

## Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

1. Un compte **Scaleway** avec un accès à la **Console** et le statut de **Propriétaire** de l'Organisation ou des permissions IAM suffisantes.
    
2. Un accès au **portail Microsoft Azure** (Entra ID) avec les droits nécessaires pour créer et configurer une application d'entreprise (SAML).
    
3. Vous comprenez le flux de connexion SAML.
    
    [![du flux de travail single Sign-On (SSO).](https://learn.microsoft.com/fr-fr/entra/identity-platform/media/single-sign-on-saml-protocol/saml-single-sign-on-workflow.png align="left")](https://learn.microsoft.com/fr-fr/entra/identity-platform/single-sign-on-saml-protocol)
    

## Phase 1 : Démarrer la configuration dans Scaleway

Cette première étape consiste à récupérer les informations que vous devrez fournir à Entra ID pour créer le lien.

1. Connectez-vous à la **Console Scaleway**: [https://console.scaleway.com/](https://console.scaleway.com/)
    
2. Accédez à vos **Paramètres de sécurité** (via les Settings) :
    
    * Cliquez sur l'icône de votre compte en haut à droite.
        
    * Sélectionnez **Organization Security** (Sécurité) puis sur **Organization authentication methods**:
        
        ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765185957026/08e6b9d6-1e62-40d5-b481-89f0ea5e66d6.png align="center")
        
3. Faites défiler jusqu'à la section **Identity Federation** (Fédération d'identité).
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765186044089/204da5d4-c627-4184-8ece-d7c940e9d03a.png align="center")
    
4. Cliquez sur le bouton **Set up SAML SSO** (Configurer le SSO). Une fenêtre contextuelle (pop-up) apparaît.
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765186075365/0924f187-c4e6-4413-8b34-e1a74737c3c7.png align="center")
    
5. **Copiez les deux URL** fournies par Scaleway. Ces URL correspondent à :
    
    * **Assertion Consumer Service (ACS) URL** (URL du service consommateur d'assertion Scaleway)
        
        ```plaintext
        https://api.scaleway.com/iam/v1/saml/<Your_Organization_GUID>/login
        ```
        
    * **Scaleway's Entity ID** (ID d'entité Scaleway)
        
        ```plaintext
        https://iam.scaleway.com/saml/<GUID>
        ```
        
    
    **Gardez cette fenêtre ouverte**, car vous y reviendrez à la Phase 3.
    

## Phase 2 : Configuration de l'Application dans Microsoft Entra ID (Côté Fournisseur d'Identité - IdP)

Vous allez maintenant créer une application d'entreprise dans Entra ID en utilisant les URL de Scaleway copiées précédemment.

1. Connectez-vous au **portail Azure** et naviguez vers **Microsoft Entra ID**, vous devez avoir un minima le rôle `Application Administrator`.  
    \- Si votre entreprise utilise [PIM](https://portal.azure.com/?feature.msaljs=true#view/Microsoft_Azure_PIMCommon/ActivationMenuBlade/~/aadmigratedroles/provider/aadroles) pensez à l’activer:
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765186612113/80063ab9-657f-49c1-b0d4-e38ebda2a48c.png align="center")
    
2. Accédez à **Applications d’entreprise**.
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765186850102/9eaa579d-377f-40a8-b218-fb97d06381fd.png align="center")
    
3. Cliquez sur **Nouvelle application**, puis **Créer votre propre application**.
    
4. Donnez un nom à l'application (ex. : *Scaleway SSO*).
    
5. Sélectionnez l'option **Intégrer toute autre application que vous ne trouvez pas dans la galerie (non-galerie)**.
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765186897359/7635cd01-67ea-4fb3-aa29-160270bf85d4.png align="center")
    
6. Une fois l'application créée, naviguez vers **Authentification unique (Single Sign-On)** dans le menu de gauche.
    
7. Sélectionnez **SAML**.
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765187019623/dba4053b-01fe-4f61-a2ac-d1ec9401a370.png align="center")
    

### 2.1. Configuration SAML de base (Section 1)

Dans la section **Configuration SAML de base** (Basic SAML Configuration) :

1. Cliquez sur **Modifier** (Edit).
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765187096923/1bf67b0e-7505-44f7-8df8-a241c0f5b548.png align="center")
    
2. Collez les URL de Scaleway dans les champs correspondants :
    
    * **Identifier (Entity ID)** : Collez l'**ID d'entité Scaleway** que vous avez copié au chapitre 1.
        
    * **Reply URL (Assertion Consumer Service URL)** : Collez l'**ACS URL** de Scaleway.
        
3. Enregistrez la configuration.
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765187318515/3a23a4d4-9f9f-47e0-9a12-8649eafdbdfb.png align="center")
    

### 2.2. Attributs et revendications (Section 2)

Vérifiez que les attributs et revendications (Attributes & Claims) sont correctement configurés. Scaleway a besoin de l'adresse e-mail de l'utilisateur.

* Assurez-vous que la revendication requise (Unique User Identifier - Name ID) est définie sur l'**adresse e-mail** de l'utilisateur (par exemple, `user.mail`).
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765187399804/fe3917f9-4812-4292-abd9-de6ff4913caa.png align="center")
    

### 2.3. Récupération des informations Entra ID (Section 3)

### Dans la section **Certificat de signature SAML** (SAML Signing Certificate), vous devez récupérer deux éléments et télécharger le certificat :

1. **Téléchargez le fichier “Federation Metadata XML”** et sauvegarder le fichier `.xml` qui sera nécessaire dans le chapitre 3.
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765187687340/6432da98-ee60-46a1-93b1-5486a5a1282e.png align="center")
    
2. **Copiez les deux URL** qui seront nécessaires dans Scaleway (elles se trouvent généralement dans la section **Configurer &lt;nom de votre application&gt;** ou **URL de connexion** et **Identificateur Entité IdP**) :
    
    * **Login URL / Single Sign-On URL** (URL de connexion)
        
    * **Azure AD Identifier / Identity Provider's Entity ID** (ID d'entité du Fournisseur d'identité)
        
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765187588157/9cbd4c85-d080-4b34-8d1c-f832c250ddcb.png align="center")
    

## Phase 3 : Finalisation de la connexion dans Scaleway

Revenez à la fenêtre contextuelle (pop-up) de Scaleway que vous avez laissée ouverte.

1. **Uploader le fichier de metadata au format XML:**
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765187835439/93c7941f-5e3d-4675-846a-c37a5ec12523.png align="center")
    
2. Cliquez sur **Submit** puis sur **Confirm** pour activer la fédération d’identité:
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765187891823/3f3576f4-f6fa-4213-bab2-5e07365fc309.png align="center")
    
3. La console Scaleway doit maintenant vous afficher ce rendu, avec un point d’attention sur l’**expiration du certificat** associé au SSO :
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765188098618/b119373b-6ff1-4a80-8c66-f48363cdf60b.png align="center")
    

## Phase 4 : Tester et Gérer

* **Test de connexion :** Pour vérifier que le lien fonctionne, vous pouvez créer un membre dans Scaleway avec une adresse e-mail correspondant à un utilisateur que vous avez déjà affecté à l'application dans Entra ID, puis essayer de vous connecter avec ce membre via le SSO.
    
    * Se connecter en tant que membre d’une organisation:
        
        ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765189128778/35b23ff5-4973-4b16-98bc-fc78559a588f.png align="center")
        
        ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765189192353/d9a9a15f-a77d-490a-9013-26b19c618a72.png align="center")
        
        ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765189238681/0a5b739d-54d5-4262-89e8-5cdc5caca852.png align="center")
        
* **Gestion des membres :** Notez que la création et la suppression des utilisateurs (Membres) dans Scaleway ne sont **pas automatiques** via SAML. Vous devez gérer les Membres manuellement dans Scaleway IAM.
    
* **Renouvellement du certificat :** Vous devrez régulièrement mettre à jour le certificat de signature dans Scaleway lorsque celui d'Entra ID expire. Cette option est disponible dans la section **Identity Federation** en cliquant sur **Renew certificate** (Renouveler le certificat).
    

## Phase 5 : Automatisation du renouvellement

* **Vérification et Génération Conditionnelle :** Vérifier la date d'expiration du certificat actuel. Si nous sommes à J-31 (ou moins), générer un nouveau certificat de signature.
    
* **Récupération du Plus Récent :** Récupérer ensuite le certificat le plus récent (qu'il ait été généré par le pipeline ou par la gestion automatique d'Entra ID) pour l'envoyer à Scaleway.
    

### Pipeline Azure DevOps : Renouvellement Automatique de Certificat SAML

```yaml
trigger: none
pr: none

schedules:
# Déclenchement planifié : par exemple, chaque dimanche à 00:00 UTC
- cron: "0 0 * * 0" 
  displayName: 'Renouvellement Hebdomadaire Certificat SAML'
  branches:
    include:
    - main
  always: true

pool:
  vmImage: 'ubuntu-latest' # A modifier si vous avez des agents DevOps privés

variables:
  # Configuration de l'environnement (à remplacer par vos valeurs/secrets)
  SCW_ORG_ID: '$(ScalewayOrganizationId)' 
  ENTRA_APP_NAME: 'Scaleway SSO'
  # SCW_SECRET_KEY, <VOTRE_CONNEXION_SERVICE_AZURE> et SAML_CONNECTION_ID 
  # doivent être configurés comme des secrets dans Azure DevOps.
  SAML_CONNECTION_ID: 'idp-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' 

# -------------------------------------------------------------------------
# --- Étape 1 : Vérification, Génération Conditionnelle & Récupération du Certificat Entra ID ---
# -------------------------------------------------------------------------
steps:
- task: AzureCLI@2
  displayName: '1. Vérif. & Génération du Certificat Entra ID'
  inputs:
    azureSubscription: '<VOTRE_CONNEXION_SERVICE_AZURE>' # Nom de la connexion de service Azure
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      #!/bin/bash
      set -e # Arrêter le script en cas d'erreur
      
      EXPIRY_THRESHOLD_DAYS=31 # Seuil de déclenchement pour la régénération (J-31)
      
      echo "--- 1. Recherche de l'ID de l'application Entra ID ---"
      APP_ID=$(az ad app list --display-name "$(ENTRA_APP_NAME)" --query "[0].id" -o tsv)

      if [ -z "$APP_ID" ]; then
          echo "##vso[task.logissue type=error]L'application $(ENTRA_APP_NAME) n'a pas été trouvée dans Entra ID."
          exit 1
      fi

      echo "--- 2. Vérification de la date d'expiration actuelle ---"
      
      # Récupération des détails du certificat SAML actuel (le plus proche de l'expiration)
      CERT_DETAILS=$(az ad app credential list --id "$APP_ID" \
          --query "[?usage=='Verify'] | min_by(@, &endDateTime)" -o json)
          
      CURRENT_EXPIRY_DATE=$(echo "$CERT_DETAILS" | jq -r '.endDateTime')
      
      # Calcul du temps restant en jours
      CURRENT_EXPIRY_TIMESTAMP=$(date -d "${CURRENT_EXPIRY_DATE%T*}" +%s)
      CURRENT_TIME_TIMESTAMP=$(date +%s)
      DAYS_UNTIL_EXPIRY=$(( (CURRENT_EXPIRY_TIMESTAMP - CURRENT_TIME_TIMESTAMP) / 86400 ))
      
      echo "Certificat actuel expire le : ${CURRENT_EXPIRY_DATE} (dans ${DAYS_UNTIL_EXPIRY} jours)."

      # 3. Génération conditionnelle du nouveau certificat
      if [ "$DAYS_UNTIL_EXPIRY" -le "$EXPIRY_THRESHOLD_DAYS" ]; then
          echo "⚠️ Le certificat expire dans moins de ${EXPIRY_THRESHOLD_DAYS} jours. Démarrage de la régénération..."
          
          # Ajoute un nouveau certificat de signature (clé publique) dans Entra ID
          az ad app credential add --id "$APP_ID" --usage Verify --key-type Symmetric
          
          echo "Nouveau certificat généré dans Entra ID. La période de chevauchement est créée."
      else
          echo "Le certificat est valable pour plus de ${EXPIRY_THRESHOLD_DAYS} jours. Aucune génération requise."
      fi

      echo "--- 4. Récupération du certificat le plus récent pour la mise à jour Scaleway ---"
      
      # On cible le certificat avec la date d'expiration la plus ÉLOIGNÉE (le futur certificat)
      CERT_VALUE=$(az ad app credential list --id "$APP_ID" \
        --query "[?usage=='Verify'] | max_by(@, &endDateTime).value" -o tsv)

      if [ -z "$CERT_VALUE" ]; then
          echo "##vso[task.logissue type=error]Aucun certificat de signature trouvé après la vérification/génération."
          exit 1
      fi

      # 5. Formater et stocker le certificat dans une variable secrète
      CERTIFICATE_BASE64="-----BEGIN CERTIFICATE-----\n$(echo "$CERT_VALUE" | fold -w 64)\n-----END CERTIFICATE-----"
      
      echo "Certificat Entra ID (le plus récent) récupéré et formaté avec succès."
      echo "##vso[task.setvariable variable=NEW_SCW_CERT;isSecret=true]$CERTIFICATE_BASE64"


# -------------------------------------------------------------------------
# --- Étape 2 : Mise à Jour du Certificat dans Scaleway via API ---
# -------------------------------------------------------------------------
- task: Bash@3
  displayName: '2. Mise à jour du certificat dans Scaleway'
  inputs:
    targetType: 'inline'
    script: |
      #!/bin/bash
      set -e
      
      # Récupération des secrets via les variables d'environnement du pipeline
      SCW_SECRET_KEY="$SCW_SECRET_KEY"
      NEW_CERT_BASE64="$NEW_SCW_CERT"
      SCW_ORG_ID="$(SCW_ORG_ID)"
      SAML_CONNECTION_ID="$(SAML_CONNECTION_ID)"

      if [ -z "$NEW_CERT_BASE64" ]; then
          echo "❌ ERREUR : Le certificat Entra ID est vide. Échec de la mise à jour Scaleway."
          exit 1
      fi

      echo "Démarrage de la mise à jour du certificat SAML dans Scaleway..."
      
      # Nettoyage du certificat pour la charge utile JSON
      CLEAN_CERT=$(echo "$NEW_CERT_BASE64" | sed '/^-----/d' | tr -d '\n' | tr -d ' ')
      
      # Appel API Scaleway IAM (v1alpha1) pour mettre à jour la connexion SAML
      API_URL="https://api.scaleway.com/iam/v1alpha1/organizations/${SCW_ORG_ID}/identity-providers/${SAML_CONNECTION_ID}"

      # Exécution de la requête PATCH
      curl -s -X PATCH "${API_URL}" \
           -H "X-Auth-Token: ${SCW_SECRET_KEY}" \
           -H "Content-Type: application/json" \
           -d "{\"certificate\": \"${CLEAN_CERT}\"}"
      
      if [ $? -eq 0 ]; then
          echo "✅ Mise à jour du certificat SAML dans Scaleway réussie."
      else
          echo "❌ Échec de l'appel API Scaleway. Vérifiez l'ID de connexion et les permissions IAM."
          exit 1
      fi
```

### Explication des Modifications Clés

1. **Vérification de la Date (J-31) :**
    
    * Nous utilisons `az ad app credential list` et l'outil `jq` (disponible sur l'agent Ubuntu) pour extraire la date d'expiration la plus proche (`min_by(@, &endDateTime)`).
        
    * Le calcul `DAYS_UNTIL_EXPIRY` compare cette date avec la date du jour (`date +%s`) pour déterminer s'il faut agir.
        
2. **Régénération via AZ CLI :**
    
    * Si la condition `DAYS_UNTIL_EXPIRY <= 31` est remplie, nous exécutons :
        
        Bash
        
        ```bash
        az ad app credential add --id "$APP_ID" --usage Verify --key-type Symmetric
        ```
        
        Cette commande **ajoute un nouveau certificat de signature** à l'application d'entreprise dans Entra ID, créant ainsi un nouveau certificat de plus longue durée qui sera automatiquement le "plus récent" (plus éloigné dans le temps).
        
3. **Ciblage du Plus Récent :**
    
    * Qu'un nouveau certificat ait été généré ou non, l'étape finale utilise toujours :
        
        Bash
        
        ```bash
        max_by(@, &endDateTime).value
        ```
        
        Ceci garantit que nous sélectionnons toujours le certificat avec la date d'expiration la plus éloignée, qui sera soit le nouveau certificat que nous venons d'ajouter, soit le certificat de chevauchement qu'Entra ID a généré automatiquement. C'est le certificat que nous voulons pousser vers Scaleway.
        

## Mise en garde et Sécurité

1. **Permissions Scaleway (IAM)** : La clé d'accès Scaleway (`SCW_ACCESS_KEY`/`SCW_SECRET_KEY`) doit avoir une politique IAM lui permettant d'effectuer l'action de mise à jour sur les fournisseurs d'identité (par exemple, `iam:IdentityProvider:Update`).
    
2. **API Scaleway** : L'API pour la gestion de la fédération d'identité est actuellement en version `v1alpha1`. Assurez-vous de consulter la documentation la plus récente de l'API IAM de Scaleway pour l'endpoint et le format de la requête `PATCH` exacts.
    
    <div data-node-type="callout">
    <div data-node-type="callout-emoji">💡</div>
    <div data-node-type="callout-text">Pour plus de détails <a target="_self" rel="noopener noreferrer nofollow" href="https://www.scaleway.com/en/developers/api/iam/#path-saml-update-saml-identity-provider-configuration" style="pointer-events: none">https://www.scaleway.com/en/developers/api/iam/#path-saml-update-saml-identity-provider-configuration</a></div>
    </div>
    
3. **Secrets** : **NE JAMAIS** coder en dur les clés secrètes dans le pipeline YAML. Utilisez toujours des **variables Secrètes** d'Azure DevOps et, idéalement, **Azure Key Vault** pour stocker `SCW_SECRET_KEY` et la connexion de service Azure.
