<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ldaps on slash-root.fr</title><link>https://beta.slash-root.fr/tags/ldaps/</link><description>Recent content in Ldaps on slash-root.fr</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><lastBuildDate>Thu, 08 Sep 2022 18:51:58 +0200</lastBuildDate><atom:link href="https://beta.slash-root.fr/tags/ldaps/index.xml" rel="self" type="application/rss+xml"/><item><title>Keycloak : Federation d’un annuaire LDAPS (Active Directory)</title><link>https://beta.slash-root.fr/keycloak-federation-dun-annuaire-ldaps-active-directory/</link><pubDate>Tue, 23 Aug 2022 15:10:58 +0200</pubDate><guid>https://beta.slash-root.fr/keycloak-federation-dun-annuaire-ldaps-active-directory/</guid><description>&lt;img src="https://beta.slash-root.fr/keycloak-federation-dun-annuaire-ldaps-active-directory/cover.png" alt="Featured image of post Keycloak : Federation d’un annuaire LDAPS (Active Directory)" /&gt;&lt;p&gt;Cet article a pour but de décrire la mise en place de la fédération d'un annuaire LDAPS (Active Directory) au sein d'un royaume Keycloak.&lt;/p&gt;
&lt;p&gt;Testé avec un domaine Active Directory On-Premises et avec Azure Active Directory.&lt;/p&gt;
&lt;h2 id="contexte-de-linfrastructure"&gt;&lt;a href="#contexte-de-linfrastructure" class="header-anchor"&gt;&lt;/a&gt;Contexte de l&amp;rsquo;infrastructure
&lt;/h2&gt;&lt;p&gt;L'infrastructure sur laquelle je vais m'appuyer est la suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 contrôleur de domaine Active Directory (AD DS) avec sa PKI (AD CS) sous Windows Serveur 2019 Standard
&lt;ul&gt;
&lt;li&gt;Domaine : aukfood.lan&lt;/li&gt;
&lt;li&gt;FQDN du contrôleur de domaine : dc01.aukfood.lan&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1 serveur Keycloak en version 19.0.1
&lt;ul&gt;
&lt;li&gt;Déployé dans docker swarm avec ce stack : &lt;a href="https://beta.slash-root.fr/docker-swarm-stack-keycloak-v19-latest/"&gt;/docker-swarm-stack-keycloak-v19-latest/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;URL : keycloak.example.com&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="certificat-tls"&gt;&lt;a href="#certificat-tls" class="header-anchor"&gt;&lt;/a&gt;Certificat TLS
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Note : Les commandes de ce chapitre sont réalisées depuis le serveur hébergeant le conteneur keycloak.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="récupération-du-certificat"&gt;&lt;a href="#r%c3%a9cup%c3%a9ration-du-certificat" class="header-anchor"&gt;&lt;/a&gt;Récupération du certificat
&lt;/h3&gt;&lt;p&gt;Pour commencer, il va falloir récupérer le certificat TLS utilisé pour la liaison LDAPS.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;LDAP = Port 389 TCP&lt;/li&gt;
&lt;li&gt;LDAPS = Port 636 TCP&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Avec l'utilitaire &lt;code&gt;openssl&lt;/code&gt;, il est possible de tester que la liaison LDAPS est fonctionelle ainsi que de récupérer différentes informations (dont le certificat du serveur) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openssl s_client -connect dc01.aukfood.lan:636
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Voici le retour pour cette infra :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;depth&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; CN &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dc01.aukfood.lan
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Certificate chain
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; s:CN &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dc01.aukfood.lan
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; i:DC &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lan, DC &lt;span style="color:#f92672"&gt;=&lt;/span&gt; aukfood, CN &lt;span style="color:#f92672"&gt;=&lt;/span&gt; aukfood-DC01-CA
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Server certificate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-----BEGIN CERTIFICATE-----
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MIIHLzCCBRegAwIBAgITTAAAAAczDQgCtUWEjAAAAAAABzANBgkqhkiG9w0BAQsF
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AniSQdTOnACZrX//9tDg73RV9w&lt;span style="color:#f92672"&gt;==&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-----END CERTIFICATE-----
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;subject&lt;span style="color:#f92672"&gt;=&lt;/span&gt;CN &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dc01.aukfood.lan
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;issuer&lt;span style="color:#f92672"&gt;=&lt;/span&gt;DC &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lan, DC &lt;span style="color:#f92672"&gt;=&lt;/span&gt; aukfood, CN &lt;span style="color:#f92672"&gt;=&lt;/span&gt; aukfood-DC01-CA
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Copier le &lt;code&gt;Server certificate&lt;/code&gt; commençant par &lt;code&gt;-----BEGIN CERTIFICATE-----&lt;/code&gt; et se terminant par &lt;code&gt;-----END CERTIFICATE-----&lt;/code&gt; dans un fichier &lt;code&gt;server-ldaps.cer&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt;EOF &amp;gt; server-ldaps.cer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;-----BEGIN CERTIFICATE-----
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;MIIHLzCCBRegAwIBAgITTAAAAAczDQgCtUWEjAAAAAAABzANBgkqhkiG9w0BAQsF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[...]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;AniSQdTOnACZrX//9tDg73RV9w==
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;-----END CERTIFICATE-----
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="création-du-keystore"&gt;&lt;a href="#cr%c3%a9ation-du-keystore" class="header-anchor"&gt;&lt;/a&gt;Création du keystore
&lt;/h3&gt;&lt;p&gt;Maintenant que le certificat TLS du contrôleur de domaine a été récupéré, il va falloir l'importer dans un keystore.&lt;/p&gt;
&lt;p&gt;Tout d'abord, installer &lt;code&gt;openjdk-11-jre&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install openjdk-11-jre
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis importer le certificat &lt;code&gt;server-ldaps.cer&lt;/code&gt; dans un keystore nommé &lt;code&gt;keystore.jks&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;keytool -import -trustcacerts -alias dc01.aukfood.lan-CA -file server-ldaps.cer -keystore keystore.jks
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Saisir un mot de passe à appliquer au keystore :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Entrez le mot de passe du fichier de clés : 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Ressaisissez le nouveau mot de passe : 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vérifier la présence du certificat dans le keystore généré :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;keytool -list -keystore keystore.jks
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Après avoir entrer le mot de passe du keystore, le certificat est bien présent :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Entrez le mot de passe du fichier de clés : 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Type de fichier de clés : PKCS12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Fournisseur de fichier de clés : SUN
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Votre fichier de clés d&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;accès contient &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; entrée
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dc01.aukfood.lan-ca, &lt;span style="color:#ae81ff"&gt;22&lt;/span&gt; août 2022, trustedCertEntry, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Empreinte du certificat &lt;span style="color:#f92672"&gt;(&lt;/span&gt;SHA-256&lt;span style="color:#f92672"&gt;)&lt;/span&gt; : 61:EA:83:97:92:&lt;span style="color:#f92672"&gt;[&lt;/span&gt;...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;:B5:59:EE:2C:8A:2D:EA
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="déclaration-du-keystore"&gt;&lt;a href="#d%c3%a9claration-du-keystore" class="header-anchor"&gt;&lt;/a&gt;Déclaration du keystore
&lt;/h3&gt;&lt;p&gt;Maintenant que le keystore a été généré avec le certificat TLS du contrôleur de domaine, il va falloir le déclarer au sein de Keycloakpour qu'il puisse être exploité.&lt;/p&gt;
&lt;p&gt;Dans la stack keycloak (voir lien en début d'article), un volume &lt;code&gt;conf&lt;/code&gt; est monté pour la persistance des données du répertoire &lt;code&gt;/opt/keycloak/conf&lt;/code&gt; dans le conteneur.&lt;/p&gt;
&lt;p&gt;Envoyer le keystore précédement généré dans le conteneur :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker cp ./keystore.jks &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;docker ps -qf name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;keycloak&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;:/opt/keycloak/conf/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis ajouter les variables suivantes sur la stack de keycloak :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;services:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; app:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; environment:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Indiquer le mot de passe du keystore&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; KC_SPI_TRUSTSTORE_FILE_FILE: /opt/keycloak/conf/keystore.jks
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; KC_SPI_TRUSTSTORE_FILE_PASSWORD: MotDePasseTresSecure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Le &lt;code&gt;MotDePasseTresSecure&lt;/code&gt; est celui qui a été indiqué lors de la création du keystore.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Lister les stacks dans docker swarm :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stack ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Identifier l'ID du service docker exécutant&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME SERVICES ORCHESTRATOR
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;keycloak &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; Swarm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nextcloud &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; Swarm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;portainer &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; Swarm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rocketchat &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; Swarm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;swarmpit &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; Swarm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;traefik &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; Swarm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;La stack faisant tourner le keycloack en v19 est nommé &lt;strong&gt;keycloak&lt;/strong&gt; dans ce cluster docker.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Supprimer la stack keycloak :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stack rm keycloak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis relancer la stack kycloak pour prendre en compte les nouvelles variables d'environnement concernant le truststore :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stack deploy -c ./keycloak/stack.yml keycloak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Le fichier &lt;code&gt;stack.yml&lt;/code&gt; est stocké dans un répertoire nommé &lt;code&gt;keycloak&lt;/code&gt; de mon répertoire courant. A adapter suivant son emplaccement dans le FHS.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="logs"&gt;&lt;a href="#logs" class="header-anchor"&gt;&lt;/a&gt;Logs
&lt;/h2&gt;&lt;p&gt;Avant de passer à la configuration de la fédération de l'annuaire Active Directory via LDAPS à Keycloak, il est important de vérifier et de de s'assurer du bon redémarrage du conteneur.&lt;/p&gt;
&lt;p&gt;Pour cela, lister les services en cours au sein du cluster docker :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker service ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Identifier le service adéquat (ici : &lt;strong&gt;keycloak_app&lt;/strong&gt;) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ID NAME MODE REPLICAS IMAGE PORTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2degmsl8r3se dashy replicated 0/0 lissy93/dashy:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;7jq3dje5b0t8 keycloak_app replicated 1/1 quay.io/keycloak/keycloak:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ubq1dvhwv0st nextcloud_app replicated 1/1 nextcloud:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;arz4ca4gvfgv nextcloud_mariadb replicated 1/1 mariadb:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vr2c7ptq6a8k portainer_agent global 5/5 portainer/agent:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;h6h5merxg9a2 portainer_portainer replicated 1/1 portainer/portainer-ce:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mzsq3uof6c1r rocketchat_mongodb replicated 1/1 bitnami/mongodb:4.4 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tmu3kz5n7xq9 rocketchat_rocketchat replicated 1/1 registry.rocket.chat/rocketchat/rocket.chat:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kos1zg1wowxi swarmpit_agent global 5/5 swarmpit/agent:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gtjs3mikbtaf swarmpit_app replicated 1/1 swarmpit/swarmpit:latest 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nx6s2mt19bzx swarmpit_db replicated 1/1 couchdb:2.3.0 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;n5oq9gx05bnd swarmpit_influxdb replicated 1/1 influxdb:1.7 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;u7b8rsym5lzp traefik_traefik replicated 1/1 traefik:latest 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vérifier la bonne exécution du service en gardant un shell ouvert avec la lecture des logs en temps réel :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker service logs -f keycloak_app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configuration-de-la-fédération-ldaps"&gt;&lt;a href="#configuration-de-la-f%c3%a9d%c3%a9ration-ldaps" class="header-anchor"&gt;&lt;/a&gt;Configuration de la fédération LDAPS
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Note : A partir de maintenant, la configuration est à effectuer à travers la console web d'administration du service Keycloak.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="user-federation"&gt;&lt;a href="#user-federation" class="header-anchor"&gt;&lt;/a&gt;User federation
&lt;/h3&gt;&lt;p&gt;Sélectionner le royaume adéquat ou en créer un nouveau (1), puis se rendre sur &lt;strong&gt;User federation&lt;/strong&gt; (2) :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="01.png" alt="image-20220822202717217" /&gt;&lt;/p&gt;
&lt;p&gt;Ajouter un fournisseur LDAP :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="02.png" alt="image-20220822202902853" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note : Pour les explications des différents champs, leurs fonctions, leurs utilités, etc... qui vont suivre, se référer à cet article que j'ai écris en 2021 sur l'intégration d'un annuaire LDAP (OpenLDAP, huhu) : &lt;a href="https://beta.slash-root.fr/keycloak-integration-ldap-externe/"&gt;/keycloak-integration-ldap-externe/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tous les paramètres de synchronisation y sont traités :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gestion du stockage des utilisateurs&lt;/li&gt;
&lt;li&gt;L'influence du mode &lt;code&gt;Import Users&lt;/code&gt; sur les requêtes LDAP (LDAPS, même combat)&lt;/li&gt;
&lt;li&gt;L'&lt;code&gt;Edit Mode&lt;/code&gt; et ses différents paramètres&lt;/li&gt;
&lt;li&gt;Les types de &lt;code&gt;Vendor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Les différents champs &lt;code&gt;Users DN&lt;/code&gt; ou &lt;code&gt;Bind DN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Les configurations possibles pour la synchronisation ainsi que leurs périodicités&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="general-options"&gt;&lt;a href="#general-options" class="header-anchor"&gt;&lt;/a&gt;General options
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(1) Console display name&lt;/strong&gt; : Entrer un nom afin d'identifier cette fédération d'utilisateurs au sein de Keycloak.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(2) Vendor&lt;/strong&gt; : Indiquer le type d'annuaire.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="03.png" alt="image-20220823052653616" /&gt;&lt;/p&gt;
&lt;h3 id="connection-and-authentication-settings"&gt;&lt;a href="#connection-and-authentication-settings" class="header-anchor"&gt;&lt;/a&gt;Connection and authentication settings
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;(1) Connection URL&lt;/strong&gt; : Renseigner l'URL de connexion à l'annuaire LDAPS sous la forme &lt;code&gt;ldaps://FQDN_DC:636&lt;/code&gt;. Cette URL doit correspondre au &amp;quot;Common Name&amp;quot; du certificat. Celui-ci peut être identifié lors de l'utilisation de la commande &lt;code&gt;openssl&lt;/code&gt; au début de cet article.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(2) Use Truststore SPI&lt;/strong&gt; : Indiquer l'utilisation du truststore javax.net.ssl.trustStore (pour le keystore.jks) uniquement pour ldaps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(3) Bind DN&lt;/strong&gt; : Indiquer le DistinguishedName de l'utilisateur de l'annuaire qui sera utilisé par Keycloak. Pour le récupérer facilement :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Get-ADUser UTILISATEUR_AD | FT DistinguishedName
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;(4) Bind credentials&lt;/strong&gt; : Mettre le mot de passe de l'utilisateur indiqué au point précédent.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="04.png" alt="image-20220823062809118" /&gt;&lt;/p&gt;
&lt;p&gt;A noter que pour le moment, il manque des informations dans le paramétrage de la liaison LDAPS. De ce fait, le &amp;quot;Test connection&amp;quot; et le &amp;quot;Test authentication&amp;quot; ne sont pas encore réalisables (Une des différences avec les versions de Keycloak sous Wildfly en version 16 et inférieure).&lt;/p&gt;
&lt;h3 id="ldap-searching-and-updating"&gt;&lt;a href="#ldap-searching-and-updating" class="header-anchor"&gt;&lt;/a&gt;LDAP searching and updating
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;(1) Edit mode&lt;/strong&gt; : Définir le mode d'édition de l'annuaire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(2) Users DN&lt;/strong&gt; : Indiquer le DistinguishedName de l'OU contenant les utilisateurs à fédérer.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="05.png" alt="image-20220823112241929" /&gt;&lt;/p&gt;
&lt;h2 id="tests-et-import-utilisateurs"&gt;&lt;a href="#tests-et-import-utilisateurs" class="header-anchor"&gt;&lt;/a&gt;Tests et import utilisateurs
&lt;/h2&gt;&lt;p&gt;Il est maintenant possible de tester la connexion LDAPS et l'authenfication.&lt;/p&gt;
&lt;p&gt;Ces 2 tests doivent aboutir :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="06.png" alt="image-20220823113054627" /&gt;&lt;/p&gt;
&lt;p&gt;Ensuite, en haut à droite de la page, bien s'assurer que cette fédération soit &lt;strong&gt;enabled&lt;/strong&gt;. Puis dans &lt;strong&gt;action (1)&lt;/strong&gt;, déclencher la &lt;strong&gt;synchronisation (2)&lt;/strong&gt; de tous les utilisateurs :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="07.png" alt="image-20220823113544319" /&gt;&lt;/p&gt;
&lt;p&gt;L'importation des utilisateurs aboutie :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="09.png" alt="image-20220823113707564" /&gt;&lt;/p&gt;
&lt;p&gt;Dans les utilisateurs du royaume Keycloak, je retrouve bien les utilisateurs contenus dans l'OU définit dans la fédération.&lt;/p&gt;
&lt;h2 id="mappers"&gt;&lt;a href="#mappers" class="header-anchor"&gt;&lt;/a&gt;Mappers
&lt;/h2&gt;&lt;p&gt;Dans ce contexte, l'utilisateur &amp;quot;Julien LOUIS&amp;quot;, se retrouve avec un &lt;strong&gt;username&lt;/strong&gt; contenant des espaces. Cela est dû au faites que l'attribut &lt;strong&gt;cn&lt;/strong&gt; de l'annuaire a été mappé vers l'attribut &lt;strong&gt;username&lt;/strong&gt; de Keycloak.&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="09b.png" alt="image-20220823120151055" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pour voir tous les utilisateurs du royaume keycloak (fédération incluse), rechercher ***** comme utilisateur.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;De plus, pour l'utilisateur final, cela ne correspondra pas au login auquel il est habitué d'utiliser.&lt;/p&gt;
&lt;p&gt;Pour modifier ce comportement, il faut mapper l'attribut &lt;strong&gt;sAMAccountName&lt;/strong&gt; de l'anuaire Active Directory vers l'attribut &lt;strong&gt;username&lt;/strong&gt; de Keycloak.&lt;/p&gt;
&lt;p&gt;Se rendre sur les paramétrages de la fédération précédement réalisée, puis dans l'onglet &lt;strong&gt;Mappers (1)&lt;/strong&gt;, éditer le mapper &lt;strong&gt;username (2)&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="10.png" alt="image-20220823114704603" /&gt;&lt;/p&gt;
&lt;p&gt;Modifier le champ &lt;strong&gt;LDAP Attribute&lt;/strong&gt; pour y inscrire &lt;strong&gt;sAMAccountName&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="11.png" alt="image-20220823115150552" /&gt;&lt;/p&gt;
&lt;p&gt;Puis, enregistrer la modification en bas de page.&lt;/p&gt;
&lt;p&gt;Ensuite, dans l'onglet &lt;strong&gt;Settings&lt;/strong&gt;, modifier l'&lt;strong&gt;Username LDAP attribute&lt;/strong&gt; en y inscrivant &lt;strong&gt;sAMAccountName&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="12.png" alt="image-20220823115607818" /&gt;&lt;/p&gt;
&lt;p&gt;Puis, enregistrer la modification en bas de page.&lt;/p&gt;
&lt;p&gt;En relançant la synchronisation de tous les utilisateurs de l'annuaire vers Keycloak, les utilisateurs sont mis à jour :&lt;/p&gt;
&lt;p&gt;&lt;img data-recalc-dims="1" decoding="async" src="13.png" alt="image-20220823115739535" /&gt;&lt;/p&gt;
&lt;p&gt;A présent, le login des utilisateurs importés dans Keycloak est correctement paramétré.&lt;/p&gt;</description></item></channel></rss>