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 :
- 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
: - Créer un nouveau certificat (Choix N).
-
Sélectionner le site ajouté au préalable dans IIS :
- 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 :
-
Une liaison https (vhost) a été automatiquement générée pour le site web :
-
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) :
-
Afficher les détails avec D, puis noter le
.pfx password
: -
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) : -
Saisir le mot de passe de la clé privée (
.pfx password
noté au préalable) et cocherMarquer cette clé comme exportable
: - 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) :
-
Il est maintenant possible d'exporter la clé privée du certificat :
-
Exporter toutes les propriétés étendues :
-
Saisir un mot de passe pour protéger la clé privée :
-
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
: - 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) : -
Spécifier un compte de service :
- 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 :
- 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
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
avecocc
(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) :
-
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.
-
Configurer les options IdP :
- Identifiant de l'entité IdP : http://adfs2-dev.example.com/adfs/services/trust
- URL cible du fournisseur d'identités à qui le fournisseur de service enverra la requête d'authentification : https://adfs2-dev.example.com/adfs/ls
- 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 :
-
Dans l'onglet "Détails", copier dans un fichier :
- 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 : -
Mapper les attributs suivants au minimum :
- Attribut pour relier le nom d'utilisateur : http://schemas.microsoft.com/identity/claims/displayname
- Attribut pour relier l'adresse mail : http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
-
Télécharger le fichier
metadata.xml
: -
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 :
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 :
- Prendre en charge les revendications.
-
Importer les données concernant la partie de confiance à partir du fichier
metadata.xml
téléchargé préalablement : - 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é :
-
La partie de confiance a été configurée à l'aide du fichier
metadata.xml
fourni. -
Editer la stratégie d'émission de revendication :
-
2 règles de revendication de transformations sont à ajouter au minimum :
- userPrincipalName
- Le modèle de régle de revendication à suivre est : Envoyer les attributs LDAP en tant que revendications.
-
Règle userPrincipalName :
-
Règle Email :
- 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 :
-
Utiliser un compte de l'Active Directory autoriser à se connecter à travers l'AD FS :
-
Congratulations !
Ressources en vrac
- https://blog.kveer.fr/login-nextcloud-saml-adfs/
- https://www.virtualease.fr/nextcloud-authentication-active-directory-sso-via-adfs-saml/
- http://os-zenia.blogspot.com/2021/01/nextcloud-sso-adfs.html
- https://rephlex.de/blog/2018/04/05/how-to-connect-nextcloud-to-active-directory-using-ad-fs-without-losing-your-mind/
- https://www.myworkdrive.com/fr/support/adfs-single-sign-sso-integration-guide/
- https://www.infotechram.com/wp-content/uploads/2020/07/Installing-Active-Directory-Federation-Services.pdf
- https://www.alitajran.com/export-lets-encrypt-certificate-in-windows-server/
-
https://www.rcfed.com/SAMLWSFed/CommonClaimtypelist
https://docs.microsoft.com/fr-fr/dotnet/api/system.security.claims.claimtypes?view=net-6.0
- https://docs.microsoft.com/fr-fr/windows-server/identity/ad-fs/troubleshooting/ad-fs-tshoot-initiatedsignon
- https://help.mulesoft.com/s/article/Configuring-ADFS-SLO-endpoint
- https://pitstop.manageengine.com/portal/en/kb/articles/saml-auto-login-with-adfs