« Keycloak » : différence entre les versions

m ajout du serveur + partie nginx plus lisible
mAucun résumé des modifications
 
(16 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
{{Infobox logiciel
| sous-titre    = Service d'authentifiation
| localisation  = [[Serveur:computing|Serveur computing]]
| site officiel = https://www.keycloak.org/
| documentation = https://www.keycloak.org/documentation
| utilisations  = [[Nextcloud]], [[Mediawiki]], [[Synapse]], [[Misskey]], [[Forgejo]]
| utilise      = [[Nginx]], [[Certbot]], [[Postgresql]], [[Client FreeIPA]]
| image        = Icon keycloak.svg
| configuration = <code>/usr/share/keycloak/conf/keycloak.conf</code>
| port          = 8127
| accès        = https://auth.linarphy.net
| service      = [[Systemd]]
}}
[[Keycloak]] est le service disponible sur l'adresse [https://auth.linarphy.net suivante]. Il gère l'authentification des utilisateurs sur tous les autres services de l'architecture.
[[Keycloak]] est le service disponible sur l'adresse [https://auth.linarphy.net suivante]. Il gère l'authentification des utilisateurs sur tous les autres services de l'architecture.


== Configuration actuelle ==
== Configuration actuelle ==


Le service [[Nginx]] transfère les pages web du port '''8127''' (géré par Keycloak) vers le port '''443''' (https) sur le domaine <code>wiki.linarphy.net</code> (serveur [[computing]]). Les données sont gérés par [[Postgresql]] via une base de donnée ayant pour nom '''keycloak''' et pour utilisateur '''keycloak'''. Cette instance stocké dans le dossier <code>/usr/share/keycloak/</code> tourne sur la version '''26.0.0''' avec '''openjdk-21.0.2''' (lui-même dans <code>/usr/share/openjdk/21/</code>).
Le service [[Nginx]] transfère les pages web du port '''8127''' (géré par Keycloak) vers le port '''443''' (https) sur le domaine <code>auth.linarphy.net</code> (serveur [[computing]]). Les données sont gérés par [[Postgresql]] via une base de donnée ayant pour nom '''keycloak''' et pour utilisateur '''keycloak'''. Cette instance stocké dans le dossier <code>/usr/share/keycloak/</code> tourne sur la version '''26.0.0''' avec '''openjdk-21.0.2''' (lui-même dans <code>/usr/share/openjdk/21/</code>).


== Installation ==
== Procédures ==


=== Prérequis ===
=== Installation ===
 
==== Prérequis ====


* [[Nginx]]
* [[Nginx]]
* [[Postgresql]]
* [[Postgresql]]
* [[Certbot]]
* [[Certbot]]
* [[Freeipa-client]]
* [[Client FreeIPA]]
 
=== Procédure ===


==== Fichiers ====
==== Fichiers ====


La première étape consiste au téléchargement du service avec la commande <code>curl -L https://github.com/keycloak/keycloak/releases/download/26.0.0/keycloak-26.0.0.tar.gz -o keycloak-26.0.0.tar.gz</code> en tant qu'utilisateur '''root'''. Le lien est récupéré sur la page de [https://www.keycloak.org/downloads téléchargement]. Le fichier '''keycloak-26.0.0.tar.gz''' peut ensuite être extrait avec la commande <code>tar -xf keycloak-26.0.0.tar.gz</code> en tant qu'utilisateur '''root''' pour ensuite supprimer cette archive: <code>rm keycloak-26.0.0.tar.gz</code>.
La première étape consiste au téléchargement du service avec la commande <syntaxhighlight lang="bash" inline>curl -L https://github.com/keycloak/keycloak/releases/download/26.0.0/keycloak-26.0.0.tar.gz -o keycloak-26.0.0.tar.gz</syntaxhighlight> en tant qu'utilisateur '''root'''. Le lien est récupéré sur la page de [https://www.keycloak.org/downloads téléchargement]. Le fichier '''keycloak-26.0.0.tar.gz''' peut ensuite être extrait avec la commande <syntaxhighlight lang="bash" inline>tar -xf keycloak-26.0.0.tar.gz</syntaxhighlight> en tant qu'utilisateur '''root''' pour ensuite supprimer cette archive: <syntaxhighlight lang="bash" inline>rm keycloak-26.0.0.tar.gz</syntaxhighlight>.


Le dossier peut ensuite être déplacé dans son emplacement final (<code>/usr/share/keycloak/</code>) avec la commande <code>mv keycloak-26.0.0 /usr/share/keycloak</code>(toujours en tant que '''root''').
Le dossier peut ensuite être déplacé dans son emplacement final (<code>/usr/share/keycloak/</code>) avec la commande <syntaxhighlight lang="bash" inline>mv keycloak-26.0.0 /usr/share/keycloak</syntaxhighlight>(toujours en tant que '''root''').


==== Java ====
==== Java ====
Télécharger OpenJDK 21 avec la commande <code>curl -L {lien-targz-openjdk-21} -o openjdk-21.tar.gz</code> en tant que '''root'''. Le lien vers l'archive est disponible [https://jdk.java.net/archive/ ici]. Puis extraire l'archive: <code>tar -xf openjdk-21.tar.gz</code> et supprimer l'archive téléchargée: <code>rm openjdk-21.tar.gz</code>. Si le dossier n'existe pas déjà, crée le dossier <code>/usr/share/openjdk/</code> avec la commande <code>mkdir /usr/share/openjdk</code> puis déplacer le dossier extrait vers son emplacement final: <code>mv jdk-21.0.2 /usr/share/openjdk/21</code>.
Télécharger OpenJDK 21 avec la commande <syntaxhighlight lang="bash" inline>curl -L {lien-targz-openjdk-21} -o openjdk-21.tar.gz</syntaxhighlight> en tant que '''root'''. Le lien vers l'archive est disponible [https://jdk.java.net/archive/ ici]. Puis extraire l'archive: <syntaxhighlight lang="bash" inline>tar -xf openjdk-21.tar.gz</syntaxhighlight> et supprimer l'archive téléchargée: <syntaxhighlight lang="bash" inline>rm openjdk-21.tar.gz</syntaxhighlight>. Si le dossier n'existe pas déjà, crée le dossier <code>/usr/share/openjdk/</code> avec la commande <syntaxhighlight lang="bash" inline>mkdir /usr/share/openjdk</syntaxhighlight> puis déplacer le dossier extrait vers son emplacement final: <syntaxhighlight lang="bash" inline>mv jdk-21.0.2 /usr/share/openjdk/21</syntaxhighlight>.


Pour se lier au service '''LDAP''' du [[Freeipa-server|serveur FreeIPA]], il est nécessaire d'ajouter les clefs publics des certificats utilisés pour sécuriser la connexion. L’utilisation de la commande <code>/usr/share/openjdk/21/bin/keytool -v -import -file /etc/ipa/ca.crt -alias ipacrt -keystore /usr/share/openjdk/21/lib/security/cacerts</code> permet d'effectuer cette opération (ajouter la clef public du certificat du serveur au stockage de clef public de l'installation de java qui va être utilisé par Keycloak).
Pour se lier au service '''LDAP''' du [[Freeipa-server|serveur FreeIPA]], il est nécessaire d'ajouter les clefs publics des certificats utilisés pour sécuriser la connexion. L’utilisation de la commande <syntaxhighlight lang="bash" inline>/usr/share/openjdk/21/bin/keytool -v -import -file /etc/ipa/ca.crt -alias ipacrt -keystore /usr/share/openjdk/21/lib/security/cacerts</syntaxhighlight> permet d'effectuer cette opération (ajouter la clef public du certificat du serveur au stockage de clef public de l'installation de java qui va être utilisé par Keycloak).


==== Permissions ====
==== Permissions ====


Le service s'exécutera avec un utilisateur particulier (et non '''root''') pour isoler le processus. Il est donc nécessaire de créer l'utilisateur local '''keycloak''' avec la commande <code>adduser --system --no-create-home --group keycloak</code> en tant que '''root'''. La commande <code>chown -R keycloak:keycloak /usr/share/keycloak/</code> pour donner les permissions du dossier à ce nouvel utilisateur.
Le service s'exécutera avec un utilisateur particulier (et non '''root''') pour isoler le processus. Il est donc nécessaire de créer l'utilisateur local '''keycloak''' avec la commande <syntaxhighlight lang="bash" inline>adduser --system --no-create-home --group keycloak</syntaxhighlight> en tant que '''root'''. La commande <syntaxhighlight lang="bash" inline>chown -R keycloak:keycloak /usr/share/keycloak/</syntaxhighlight> pour donner les permissions du dossier à ce nouvel utilisateur.


Keycloak sera accessible via une connexion chiffré (https), et sa configuration nécessite l'accès à la clef privé et public utilisé pour cette connexion (comme [[Nginx]]). Pour protéger ces clefs et ne pas les rendre accessible à d'autres utilisateur que '''keycloak''', un hook (script) sera mis en place pour être exécuté par [[Certbot]]. Il va donc être nécessaire de créer le dossier <code>/usr/share/keycloak/certs</code> via la commande <code>mkdir /usr/share/keycloak/certs</code> en tant que '''root''' (oui oui, pas '''keycloak''' pour le moment, c'est normal), puis de modifier ces permissions avec les commandes <code>chown keycloak:keycloak /usr/share/keycloak/certs</code> et <code>chmod 500 /usr/share/keycloak/certs</code>. Créer ensuite le fichier <code>/usr/share/keycloak/certs/hook.sh</code> toujours en tant que '''root''' avec l'éditeur de sont choix contenant le script:
Keycloak sera accessible via une connexion chiffré (https), et sa configuration nécessite l'accès à la clef privé et public utilisé pour cette connexion (comme [[Nginx]]). Pour protéger ces clefs et ne pas les rendre accessible à d'autres utilisateur que '''keycloak''', un hook (script) sera mis en place pour être exécuté par [[Certbot]]. Il va donc être nécessaire de créer le dossier <code>/usr/share/keycloak/certs</code> via la commande <syntaxhighlight lang="bash" inline>mkdir /usr/share/keycloak/certs
</syntaxhighlight> en tant que '''root''' (oui oui, pas '''keycloak''' pour le moment, c'est normal), puis de modifier ces permissions avec les commandes <syntaxhighlight lang="bash" inline>chown keycloak:keycloak /usr/share/keycloak/certs</syntaxhighlight> et <syntaxhighlight lang="bash" inline>chmod 500 /usr/share/keycloak/certs</syntaxhighlight>. Créer ensuite le fichier <code>/usr/share/keycloak/certs/hook.sh</code> toujours en tant que '''root''' avec l'éditeur de sont choix contenant le script:
<syntaxhighlight lang="bash" line="1">
<syntaxhighlight lang="bash" line="1">
#!/usr/bin/env sh
#!/usr/bin/env sh
Ligne 50 : Ligne 65 :
chmod 400 "${KEYCLOAK_CERT_DIR}/fullchain.pem"
chmod 400 "${KEYCLOAK_CERT_DIR}/fullchain.pem"
</syntaxhighlight>
</syntaxhighlight>
Exécuter la commande <code>chmod +x /usr/share/keycloak/hook.sh</code> pour permettre l'exécution du script. Les permissions de ce fichier ne vont pas être autrement modifié, le script ne sera exécuté que par l'utilisateur '''root'''.
Exécuter la commande <syntaxhighlight lang="bash" inline>chmod +x /usr/share/keycloak/hook.sh</syntaxhighlight> pour permettre l'exécution du script. Les permissions de ce fichier ne vont pas être autrement modifié, le script ne sera exécuté que par l'utilisateur '''root'''.


==== Configuration ====
==== Configuration ====
Ligne 122 : Ligne 137 :
</syntaxhighlight>
</syntaxhighlight>


Puis créer un lien symbolique avec la commande <code>ln -s /etc/nginx/sites-available/auth.linarphy.net /etc/nginx/sites-enabled/auth.linarphy.net</code> et tester la configuration via <code>nginx -t</code>. Si la configuration est valide, il est nécessaire de recharger le service systemd avec <code>systemctl reload nginx</code> et mettre en place le chiffrement ssl avec <code>certbot --nginx --domain auth.linarphy.net --deploy-hook=/usr/share/keycloak/certs/hook.sh</code>.
Puis créer un lien symbolique avec la commande <syntaxhighlight lang="bash" inline>
ln -s /etc/nginx/sites-available/auth.linarphy.net /etc/nginx/sites-enabled/auth.linarphy.net
</syntaxhighlight>et tester la configuration via <syntaxhighlight lang="bash" inline>nginx -t</syntaxhighlight>. Si la configuration est valide, il est nécessaire de recharger le service systemd avec <syntaxhighlight lang="bash" inline>systemctl reload nginx</syntaxhighlight> et mettre en place le chiffrement ssl avec <syntaxhighlight lang="bash" inline>certbot --nginx --domain auth.linarphy.net --deploy-hook=/usr/share/keycloak/certs/hook.sh</syntaxhighlight>.


Vérifier ensuite sur un navigateur l'accès au service sur le protocole https.
Vérifier ensuite sur un navigateur l'accès au service sur le protocole https.
Ligne 195 : Ligne 212 :


==== Base de donnée ====
==== Base de donnée ====
En tant qu'utilisateur '''postgres''', lancer la commande <code>psql</code> puis exécuter les commandes suivantes:
En tant qu'utilisateur '''postgres''', lancer la commande <syntaxhighlight lang="bash" inline>psql</syntaxhighlight> puis exécuter les commandes suivantes:


* <code>CREATE DATABASE keycloak;</code>
* <syntaxhighlight lang="postgresql-console" inline>CREATE DATABASE keycloak;</syntaxhighlight>
* <code>CREATE USER keycloak WITH ENCRYPTED PASSWORD '{keycloak-postgresql-password}';</code>
* <syntaxhighlight lang="postgresql-console" inline>CREATE USER keycloak WITH ENCRYPTED PASSWORD '{keycloak-postgresql-password}';</syntaxhighlight>
* <code>GRANT ALL PRIVILEGES ON DATABASE keycloak TO keycloak;</code>
* <syntaxhighlight lang="postgresql-console" inline>GRANT ALL PRIVILEGES ON DATABASE keycloak TO keycloak;</syntaxhighlight>
* <code>\c keycloak</code>
* <syntaxhighlight lang="postgresql-console" inline>\c keycloak</syntaxhighlight>
* <code>GRANT ALL ON SCHEMA public TO keycloak;</code>
* <syntaxhighlight lang="postgresql-console" inline>GRANT ALL ON SCHEMA public TO keycloak;</syntaxhighlight>
* <code>\q</code>
* <syntaxhighlight lang="postgresql-console" inline>\q</syntaxhighlight>


==== Systemd ====
==== Systemd ====


Lancer la commande <code>systemctl edit --full --force keycloak.service</code> pour écrire l'unité systemd suivante avec l'éditeur de votre choix ([[systemd]] utilise la variable d'environnement '''EDITOR'''):
Lancer la commande <syntaxhighlight lang="bash" inline>systemctl edit --full --force keycloak.service</syntaxhighlight> pour écrire l'unité systemd suivante avec l'éditeur de votre choix ([[systemd]] utilise la variable d'environnement '''EDITOR'''):
<syntaxhighlight lang="systemd" line="1">
<syntaxhighlight lang="systemd" line="1">
[Unit]
[Unit]
Ligne 229 : Ligne 246 :
</syntaxhighlight>
</syntaxhighlight>


Puis crée un second fichier de configuration supplémentaire avec <code>systemctl edit keycloak.service</code> et y écrire:
Puis créer un second fichier de configuration supplémentaire avec <syntaxhighlight lang="bash" inline>systemctl edit keycloak.service</syntaxhighlight> et y écrire:


<syntaxhighlight lang="systemd" line="1">
<syntaxhighlight lang="systemd" line="1">
Ligne 236 : Ligne 253 :
</syntaxhighlight>
</syntaxhighlight>


Pour mieux organiser la configuration, modifier le nom du fichier de réécriture avec <code>mv /etc/systemd/system/keycloak.service.d/override.conf /etc/systemd/system/keycloak.service.d/env.conf</code>.
Pour mieux organiser la configuration, modifier le nom du fichier de réécriture avec <syntaxhighlight lang="bash" inline>mv /etc/systemd/system/keycloak.service.d/override.conf /etc/systemd/system/keycloak.service.d/env.conf</syntaxhighlight>.


==== Configuration ====
==== Configuration ====
Toute cette étape sera suivie par l'utilisateur '''keycloak''' dans le dossier <code>/usr/share/keycloak/</code>.
Toute cette étape sera suivie par l'utilisateur '''keycloak''' dans le dossier <code>/usr/share/keycloak/</code>.


D'abord, construisez la configuration avec la commande <code>./bin/kc.sh build</code> jusqu'à attendre la fin, puis lancer une première fois keycloak avec <code>./bin/kc.sh start</code>. Une fois que le message ''(main) Installed features: [...]'' s'affiche, appuyer sur '''Ctrl+C''' pour arrêter le programme.
D'abord, construisez la configuration avec la commande <syntaxhighlight lang="bash" inline>./bin/kc.sh build</syntaxhighlight> jusqu'à attendre la fin, puis lancer une première fois keycloak avec <syntaxhighlight lang="bash" inline>./bin/kc.sh start</syntaxhighlight>. Une fois que le message ''(main) Installed features: [...]'' s'affiche, appuyer sur '''Ctrl+C''' pour arrêter le programme.


Si tout allait bien, il aurait suffit de définir les variables d'environnement '''KC_BOOTSTRAP_ADMIN_USERNAME''' et '''KC_BOOTSTRAP_ADMIN_PASSWORD''' pour définir respectivement le nom d'utilisateur et le mot de passe de l'administrateur du service, puis de lancer les commandes précédentes. Malheureusement, le monde n'est pas parfait. Du coup il est nécessaire d'effectuer la commande <code>./bin/kc.sh bootstrap-admin user</code> puis de définir le nom d'utilisateur et le mot de passe de l'administrateur.
Si tout allait bien, il aurait suffit de définir les variables d'environnement '''KC_BOOTSTRAP_ADMIN_USERNAME''' et '''KC_BOOTSTRAP_ADMIN_PASSWORD''' pour définir respectivement le nom d'utilisateur et le mot de passe de l'administrateur du service, puis de lancer les commandes précédentes. Malheureusement, le monde n'est pas parfait. Du coup il est nécessaire d'effectuer la commande <syntaxhighlight lang="bash" inline>./bin/kc.sh bootstrap-admin user</syntaxhighlight> puis de définir le nom d'utilisateur et le mot de passe de l'administrateur.


==== Finalisation ====
==== Finalisation ====
Activer et lancer le service [[systemd]] en exécutant <code>systemctl enable keycloak</code> puis <code>systemctl start keycloak</code>.
Activer et lancer le service [[systemd]] en exécutant <syntaxhighlight lang="bash" inline>systemctl enable keycloak</syntaxhighlight> puis <syntaxhighlight lang="bash" inline>systemctl start keycloak</syntaxhighlight>.


=== Configuration post-installation ===
==== Configuration post-installation ====


==== Création du realm ====
===== Création du realm =====
Une fois connecté sur le nouveau site, cliquer sur le menu déroulant en haut à gauche ('''Keycloak''' master) et cliquer sur '''Create realm'''. Et définir son nom. C'est ce ''realm'' qui va relier l'authentification de tous les services.
Une fois connecté sur le nouveau site, cliquer sur le menu déroulant en haut à gauche ('''Keycloak''' master) et cliquer sur '''Create realm'''. Et définir son nom. C'est ce ''realm'' qui va relier l'authentification de tous les services.


Ligne 305 : Ligne 322 :
|On
|On
|}
|}
=== Mise à jour ===
==== Prérequis ====
Arrêter le service [[systemd]] '''keycloak.service'''.
==== Sauvegarde ====
Création d'une sauvegarde de la base de donnée [[Postgresql]], avec la procédure de [[Postgresql#Sauvegarde d'une base de donnée|sauvegarde de donnée]] pour la base de donnée '''keycloak'''.
Lire les différents [https://www.keycloak.org/docs/latest/upgrading/index.html#migration-changes guides de migration] entre la version installée et la version la plus récente de Keycloak sur le site officiel, et réaliser les opérations demandées.
==== Téléchargement ====
Télécharger la nouvelle archive depuis le site officiel de keycloak, sur la [https://www.keycloak.org/downloads page de téléchargement] et réaliser la même procédure qu'à l'[[Keycloak#Fichiers|installation]].