SSO Nextcloud via Keycloack

SSO Nextcloud via Keycloack

Le tout dockerisé et tournant sur un Proxmox !

Aujourd’hui j’ai décidé de dépoussiérer mon vieux Proxmox pour y créer une VM Debian qui nous permettra de jouer un peu avec Docker. Ici, nous allons mettre en place un conteneur Nextcloud, un conteneur Keycloack, et ensuite nous relierons ces deux-ci ensemble pour pouvoir réaliser du SSO !

I) Keycloack, c’est quoi au juste ?

Keycloack est un projet OpenSource sponsorisé par RedHat. Il joue le rôle d’IAM, c’est-à-dire d’Identification And Access Management, pour permettre la mise en place de portail SSO par exemple.

« Oui mais, un IAM, quelle(s) différence(s) avec un OpenLDAP ou un ActiveDirectory par exemple ? »

Bonne question… et débutant tout juste je ne maîtrise pas encore toutes les subtilités, mais on peut voir les choses comme ça :

  • Un annuaire (OpenLDAP, AD, autre) est un endroit où on stocke les données sur les personnes et autres objets, comme les imprimantes par exemple. Il permet de leur rajouter divers attributs ;
  • Un système IAM est la façon de manager ces données avec une bonne efficacité au niveau des contrôles, en permettant par exemple de la multi-authentification ou du SSO pour les applications web, chose bien moins aisée voir impossible avec les applications LDAP classiques ;

Il faut savoir que lorsque les applications web sont devenues pléthores dans le monde de l’entreprise, la plupart des développeurs/sysadmins ont eut pas mal de difficultés à lier ces applications avec LDAP, on a donc inventé par la suite le protocole SAML. Le but de ce protocole (et d’autres qui suivront, comme OpenID Connect, OAuth…) est d’étendre cette authentification dans le monde du Cloud, qui devient de plus en plus présent. En général, en entreprise, on continuera d’utiliser LDAP pour les ressources locales, et on rajoutera par dessus un IAM pour permettre du SSO, et donc gérer/contrôler l’authentification et l’accès aux applications Cloud utilisée par celle-ci.

Chez Microsoft par exemple, on peut citer leur solution Cloud nommé Azure Active Directory, ou chez Amazon leur offre AWS IAM.

II) Le lab

Nous aurons donc :

  • Un Proxmox en version 7.0, avec comme IP : 192.168.10.180/24 ;
  • Une VM Debian 10, avec comme IP : 192.168.10.181/24 ;
    • Un conteneur Nextcloud ;
    • Un conteneur Keycloack ;

III) Création des conteneurs Docker

Je passe volontairement sur l’installation de Proxmox et du setup de la VM Debian tant c’est trivial. Passons directement à la mise en place de notre Nextcloud, ici je vais me contenter de run une instance classique via l’image nextcloud, et en utilisant une base de données SQLite.

Concernant Keyclock, son image ne se trouve pas sur le Docker Hub comme la plupart des autres applications, il faut se rendre sur quay.io pour la télécharger (et oui, sponsorisé par Red Hat pour rappel !). Le lien direct -> https://quay.io/repository/keycloak/keycloak

On peut ensuite démarrer notre conteneur via la commande suivante :

docker run -p 9090:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:18.0.0 start-dev

Ici le conteneur sera exposé sur le port 9090, un utilisateur admin/admin sera créé, et le mode « dev » sera activé. Bien-entendu, il est possible de créer un joli petit docker-compose pour l’adapter à de la production, mais ici il s’agit d’un simple lab 😉

Une fois démarré, on peut se rendre sur la WebUI :

Place maintenant à la mise en place de notre saint SSO !

IV) Configuration de Keyclock

On peut donc cliquer sur Administration Console, et rentrer les credentials définis plus haut (admin/admin) :

Nous accédons enfin à notre console de gestion !

Keycloack étant un outil regorgeant de fonctionnalités et demandant pas mal d’expertise, je ne peux que vous conseiller de vous appuyer sur la doc’ ou d’aller consulter la chaîne de ce bon vieux Xavki, ce dernier a justement sorti une playlist complète sur cet outil, car décrire chaque composant serait bien trop long pour un seul article.

Dans l’onglet Realm Settings on peut retrouver quelques paramètres intéressants, comme ici la protection contre brute force à activer dès notre instance installée pour plus de sécurité.

Bien, nous allons maintenant créer notre client, qui sera donc notre serveur Nextcloud. Pour ce faire, on se rend sur l’onglet Clients puis Create :

