« Keycloak » : différence entre les versions

m ajout du serveur + partie nginx plus lisible
Replace some code tags by syntaxhighlight inline
Ligne 18 : Ligne 18 :
==== 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 51 :
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 123 :
</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 198 :


==== 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 232 :
</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 239 :
</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 ===