Cet article fait office de PoC (Proof of Concept) sur la mise en place d'une authentification SSO (Single-Sign-On) à travers le service ADFS (Active Directory Federation Services) de Microsoft et l'application Open Source Nextcloud.

Cela va permettre aux utilisateurs de la plateforme Nextcloud de s'authentifier avec leur compte Active Directory en utilisant le protocole SAML dans des contextes réseaux totalement différents.

Environnement

  • Environnements déjà déployés :
    • Nextcloud v24.0.2
    • Contrôleur de domaine Windows Serveur 2019
  • Informations :
    • Domaine AD : aukfood.lan
    • Nom serveur AD : adfs-dev
    • Domaine publique utilisé : example.com (remplace les parties floutées dans les captures d'écrans)
    • URL Nextcloud : https://nc-dev.example.com
    • Enregistrement DNS pour l'ADFS : adfs2-dev.example.com

Génération du certificat Let's Encrypt

A effectuer sur le serveur Windows (Tous les services seront déployés sur le contrôleur de domaine) :

  • Installation de IIS en Powershell :

    Install-WindowsFeature -name Web-Server -IncludeManagementTools
  • Faire un enregistrement de type A dans une zone DNS publique pour le serveur IIS :

    adfs2-dev IN A xxx.xxx.xxx.xxx

Dans ce PoC, le domaine publique utilisé sera example.com.

  • Créer la racine du site web pour résoudre le challenge :

    mkdir c:\inetpub\adfs2-dev.example.com
  • Créer un fichier index.html dans la racine du site web :

    notepad c:\inetpub\adfs2-dev.example.com\index.html
  • Insérer le contenu suivant puis enregistrer :

    Hello World
  • Ouvrir la console de Gestionnaire des services Internet (IIS).

  • Supprimer le site web par défaut.

  • Ajouter un nouveau site web :

    image-20220629173936647

  • Télécharger le client ACME pour Let's Encrypt ici : https://www.win-acme.com/

A l'heure actuelle, la dernière version : https://github.com/win-acme/win-acme/releases/download/v2.1.22.1267/win-acme.v2.1.22.1267.x64.pluggable.zip

  • Décompresser l'archive et déplacer le fichier Web_Config.xml à la racine du site web.

  • Redémarrer le site web.

  • Lancer une ligne de commandes et se positionner dans le répertoire préalablement extrait.

  • Exécuter wacs.exe :

    image-20220629172217587

  • Créer un nouveau certificat (Choix N).

  • Sélectionner le site ajouté au préalable dans IIS :

    image-20220629174215379

  • Peu importe si le certificat est de type wildcard ou non.

  • Le certificat est généré avec une tâche planifiée qui va renouveller le certificat automatiquement :

    image-20220629174528336

  • Une liaison https (vhost) a été automatiquement générée pour le site web :

    image-20220629175250793

  • Ce certificat est celui qui sera exploité par le service AD FS.

Exportation du certificat au format pfx

  • Re-lancer l'outil wacs.exe.

  • Faire le choix A (Manage renewals) :

    image-20220629182842875

  • Afficher les détails avec D, puis noter le .pfx password :

    image-20220629183139844

  • Ouvrir le dossier des certificats Let's Encrypt :

    explorer C:\ProgramData\win-acme\acme-v02.api.letsencrypt.org\Certificates\
  • Sélectionner le certificat .pfx correspondant puis démarrer l'assistant d'importation du certificat au niveau de l'ordinateur local (Pour rappel : c'est le DC) :

    image-20220629184339453

  • Saisir le mot de passe de la clé privée (.pfx password noté au préalable) et cocher Marquer cette clé comme exportable :

    image-20220630082547704

  • Sélectionner automatiquement le magasin de certificats.

  • Terminer l'assistant d'importation du certificat.

  • Ouvrir la gestion des certificats de l'ordinateur local :

    certlm.msc
  • Dans "Personnel\Certificats" (1), sélectionner le certificat préalablement importé (2). Dans "Toutes les tâches" (3), sélectionner "Exporter" (4) :

    image-20220630083328159

  • Il est maintenant possible d'exporter la clé privée du certificat :

    image-20220630083457141

  • Exporter toutes les propriétés étendues :

    image-20220630083627092

  • Saisir un mot de passe pour protéger la clé privée :

    image-20220630083813883

  • Spécifier le nom du fichier à exporter au format pfx.

  • Terminer l'assistant d'exportation du certificat.