On lui renseigne un nom (Client ID), on choisi le type de protocole utilisé, ici ce sera OpenID-Connect, et enfin l’URL de notre serveur. Dans le cadre ce lab j’ai mis l’URL en HTTP de mon conteneur Docker, mais si vous avez un Nextcloud hébergé de manière « propre », vous pouvez tout à faire mettre quelque chose comme https://cloud.notamax.be/.

Ensuite, nous pouvons le configurer :

Ici rien de très complexe, on renseigne un nom, une description, on choisi l’Access Type à Confidential, car notre client doit renseigner un secret pour initier la connexion (à contrario de public par exemple).

On laisse les différentes options par défaut, et on descend un peu plus bas pour adapter nos URLs :

Veillez à ce que votre Root, Valid Redirect URIs, Base, Admin, et Web Origins soient correctes !

On peut désormais enregistrer notre configuration, et passer du côté de Nextcloud.

V) Configuration du Nextcloud pour authentification via OpenID-Connect

La première étape est d’installer l’extension Social Login :

Puis en nous rendant dans les paramètres, on clique sur notre application fraîchement installée pour la paramétrer. Cliquez en premier lieu sur Sauvegarder après avoir (ou pas) coché certaines options désirées :

On clique ensuite sur Custom OpenID Connect, et on rempli les champs adéquats :

A savoir :

  • Internal name: Mettez un nom qui vous convient ;
  • Title : idem ;
  • Authorize URL : http://192.168.10.181:9090/realms/master/protocol/openid-connect/auth, vous mettez donc votre URL en rajoutant le /realms/master/protocol/openid-connect/auth, où /master/ est le nom de votre realm, ici via l’instance de test de Keycloack celui-ci est nommé master ;
  • Token URL : http://192.168.10.181:9090/realms/master/openid-connect/token, comme pour l’Authorize URL, vous avez compris l’idée ;
  • User info URL (optional) : http://192.168.10.181:9090/realms/master/protocol/openid-connect/userinfo ;
  • Client ID: l’id du client créé sur notre Keycloack, il s’agissait de nextcloud-lab ;
  • Client Secret : pour l’obtenir retournez sur la console admin de Keycloack, sur les paramètres de votre client, et allez dans Credentials puis Secret ;
  • Scope : openid ;
  • Button style : optionnel, mais vous pouvez choisir Keycloack histoire que ce soit sympatoche ;

Et c’est déjà pas mal ! On peut valider le tout en cliquant sur Sauvegarder en bas de page.

VI) Tests de connexion

Si l’on se rend sur notre Nextcloud à nouveau, vous verrez le joli bouton Connexion avec Keycloack de disponible :

Bien-entendu, si l’on essaie de se connecter avec un compte créé simplement sur notre Nextcloud, cela ne fonctionnera pas :

Il faut créer un utilisateur sur notre Keycloack, ou bien lier ce dernier à un annuaire LDAP (peut être un futur article ?) :

Une fois notre user créé, on lui setup un mot de passe en nous rendant dans Credentials :

Et si l’on essaie de se connecter avec ce user, tadaaaa !

Nous avons réussi à mettre en place notre instance SSO ! A noter que si l’on se rend dans la liste de users Nextcloud, ce dernier l’a créé de manière automatique :

On notera que keycloack rajoute un ID spécifique comme nom d’utilisateur. Cet utilisateur se trouve dans le groupe admin car par défaut j’avais choisi cela dans Default group du plugin :p

Cependant, si l’on veut assigner l’utilisateur à un groupe, on peut modifier légèrement la configuration du plugin Social Login :

Ici, on indique d’automatiquement créer le groupe si ce dernier n’existe pas, et ensuite il faut légèrement modifier certaines choses côté Keycloack.

Dans la partie Clients, puis Nextcloud-lab on se rend sur l’onglet Roles et on peut y créer nos groupes. Ici, je vais créer un groupe nommé Comptabilité :

Puis ensuite il faut rajouter un Mapper, en se rendant dans l’onglet correspondant. Ici, on clique sur Add builtin, puis on rajoute client roles :

Ensuite il convient de modifier le nom du claim qui sera intégré au token. On remplace la valeur Token Claim Name par roles :

Et enfin, après avoir créé notre user on se rend sur Role Mappings, et dans Client Roles on peut choisir notre instance Nextcloud, puis lui assigné le nom du role (du groupe) voulu :

Pensez à retirer les rôles assignés pour le Realm, car sinon Nextcloud vous créera des groupes comme Keycloack-default-roles-master, Keycloack-offline-access, Keycloack-uma_authorization

Et enfin, après avoir fait ces dernières retouches, on peut tester de se connecter avec notre nouvel utilisateur :

