<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SAML on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/saml/</link><description>Recent content in SAML on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Wed, 11 May 2022 12:30:00 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/saml/index.xml" rel="self" type="application/rss+xml"/><item><title>S'authentifier sur Proxmox VE avec Keycloak</title><link>https://blog.zwindler.fr/2022/05/11/s-authentifier-sur-proxmox-avec-keycloak/</link><pubDate>Wed, 11 May 2022 12:30:00 +0000</pubDate><guid>https://blog.zwindler.fr/2022/05/11/s-authentifier-sur-proxmox-avec-keycloak/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/08/sign_in_with_google.webp" alt="Featured image of post S'authentifier sur Proxmox VE avec Keycloak" /&gt;&lt;h2 id="résumé-des-épisodes-précédents"&gt;Résumé des épisodes précédents
&lt;/h2&gt;&lt;p&gt;Cet article est la suite d&amp;rsquo;un article que j&amp;rsquo;avais sorti en aout dernier (time flies&amp;hellip;) sur &lt;a class="link" href="https://blog.zwindler.fr/2021/08/30/installer-keycloak-15-sur-ubuntu-20-04-sans-docker/" &gt;l&amp;rsquo;installation de Keycloak (sans utiliser l&amp;rsquo;image Docker)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;avais bien entendu une idée derrière la tête (on installe pas un Keycloak pour le plaisir ?). cette idée était de tirer parti de l&amp;rsquo;authentification OIDC qui venait d&amp;rsquo;être ajoutée à Proxmox VE 7.&lt;/p&gt;
&lt;p&gt;Je pars donc du principe que vous avez un serveur Keycloak fonctionnel et on va s&amp;rsquo;en servir pour ajouter l&amp;rsquo;authentification OIDC à notre cluster PVE.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting Started
&lt;/h2&gt;&lt;p&gt;Dans l&amp;rsquo;article précédent, je vous avais laissé au moment où on se connectait à l&amp;rsquo;UI de Keycloak, et qu&amp;rsquo;on arrivait sur le &amp;ldquo;Getting Started&amp;rdquo;. Si vous voulez plus de détails sur cette étape, je vous conseille de lire &lt;a class="link" href="https://www.keycloak.org/guides" target="_blank" rel="noopener"
&gt;l&amp;rsquo;article de documentation associé sur le site officiel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/08/keycloak_admin.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Nous, on va commencer direct par la création d&amp;rsquo;un &amp;ldquo;Realm&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Dans un contexte multi client ou multi entreprise, les Realms vous permettraient d&amp;rsquo;avoir un Realm par client par exemple, chacun avec son propre système d&amp;rsquo;authentification (LDAP, AD, &amp;hellip;).&lt;/p&gt;
&lt;p&gt;Ici, on ne va pas d&amp;rsquo;embêter, je fais un realm pour mon Proxmox et il servira juste pour ça.&lt;/p&gt;
&lt;h2 id="créer-un-realm"&gt;Créer un Realm
&lt;/h2&gt;&lt;p&gt;C&amp;rsquo;est peut-être un manque d&amp;rsquo;habitude, mais j&amp;rsquo;ai pas trouvé la navigation entre &amp;ldquo;Realm&amp;rdquo; hyper intuitive, au début. En fait, par défaut vous êtes sur un realm &amp;ldquo;master&amp;rdquo; (visible tout en haut à gauche de l&amp;rsquo;écran, sous le logo Keycloak).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/08/keycloak_master.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;En cliquant sur la flèche qui va vers le bas, à droite de &amp;ldquo;Master&amp;rdquo;, on ouvre un menu déroulant, qui dévoile option &amp;ldquo;Add realm&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/05/add_realm.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On lui donne un petit nom et c&amp;rsquo;est bon.&lt;/p&gt;
&lt;h2 id="créer-un-client"&gt;Créer un client
&lt;/h2&gt;&lt;p&gt;Dans la terminologie Keycloak (OIDC en général), un client, ça va en fait être notre application qui va déléguer l&amp;rsquo;authentification à Keycloak.&lt;/p&gt;
&lt;p&gt;Dans le realm Proxmox, on va donc créer un client pour ProxmoxVE.&lt;/p&gt;
&lt;p&gt;On lui donne un petit nom, mais surtout l&amp;rsquo;URL de connexion qui va avec (on prend le premier serveur du cluster, car chaque serveur à sa propre URL de connexion à l&amp;rsquo;UI, mais on va gérer ça plus tard).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/05/add_client.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Vous devriez ensuite être redirigé vers les paramètres (plus complets) du client. De mémoire, il n&amp;rsquo;y a rien à changer, les paramètres par défaut sont bons, sauf si vous avez plusieurs URIs de connection.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est mon cas, j&amp;rsquo;ai plusieurs serveurs proxmox VE en cluster, mais je n&amp;rsquo;ai pas de loadbalancer qui me redirige sur les backends :8006 sur même URL en frontal.&lt;/p&gt;
&lt;p&gt;Je dois donc renseigner dans la case &amp;ldquo;Valid Redirect URIs&amp;rdquo; autant d&amp;rsquo;URI que j&amp;rsquo;ai de serveurs PVE.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/05/redirect_uri.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="créer-un-utilisateur-dans-keycloak"&gt;Créer un utilisateur dans Keycloak
&lt;/h2&gt;&lt;p&gt;Avant d&amp;rsquo;aller configurer Proxmox VE, on va vouloir ajouter des utilisateurs dans Keycloak.&lt;/p&gt;
&lt;p&gt;Idéalement, vous avez déjà une base de comptes interne (LDAP, AD, etc) ou externe (Google Gmail, Azure AD, que sais-je encore). C&amp;rsquo;est cet &amp;ldquo;Identity Provider&amp;rdquo; que vous allez devoir connecter à votre Keycloak. Cependant, ça sort du scope de cet article.&lt;/p&gt;
&lt;p&gt;Pour info, j&amp;rsquo;ai réussi en très peu de temps, et en suivant cet article &lt;a class="link" href="https://web.archive.org/web/20240204123315/https://keycloakthemes.com/blog/how-to-setup-sign-in-with-google-using-keycloak" target="_blank" rel="noopener"
&gt;How to setup Sign in with Google using Keycloak (lien mort, j&amp;rsquo;ai utilisé Internet Archive)&lt;/a&gt;, à connecter mon compte gmail perso à Keycloak et je peux l&amp;rsquo;utiliser pour me logger dans ma console Proxmox.&lt;/p&gt;
&lt;p&gt;Pour rester simple, on va seulement créer un login dans Keycloak, car l&amp;rsquo;outil offre une base de comptes interne qui suffiront pour cet article.&lt;/p&gt;
&lt;p&gt;Dans le menu de gauche, sur le realm Proxmox qu&amp;rsquo;on vient de créer, allez dans &amp;ldquo;Manage / Users&amp;rdquo;, puis cliquez sur &amp;ldquo;Add User&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;On va vous demander des informations :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/05/create_user_in_realm.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois validé, affectez-lui un mot de passe.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/05/user_set_password.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Normalement, une fois que c&amp;rsquo;est fait, on en a fini avec Keycloak.&lt;/p&gt;
&lt;h2 id="configurer-proxmox-ve"&gt;Configurer Proxmox VE
&lt;/h2&gt;&lt;p&gt;On peut donc aller configurer Proxmox VE. L&amp;rsquo;opération est relativement simple. Une fois loggé dans l&amp;rsquo;interface de management, on peut trouver le menu &amp;ldquo;Authentification&amp;rdquo; (dans le scope Datacenter).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/05/proxmox_add_oidc.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On crée un provider de type OIDC :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/05/proxmox_auth_openid.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Note: l&amp;rsquo;URL que vous devrez mettre dans issuer URL est de la forme &lt;a class="link" href="https://mykeycloak.myexample.org/auth/realms/myrealm" target="_blank" rel="noopener"
&gt;https://mykeycloak.myexample.org/auth/realms/myrealm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Une fois que c&amp;rsquo;est fait, vous pouvez vous délogger. Dans le menu des &amp;ldquo;Realm&amp;rdquo; (les Realm au sens &amp;ldquo;Proxmox VE&amp;rdquo;, cette fois-ci) doit apparaitre maintenant &amp;ldquo;keycloak&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Une fois que vous le sélectionnez, ça doit donner ça :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/05/login_oidc_proxmox.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Si vous cliquez sur &lt;strong&gt;Login&lt;/strong&gt;, vous serez redirigé sur une mire de login de Keycloak qui devrait ressembler à ça :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/05/mire_login_keycloak.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;(Ou ça, si vous avez suivi le tuto pour gmail)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/08/sign_in_with_google.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Enjoy !!&lt;/p&gt;
&lt;h2 id="bonus--debug-oidc"&gt;Bonus : debug OIDC
&lt;/h2&gt;&lt;p&gt;En partant du principe que votre Keycloak est accessible à l&amp;rsquo;URL mykeycloak.myexample.org et que vous avez créé le realm myrealm, dans lequel existe un user proxmox avec pour mot de passe KEYCLOAKPASSWORD :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;curl https://mykeycloak.myexample.org/auth/realms/myrealm/protocol/openid-connect/token --user proxmox:cacf30e8-d71d-4cba-8dd6-cd1bf3661053 -H &amp;#39;content-type: application/x-www-form-urlencoded&amp;#39; -d &amp;#39;username=proxmox&amp;amp;password=KEYCLOAKPASSWORD&amp;amp;grant_type=password&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La requête doit renvoyer un access token en JSON&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-JSON" data-lang="JSON"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;access_token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;eyJaaaaaaaaaaaaaaa90A&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;expires_in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;refresh_expires_in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;refresh_token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;eyJaaaaaaaaaaaaaaa_Ks&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;token_type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Bearer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;not-before-policy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;session_state&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;f68a1fcc-7741-4ba7-bea6-51756e81f6e1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;scope&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;profile email&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Installer Keycloak 15 sur Ubuntu 20.04 (sans Docker)</title><link>https://blog.zwindler.fr/2021/08/30/installer-keycloak-15-sur-ubuntu-20-04-sans-docker/</link><pubDate>Mon, 30 Aug 2021 06:30:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/08/30/installer-keycloak-15-sur-ubuntu-20-04-sans-docker/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/08/sign_in_with_google.webp" alt="Featured image of post Installer Keycloak 15 sur Ubuntu 20.04 (sans Docker)" /&gt;&lt;h2 id="keycloak-sur-ubuntu-pour-faire-de-loidc-comme-un-chef"&gt;Keycloak sur Ubuntu, pour faire de l’OIDC comme un chef
&lt;/h2&gt;&lt;p&gt;J’en ai parlé un peu lors de l’article sur les soucis que j’ai rencontré lors de mon passage de Proxmox VE 6 à 7 : une des features (surprise en plus) de cette release a été le support d’&lt;strong&gt;OpenID Connect&lt;/strong&gt; pour l’authentification dans Proxmox VE.&lt;/p&gt;
&lt;p&gt;Ça fait très longtemps que j’ai envie d’ajouter une authentification externe de type SSO à mon cluster Proxmox VE perso, mais je n’ai pas eu le courage (l’envie) d’installer un LDAP et encore moins un Active Directory (&lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=windows" &gt;heureusement cette période de ma vie est loin derrière&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Or, je sais que dans les produits permettant de faire de l’OpenID Connect (et du SAML), il y a &lt;strong&gt;&lt;a class="link" href="https://www.keycloak.org/" target="_blank" rel="noopener"
&gt;Keycloak&lt;/a&gt;&lt;/strong&gt;, le IAM récupéré par Redhat et qui cartonne pas mal depuis quelques années maintenant.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Add authentication to applications and secure services with minimum fuss. No need to deal with storing users or authenticating users. It’s all available out of the box.&lt;/p&gt;
&lt;p&gt;You’ll even get advanced features such as User Federation, Identity Brokering and Social Login.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Et il se trouve aussi que j’ai pour plan d’installer, dans les jours / semaines / mois qui viennent un keycloak au boulot pour d’autres besoins qui n’ont rien à voir. Vous me voyez donc venir, j’ai pris les devant et j’ai installé keycloak sur mon infra perso ;-)&lt;/p&gt;
&lt;p&gt;Note : dans cet article, &lt;strong&gt;on ne va parler que de l’installation de Keycloak&lt;/strong&gt;. S’il n’y a que ça qui vous intéresse, ne vous inquiétez pas, la partie Proxmox sera traitée dans un autre article.&lt;/p&gt;
&lt;h2 id="pourquoi-pas-un-container-docker-"&gt;Pourquoi pas un container Docker ?
&lt;/h2&gt;&lt;p&gt;La plupart des gens installent keycloak de la façon qui est maintenant mise en avant par beaucoup d’éditeurs quand leur soft est un peu pénible à installer : un container Docker.&lt;/p&gt;
&lt;p&gt;Effectivement ça simplifie grandement l’installation, surtout comparé à la doc d’install sans docker qui est pas terrible terrible&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For more details go to &lt;a class="link" href="https://www.keycloak.org" target="_blank" rel="noopener"
&gt;about&lt;/a&gt; and &lt;a class="link" href="https://www.keycloak.org/documentation" target="_blank" rel="noopener"
&gt;documentation&lt;/a&gt;, and don’t forget to &lt;a class="link" href="https://www.keycloak.org/guides" target="_blank" rel="noopener"
&gt;try Keycloak&lt;/a&gt;. It’s easy by design!&lt;/p&gt;
&lt;p&gt;easy by design ??? p%$$£ç*µ !!!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Alors qu’avec Docker, l’image est prête à l&amp;rsquo;emploi et « juste marche » (pour peu qu’on sache à peu près faire de l’OIDC ce qui n’était pas mon cas mais ça c’est une prochaine histoire ;-p).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker run -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin quay.io/keycloak/keycloak:15.0.2
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="et-donc-du-coup-nous-on-va-linstaller-à-la-mano"&gt;Et donc du coup, nous on va l’installer à la mano
&lt;/h2&gt;&lt;p&gt;Eux disent que c’est une installation « baremetal ». Enfin, ça, c’est leur terminologie à eux. Moi je vais l’installer dans un container LXC, mais ça aurait très bien pu être installé sur une « vraie » VM Linux, un serveur physique ou un raspberry Pi (des gens l’ont porté sur ARM avec succès).&lt;/p&gt;
&lt;p&gt;Keycloak est relativement peu gourmand (surtout pour une application Java !!) et tourne sans broncher dans mon container LXC avec 512 Mo de RAM. Je suis certain que j’aurais pu mettre moins en tweakant la JVM.&lt;/p&gt;
&lt;p&gt;L’installation « baremetal » donc se base sur un serveur Wildfly à faire tourner sur un OpenJDK &amp;gt; 8. Une fois mon container LXC (ou ma VM) installée en Ubuntu 20.04, j’ai donc installé le dernier JRE disponible (16)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt update
apt dist-upgrade
apt install openjdk-16-jre
java -version
openjdk version &amp;#34;16.0.1&amp;#34; 2021-04-20
OpenJDK Runtime Environment (build 16.0.1+9-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 16.0.1+9-Ubuntu-120.04, mixed mode, sharing)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans les autres prérequis que je m’impose moi-même, c’est la création d’un utilisateur Linux non privilégié (ne pas lancer un soft en tant que root sauf si c’est vraiment nécessaire !)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;groupadd keycloak
useradd -r -g keycloak -d /usr/lib/keycloak -s /sbin/nologin keycloak
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="récupérer-la-dernière-version"&gt;Récupérer la dernière version
&lt;/h2&gt;&lt;p&gt;Redhat package son soft dans un tar.gz disponible sur github dans la section &lt;strong&gt;releases&lt;/strong&gt; de dépôt principal de keycloak. Vous trouverez aussi &lt;a class="link" href="https://www.keycloak.org/downloads" target="_blank" rel="noopener"
&gt;des raccourcis sur cette page&lt;/a&gt;. Dans mon cas, je n’ai pas essayé encore la version Quarkus (en preview) mais bien la bonne vieille version Wildfly.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /usr/lib
wget https://github.com/keycloak/keycloak/releases/download/15.0.1/keycloak-15.0.1.tar.gz
tar xzf keycloak-15.0.1.tar.gz
ln -s keycloak-15.0.1 keycloak
rm keycloak-15.0.1.tar.gz
chown -R keycloak: /usr/lib/keycloak-15.0.1
chmod o+x /usr/lib/keycloak/
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration"&gt;Configuration
&lt;/h2&gt;&lt;p&gt;A partir de là, on a quasiment tout pour démarrer le serveur Keycloak. En vrai, on pourrait déjà lancer le script &lt;strong&gt;standalone.sh&lt;/strong&gt; et ça démarrerait.&lt;/p&gt;
&lt;p&gt;Mais ça ne marcherait pas très très bien, car on a pas mal de configuration à faire. Ce genre de procédure cracra m’a rappelé la bonne époque de configuration des produits Redhat et IBM (maintenant la même maison, comme par hasard) qui fleure bon la prise de tête et les erreurs humaines&amp;hellip;&lt;/p&gt;
&lt;p&gt;La première chose à faire est de créer quelques dossiers et de copier des fichiers :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir /etc/keycloak
mkdir -p /var/run/keycloak
chown keycloak: /var/run/keycloak
cp /usr/lib/keycloak/docs/contrib/scripts/systemd/launch.sh /usr/lib/keycloak/bin/
cp /usr/lib/keycloak/docs/contrib/scripts/systemd/wildfly.conf /etc/keycloak/keycloak.conf
cp /usr/lib/keycloak/docs/contrib/scripts/systemd/wildfly.service /etc/systemd/system/keycloak.service
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La « blague » c’est que les PATH sont rentrés en durs dans la plupart de ces fichiers et pointent vers « /opt/wildfly » ce qui a peut-être beaucoup de sens pour les gens de chez Redhat mais pas dans mon setup (j’installe keycloak, pas un serveur wildfly, dans /usr/lib, pas dans /opt&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Comme je suis feignant et que je crains les fautes de frappes difficiles à voir à l’œil nu, j’édite les fichiers incriminés avec des &lt;strong&gt;sed&lt;/strong&gt;. Mais libre à vous de préférer les éditer à la main avec &lt;strong&gt;vi&lt;/strong&gt; (d’ailleurs, ça vaut le coup de vérifier que le fichier est pas en vrac).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sed -i &amp;#39;s!wildfly!keycloak!g&amp;#39; /etc/systemd/system/keycloak.service
sed -i &amp;#39;s!/opt/keycloak!/usr/lib/keycloak!&amp;#39; /etc/systemd/system/keycloak.service
sed -i &amp;#39;s!/opt/wildfly!/usr/lib/keycloak!&amp;#39; /usr/lib/keycloak/bin/launch.sh
#lire la suite avant de lancer la suivante
sed -i &amp;#39;s!\$3$!\$3 -Dkeycloak.frontendUrl=https://keycloak.example.org/auth!&amp;#39; /usr/lib/keycloak/bin/launch.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Petite subtilité pour la dernière commande sed, j’ai mis keycloak derrière un reverse proxy pour faire plus joli et ajouter une couche TLS gérée par moi (et pas par wildfly) et arrêter de faire du PLAIN sur un soft d’IAM (facepalm).&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/08/image-1.avif" &gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(lien mort, je ne suis plus sur Twitter)&lt;/p&gt;
&lt;p&gt;Sauf que la totalité liens sur les pages d’admin de keycloak pointaient en HTTP plain qui échouaient donc.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.keycloak.org/server/configuration-provider" target="_blank" rel="noopener"
&gt;La solution dans ce genre de cas est décrite ici&lt;/a&gt; et en gros le plus simple c’est de coller l’URL de votre frontend / reverse proxy dans les paramètres de lancement. Pourquoi faire simple quand on peut faire compliqué ?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="démarrer-le-service"&gt;Démarrer le service
&lt;/h2&gt;&lt;p&gt;A partir de là, on a quasiment un keycloak vraiment fonctionnel. Vous pouvez lancer la console :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl enable keycloak.service
systemctl start keycloak.service
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La console est accessible sur votre LAN via l’IP de la VM sur le port 8080&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/08/keycloak_admin.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Reste la dernière petite subtilité : il n’y a aucun compte pour s’y connecter &lt;em&gt;:trollface:&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;On retourne dans notre shell et on lance le script suivant, qui va injecter un bout de XML dans notre conf (qu’est ce que c’est crade&amp;hellip; heureusement que le soft est bien au-delà de l’install&amp;hellip;)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/usr/lib/keycloak/bin/add-user-keycloak.sh -r master -u youruser
Press ctrl-d (Unix) or ctrl-z (Windows) to exit
Password:
Added &amp;#39;youruser&amp;#39; to &amp;#39;/usr/lib/keycloak/standalone/configuration/keycloak-add-user.json&amp;#39;, restart server to load user
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ah, et bien sûr, comme c’est de la configuration XML en dur, il faut redémarrer wildfly ;-)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl restart keycloak.service
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et maintenant, à partir de là, vous pouvez commencer le &amp;ldquo;&lt;a class="link" href="https://www.keycloak.org/getting-started/getting-started-zip" target="_blank" rel="noopener"
&gt;Getting Started&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/08/keycloak_master.avif"
loading="lazy"
&gt;&lt;/p&gt;</description></item><item><title>Déléguer l’authentification Gitlab à Azure AD avec OAuth2</title><link>https://blog.zwindler.fr/2019/05/14/deleguer-lauthentification-gitlab-a-azure-ad-avec-oauth2/</link><pubDate>Tue, 14 May 2019 11:45:56 +0000</pubDate><guid>https://blog.zwindler.fr/2019/05/14/deleguer-lauthentification-gitlab-a-azure-ad-avec-oauth2/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/05/gitlab_azuread-1.webp" alt="Featured image of post Déléguer l’authentification Gitlab à Azure AD avec OAuth2" /&gt;&lt;h2 id="gérer-les-comptes-internes-à-gitlab-cest-bof-le-sso-cest-mieux-"&gt;Gérer les comptes internes à Gitlab, c’est bof, le SSO, c’est mieux !
&lt;/h2&gt;&lt;p&gt;Dans le cadre de l’hébergement d’un nouveau serveur Gitlab, j’ai voulu intégrer notre base de compte existante, synchronisée dans Azure à l’aide de l’outil Azure AD, qui est le pendant « cloud » de l’Active Directory, bien connus de mes amis Windowiens (oui, il y en a). La plupart des applications savent aujourd’hui déléguer l’authentification à des fournisseurs tiers, généralement de type LDAP, via des protocoles tels que SAML(2) ou OAuth(2).&lt;/p&gt;
&lt;p&gt;Cependant, bien que ces protocoles soient standards, leur implémentation dépend fortement du logiciel en question et il n’est pas toujours facile de s’y retrouver.&lt;/p&gt;
&lt;p&gt;Pour faciliter cette opération, Azure a mis à disposition, directement dans Azure AD, des objets préconfigurés pour des milliers d’applications tierces. C’est comme ça qu’on peut implémenter, de manière simple et rapide, le SSO Active Directory avec les produits Atlassian (JIRA + Confluence), par exemple.&lt;/p&gt;
&lt;h2 id="tout-commence-dans-azure"&gt;Tout commence dans Azure
&lt;/h2&gt;&lt;p&gt;Dans le portail Azure, ouvrir « Entreprise applications », puis cliquer sur « New Application »&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Malheureusement pour nous, il n’y a pas de template pour Gitlab ! Il va falloir le faire à la main.&lt;/p&gt;
&lt;p&gt;A noter, le principe déroulé dans ce tutoriel est valable pour n’importe quelle autre application supportant des mécanismes similaire. Il est possible de réutiliser un template utilisé pour un soft et le réadapter pour d’autres logiciels qui fonctionnent de la même façon. C’est juste une histoire de paramètres.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le menu nous conseille donc de choisir « Non-gallery application », puisque nous ne trouvons pas Gitlab. Sauf que, bizarrement, il faut un compte Premium pour utiliser cette feature.&lt;/p&gt;
&lt;p&gt;On se rabat donc sur « Application you’re developing ». C’est d’ailleurs ce que conseille d’utiliser &lt;a class="link" href="https://docs.gitlab.com/ee/integration/azure.html" target="_blank" rel="noopener"
&gt;la documentation de Gitlab&lt;/a&gt;. Sauf que, pas de chance non plus, ça ne marche plus comme ça, maintenant ;)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="créer-une-app-registration-pour-gitlab"&gt;Créer une App registration pour Gitlab
&lt;/h2&gt;&lt;p&gt;Pour toutes les applications qui ne sont pas dans le store, on ne peut donc plus passer par les « Entreprise Applications ». On va donc créer une « App registration », qui n’est ni plus ni moins qu’un compte de service avec un ID et un (ou plusieurs) secrets.&lt;/p&gt;
&lt;p&gt;Cliquer sur « New registration », puis lui donner un nom.&lt;/p&gt;
&lt;p&gt;Sélectionner le type de comptes qui pourront accéder à cette application. Dans mon cas, il s’agit uniquement d’autoriser les comptes provenant de mon AD, mais on peut imaginer le cas d’une application ouverte en BtoB ou carrément ouverte à tout Internet.&lt;/p&gt;
&lt;p&gt;Enfin, renseigner l’URL de callback, qui permettra à Azure de rediriger l’utilisateur qui s’est authentifié avec succès vers notre Gitlab.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We’ll return the authentication response to this URI after successfully authenticating the user. Providing this now is optional and it can be changed later, but a value is required for most authentication scenarios.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans le cas précis de Gitlab, cette URL aura la forme : &lt;a class="link" href="https://mongitlab.example.org/users/auth/azure_oauth2/callback" target="_blank" rel="noopener"
&gt;mongitlab.example.org/users/auth/azure_oauth2/callback&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread4-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="récupérer-des-valeurs-qui-intéressent-gitlab"&gt;Récupérer des valeurs qui intéressent Gitlab
&lt;/h2&gt;&lt;p&gt;Retourner ensuite dans l’overview de notre nouvelle « App registration ». Dans les détails, elle dispose d’un Application ID, aussi appelé Client ID et d’un Tenant ID :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread5.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On va maintenant créer un Secret. Pour les secrets, on peut choisir soit d’uploader un certificat (conseillé car plus sécurisé), ou de lui générer un mot de passe. Pour la simplicité de ce tutoriel, je vais créer un mot de passe pour notre application, mais je le répète, mieux vaut uploader un certificat.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread6.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On dispose maintenant de notre CLIENT_ID, notre TENANT_ID et de notre CLIENT_SECRET. Notez les bien, car une fois que la fenêtre sera fermée, il ne sera plus possible de relire à nouveau le secret et il faudra en générer un nouveau&amp;hellip;&lt;/p&gt;
&lt;h2 id="ajouter-des-restrictions-ou-des-fonctionnalités-complémentaires"&gt;Ajouter des restrictions ou des fonctionnalités complémentaires
&lt;/h2&gt;&lt;p&gt;En fonction de votre niveau de licence pour Azure AD, vous aurez accès à plus ou moins de choses. Moi, je n’ai accès à pratiquement aucune feature, mais si vous avez mieux, vous aller pouvoir ajouter des options très pratiques telles que le self service (les utilisateurs peuvent demander eux même à avoir accès à l’application, et si c’est validé, ils sont ajouté dans le bon groupe) et aux autorisations/restrictions par groupes Azure AD.&lt;/p&gt;
&lt;p&gt;Pour se faire, il faut RETOURNER dans les Entreprises Applications (#RollingEyes), puis chercher notre « App registration » qui y apparaît maintenant dans la liste (avec le filtre All applications).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread7.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="configuration-de-gitlab"&gt;Configuration de Gitlab
&lt;/h2&gt;&lt;p&gt;Gitlab ayant été installé avec les packages, la configuration se situe dans le fichier &lt;strong&gt;/etc/gitlab/gitlab.rb&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dans le fichier de configuration, ajouter le bloc suivant en remplaçant les valeurs en majuscules par celles qu’on vient de récupérer :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gitlab_rails[&amp;#39;omniauth_providers&amp;#39;] = [
{
&amp;#34;name&amp;#34; =&amp;gt; &amp;#34;azure_oauth2&amp;#34;,
&amp;#34;args&amp;#34; =&amp;gt; {
&amp;#34;client_id&amp;#34; =&amp;gt; &amp;#34;CLIENT_ID&amp;#34;,
&amp;#34;client_secret&amp;#34; =&amp;gt; &amp;#34;CLIENT_SECRET&amp;#34;,
&amp;#34;tenant_id&amp;#34; =&amp;gt; &amp;#34;TENANT_ID&amp;#34;,
}
}
]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rechargez ensuite Gitlab pour prise en compte de ce nouveau paramètre&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo gitlab-ctl reconfigure
[...]
Running handlers complete
Chef Client finished, 13/637 resources updated in 26 seconds
gitlab Reconfigured!
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une boite d’authentification Azure Oauth2 devrait apparaître sous le login classique !! Youpi :)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread8.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="et-voilà-cest-fini-ou-presque"&gt;Et voilà c’est fini&amp;hellip; ou presque&amp;hellip;
&lt;/h2&gt;&lt;p&gt;Vous avez maintenant ajouté du SSO et l’authentification via Azure AD pour l’accès à votre Gitlab ! On essaye de se connecter ?&lt;/p&gt;
&lt;p&gt;Et Paf !!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread9.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Signing in using your Azure Oaut2 account without a pre-existing gitLab account is not allowed&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En fait, c’est normal.&lt;/p&gt;
&lt;p&gt;Par défaut, il n’est pas possible de s’authentifier avec Azure Oauth2 si un compte n’existe pas préalablement dans Gitlab, ce qui est quand même bien dommage si vous avez beaucoup de comptes à créer.&lt;/p&gt;
&lt;p&gt;Deux cas de figure.&lt;/p&gt;
&lt;h3 id="soit-vous-ne-souhaitez-pas-que-nimporte-qui-dans-votre-ad-puisse-se-connecter-sans-votre-accord-préalable"&gt;Soit vous ne souhaitez pas que n’importe qui dans votre AD puisse se connecter sans votre accord préalable
&lt;/h3&gt;&lt;p&gt;Dans ce cas là, ce cas vous est finalement assez favorable, puisque vous allez pouvoir explicitement dire qui peut ou ne peut pas se connecter. Si vous ne disposez pas des bonnes licences et que vous avez pas pu restreindre l’accès à un groupe d’utilisateurs, c’est une « solution » de contournement acceptable.&lt;/p&gt;
&lt;p&gt;Cependant, pour éviter de créer à la main tous les comptes, il sera probablement préférable de les créer de manière automatique &lt;a class="link" href="https://docs.gitlab.com/ee/api/" target="_blank" rel="noopener"
&gt;à l’aide de l’API Gitlab&lt;/a&gt; et même &lt;a class="link" href="https://docs.ansible.com/ansible/latest/modules/gitlab_user_module.html" target="_blank" rel="noopener"
&gt;du très bon module Ansible gitlab_user&lt;/a&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- name: &amp;#34;Create Gitlab User&amp;#34;
gitlab_user:
server_url: &amp;#34;{{gitlab_api}}&amp;#34;
login_token: &amp;#34;{{token}}&amp;#34;
validate_certs: True
name: &amp;#34;Zwindler&amp;#34;
username: &amp;#34;zwindler&amp;#34;
password: &amp;#34;{{ 99999999 | random | to_uuid }}&amp;#34;
confirm: no
email: &amp;#34;zwindler@zwindler.fr&amp;#34;
state: present
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="soit-à-linverse-vous-souhaitez-que-tous-les-utilisateurs-de-votre-ad-puissent-avoir-accès-sans-pour-autant-devoir-les-ajouter-uns-par-uns"&gt;Soit, à l’inverse, vous souhaitez que tous les utilisateurs de votre AD puissent avoir accès, sans pour autant devoir les ajouter uns par uns
&lt;/h3&gt;&lt;p&gt;Il existe alors des lignes sont à ajouter dans la configuration gitlab pour autoriser cette option :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gitlab_rails[&amp;#39;omniauth_allow_single_sign_on&amp;#39;] = [&amp;#39;azure_oauth2&amp;#39;]
gitlab_rails[&amp;#39;omniauth_block_auto_created_users&amp;#39;] = false
gitlab_rails[&amp;#39;sync_profile_from_provider&amp;#39;] = [&amp;#39;azure_oauth2&amp;#39;]
gitlab_rails[&amp;#39;sync_profile_attributes&amp;#39;] = [&amp;#39;name&amp;#39;, &amp;#39;email&amp;#39;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;D’un point de vue sécurité, c’est un peu moins bien puisque n’importe qui avec un compte pourra se connecter, sans que vous le sachiez.&lt;/p&gt;
&lt;p&gt;Cependant, ce problème est un peu moins grave qu’il n’y parait puisque l’utilisateur sera logué mais n’aura accès à rien (ou juste ce qui est « public »).&lt;/p&gt;
&lt;p&gt;Dans le cas d’un Gitlab d’entreprise, où tous les développeurs doivent pouvoir se connecter, cette seconde option me parait quasi obligatoire. C’est encore plus acceptable si vous avez pu restreindre l’accès au SSO par groupe dans Azure AD, comme indiqué plus haut.&lt;/p&gt;
&lt;p&gt;Have fun :)&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/integration/azure.html" target="_blank" rel="noopener"
&gt;docs.gitlab.com/ee/integration/azure.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://serverfault.com/questions/874484/gitlab-and-oauth-to-azure-ad" target="_blank" rel="noopener"
&gt;serverfault.com/questions/874484/gitlab-and-oauth-to-azure-ad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>