Installation AD FS

  • Installer le service ADFS-Federation en Powershell :

    Install-WindowsFeature -name ADFS-Federation -IncludeManagementTools
  • Créer la clé racine du service de distribution de clés en Powershell :

    Add-KdsRootKey -EffectiveTime (Get-Date).AddHours(-10)
  • La configuration du service se fera en mode graphique à travers le gestionnaire de serveur servermanager.exe :

    image-20220630114920640

  • Créer le premier serveur de fédération dans une batterie de serveurs de fédération.

  • Importer le certificat préalablement exporté au format .pfx (1). Puis, entrer un nom pour le service FS (2) :

    image-20220630133612131

  • Spécifier un compte de service :

    image-20220630134121333

  • Une base de données SQL Server peut être exploitée. Dans ce PoC, une base de données interne Windows est utilisée.

  • Après examen des options, la configuration peut être lancée :

    image-20220630134402869

  • Redémarrer le serveur Windows.

  • Activer la page de login de l'ADFS en Powershell :

    Set-AdfsProperties -EnableIdpInitiatedSignonPage $true
  • Tester la connexion : https://adfs2-dev.example.com/adfs/ls/IdpInitiatedSignon.aspx

    image-20220630141116182

Paramétrage Nextcloud

  • Se connecter en SSH sur le serveur Nextcloud et se positionner à la racine du projet web :

    cd /var/www/nc-dev.example.com/www/
  • Installer l'application user_saml avec occ (A adapter selon le propriétaire du projet web) :

    sudo -u nextcloud php8.0 occ app:install user_saml
    # user_saml 5.0.2 installed
    # user_saml enabled
  • Se connecter à l'interface web du Nextcloud en admin.

  • Se rendre dans "Paramètres" (1) / "Authentification SSO & SAML" (2). Puis "Utiliser l'authentification SAML intégrée" (3) :

    image-20220630140157898

  • Dans la partie "Général", entrer l'Attribut pour relier l'UID :

    http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn

C'est l'UPN du compte de l'utilisateur dans l'AD qui fera office de nom d'utilisateur au sein de l'instance Nextcloud.

image-20220630140651305

  • Configurer les options IdP :

    image-20220630141706164

  • Cliquer sur "Hide optional Identity Provider settings" pour accéder au champ Certificat public X.509 de l'IdP.

  • Sur le serveur Windows, ouvrir la console de gestion de l'ADFS :

    %windir%\ADFS\Microsoft.IdentityServer.msc
  • Dans "Service" / "Certificats" (1), Afficher le certificat (2) utilisé pour la signature de jetons :

    image-20220630142847703

  • Dans l'onglet "Détails", copier dans un fichier :

    image-20220630143034704

  • Exporter au format : *X.509 encodé en base 64 (.cer)**

  • Spécifier un nom de fichier pour l'export.

  • Copier le contenu de ce fichier exporté au format .cer et le coller dans le champ Certificat public X.509 de l'IdP dans Nextcloud :

    image-20220630143523748

  • Mapper les attributs suivants au minimum :

    image-20220630143833948

  • Télécharger le fichier metadata.xml :

    image-20220630144006856

  • Pour avoir la possibilité de garder l'authentification avec la base utilisateur interne de Nextcloud, cocher Autoriser l'utilisation de plusieurs systèmes d'authentification :

    image-20220630144234576

Bien vérifier l'enregistrement du paramétrage en quittant le menu "Authentification SSO & SAML" et en y revenant (Surtout sur le paramétrage du point précédent).

Paramétrage AD FS

  • Sur le serveur Windows, ouvrir la console de gestion de l'AD FS :

    %windir%\ADFS\Microsoft.IdentityServer.msc
  • Ajouter une approbation de partie de confiance :

    image-20220630151040792

  • Prendre en charge les revendications.

  • Importer les données concernant la partie de confiance à partir du fichier metadata.xml téléchargé préalablement :

    image-20220630151343201

  • Saisir un nom pour cette approbation et éventuellement des notes.

  • Sélectionner une stratégie de contrôle d'accès. Dans ce PoC, tout le monde sera autorisé :

    image-20220630151559318

  • La partie de confiance a été configurée à l'aide du fichier metadata.xml fourni.

  • Editer la stratégie d'émission de revendication :

    image-20220630151802258

  • 2 règles de revendication de transformations sont à ajouter au minimum :

    • userPrincipalName
    • Email
  • Le modèle de régle de revendication à suivre est : Envoyer les attributs LDAP en tant que revendications.

  • Règle userPrincipalName :

    image-20220630152456345

  • Règle Email :

    image-20220630152543102

  • Appliquer les 2 règles ajoutées.

Vérification de l'authentification

  • Se connecter à Nextcloud, et choisir de s'authentifier au travers une Connection SSO & SAML :

    image-20220630152933665

  • Utiliser un compte de l'Active Directory autoriser à se connecter à travers l'AD FS :

    image-20220630153048587

  • Congratulations !

    image-20220630153150780

Ressources en vrac