Nextcloud a bien créer notre groupe Comptabilité, et notre utilisateur en est bien membre ! Parfait !

VII) Conclusion

Ceci conclu donc ce premier article sur Keycloack ! Comme dit en introduction, je découvre tout juste ce soft’ ainsi que la notion d’IAM, mais rien de mieux pour apprendre que de réaliser quelques labs…

J’aurais tout de même plusieurs petites remarques après coup :

  • Je n’ai trouvé presque aucun tutoriel en français pour la liaison Nextcloud/Keycloack, et certains en anglais sont assez vieux, ils utilisent par exemple la version 16 de Keycloack, ce qui modifie certaines choses (notamment au niveau des URLs, on doit remplacer le /auth/ ou autres choses du genre). Le temps de me rendre compte, j’avais déjà passé plusieurs dizaines de minutes à tourner en rond 🤡 ;
  • J’ai voulu rajouter de la 2FA avec Yubikey, histoire de pousser la chose encore plus loin… mais il faut me rendre à l’évidence: je n’ai pas encore les connaissances suffisantes car Keycloack peut s’avérer très complexe à configurer ;
  • Concernant la nomenclature des utilisateurs/groupes créés via Keycloack, il y a possibilité de supprimer l’ID à rallonge et de n’avoir que quelque chose « d’humain », j’en ferai éventuellement un rapide article ;

Et c’est à peu près tout… 😉

Pour un novice en la matière, je trouve que je m’en suis assez bien sorti, mais surtout j’espère vous avoir appris quelques bricoles, comme d’habitude !

Sur ce, bonne journée/soirée à vous !

11 comments

comments user
Mat

Très très intéressant ! Merci beaucoup et vivement la/les suites avec Keycloack (LDAP, 2FA, « human » ID, intégration avec d’autres services peut-être Bitwarden – plus tricky apparemment – ou Gitea – qui nécessite obligatoirement un LDAP pour le management centralisé d’utilisateurs, etc.)

    comments user
    Mairien Anthony

    Merci à toi Mat !

    Effectivement un article avec ActiveDirectory & Gitea est prévu 😉

comments user
wouldsmina

Bonjour,
un autre interet du sso, c’est que le mot de passe ne transite pas par les applications mais uniquement par le sso. A la place du mot de passe, ce dernier transmet un ticket ou un token a l’application. Cela permet de reduire la surface d’attaque d’un pirate qui essayerai d’intersepter les mots de passe grace a une faille dans une des nombreuses applications composant unbsysteme d’information

    comments user
    Mairien Anthony

    Merci à toi pour ce commentaire !

    Effectivement c’est une sacrée sécurité supplémentaire 🙂

      comments user
      Mat

      Même si du coup SSO rime avec SPOF et donc une fois celui-ci obtenu on peut accéder à tous les autres services. Donc 2FA obligatoire dans ce cas.

comments user
Mat

HS: Je ne sais pas trop comment te contacter en direct. Du coup je profite de t’envoyer ça ici 😉

Est-ce que tu voudrais bien me donner un avis sur ce tool sysadmin en CLI ? :

https://github.com/matbgn/prommanager

Hésites pas à me faire un feedback par email vu que toi tu l’as en base 😉

Au plaisir

    comments user
    Mairien Anthony

    Hey Mat ! Je vais checker ça et je te renvois un petit mail dès que j’ai le temps :p

comments user
bbo

Bonjour,

Une bonne pratique est de ne pas utiliser directement le royaume « master » pour autre chose que la création d’autres royaumes.

https://www.keycloak.org/docs/latest/server_admin/#the-master-realm

Dans ton cas, on pourrait imaginer un royaume « nuage perso » dans lequel tu auras ton client nextcloud mais où tu pourras aussi mettre un client bitwarden (pour reprendre l’exemple d’un commentaire précédent) quand tu mettras ce service en place !

    comments user
    Mairien Anthony

    Hey, merci pour ce commentaire bbo !

    Effectivement, même instinctivement je me suis dit qu’il fallait mieux créer un Realm dédié, mais comme dit en début/intro il s’agissait d’un simple lab, voir d’un « proof-of-concept » si j’ose dire :p

    Merci encore à toi pour le petit pointage vers la documentation 😉

comments user
Christophe

Hello,

très bien construit, m’a beaucoup aidé dans mon projet. Par contre petite erreur dans le chapitre 5.
Le lien token http://192.168.10.181:9090/realms/master/openid-connect/token n’est pas bon il manque protocol c’est http://192.168.10.181:9090/realms/master/protocol/openid-connect/token. Ca doit être un oublie car on voit bien le début du mot protocol dans le screenshot 🙂

Laisser un commentaire