# KEYCLOAK (upgrade from 16.x to 26) Ce projet est pour upgrader Keycloak (déployé via Docker) de la version 16 vers la version 26 ou ultérieur Les versions antérieures à keycloak utilisaient `Wildfly`, J2EE lourd. depuis la 17.x Keycloak utilise `Quarkus` un framework adapté au applis conteneurisée et plus léger. ## PRE-REQUIS - [Docker + compose](https://git.legaragenumerique.fr/GARAGENUM/docker-install) - Base de donnée LDAP (fichier .mdb) - Export d'un realm (format json) ## UTILISATION - Editer les variables dans le .env ```bash nano .env ``` > Modifier les mots de passe pour la base de données et keycloak ainsi que le domaine, l'adresse email, l'administrateur, etc ```bash docker compose up -d ``` ## UPGRADE PROCESS (from v16 to v26) Pour upgrader keycloak, il faut: 1. exporter la base de données utilisateurs (LDAP) 2. exporter la base de données de keycloak 3. exporter le realm garagenum en json 4. démarrer la nouvelle version de keycloak (créer l'admin définitif et supprimer le temporaire) 5. importer le realm de l'export json 6. importer la base de données ldap 7. importer la base de données pg 8. Configurer le realm garagenum pour utiliser le ldap 9. synchroniser LDAP avec keycloak 10. recréer les secrets des clients (et les mettres à jour côté clients) ### EXPORT LDAP DATABASE (USERS) Pour upgrader keycloak, il faut: - exporter la base de données utilisateurs (LDAP) ```bash # Se connecter au terminal du conteneur ldap docker exec -it ancien-ldap bash # Exporter la base de données slapcat -n 1 -l /tmp/backup.ldif # Récupérer le fichier d'export sur la machine hôte docker cp ancien-ldap:/tmp/backup.ldif . ``` - exporter les `clients` du `realm` :skull: Les secrets ne seront pas récupérés (*******) donc à persister avant ou idéalement recréer ### EXPORTER LA BASE DE DONNÉES KEYCLOAK ```bash docker exec pg_dump -U > kc_db_backup.sql ``` > On obtient un fichier que l'on va pouvoir importer dans la nouvelle base de donnée keycloak ### EXPORTER LE REALM ![export-realm](docs/export-realm.png) > Cocher groups / roles et clients ### DEMARRER LA NOUVELLE VERSION ```bash docker compose up -d ``` ### IMPORTER LE REALM - Clean `authorizationSettings` blocs in export-realm.json Utiliser le fichier json de l'export une fois néttoyé pour importer les configs du realm ![import-realm](docs/create-realm.png) - Redémarrer keycloak en mode production (Dockerfile.prod dans le `compose.yml`) ### IMPORTER BASE DE DONNÉES KEYCLOAK Placer le fichier de backup de la BDD de keycloak dans le dossier persisté `./init-scripts` > Vérifier les logs au démarrage pour vérifier que l'import de la base de données à été bien faite. ### IMPORTER DATABASE LDAP (USERS) - importer la base de données de `keycloak-openldap`: ```bash # Copier la backup ldif docker cp backup.ldif keycloak-openldap:/tmp/backup.ldif # Se connecter au terminal du conteneur ldap docker exec -it keycloak-openldap bash # Arrêter le service slapd service slapd stop # Supprimer la DB actuelle rm -rf /var/lib/ldap/* # Ajouter le LDIF slapadd -n 1 -F /etc/ldap/slapd.d -l /tmp/backup.ldif # Ajuster les permissions chown -R openldap:openldap /var/lib/ldap # Redémarrer slapd service slapd start ``` > c'est là que sont les users ! ### CONFIGURER LE REALM POUR UTILISER LDAP - Dans le menu de gauche, cliquer sur `Regroupement Utilisateur`, puis sur `ldap` - Configurer l'accès au service LDAP (voir captures d'écran)
Captures d'écran ![ldap-1](docs/ldap-1.png) ![ldap-2](docs/ldap-2.png) ![ldap-3](docs/ldap-3.png) ![ldap-4](docs/ldap-4.png)
- Tester la connexion pour s'assurer que keycloak arrive à se connecter au service LDAP ## SECURISER LE LDAP (si besoin de l'exposer sur l'extérieur) ### FAIL2BAN JAIL FOR LDAP (TO DO) - /etc/fail2ban/filter.d/slapd.conf ```conf [Definition] failregex = .*slapd.*do_bind: invalid credentials.* ignoreregex = ``` - /etc/fail2ban/jail.local ```conf [slapd] enabled = true filter = slapd backend = systemd logpath = /var/log/syslog maxretry = 5 bantime = 3600 findtime = 600 port = ldap,ldaps ``` > Si seul le service keycloak utilise le service LDAP, commenter l'exposition des `ports` du service LDAP dans le `compose.yml`