J'ai mis en place au CDI de mon lycée on ordinateur de consultation du catalogue, configuré avec les deux contraintes suivantes :
- la seule chose à faire pour l'allumer en début de journée est d'appuyer sur le bouton « on/off » : une session se lance alors automatiquement et ouvre un navigateur à l'adresse du catalogue du CDI. Si le navigateur est fermé, il est relancé immédiatement ;
- il n'est possible ni de lancer un autre logiciel que le navigateur web, ni de visiter un autre site web que celui du catalogue du CDI.
Lycées en AURA
Cette configuration est mise en place sur un ordinateur sur lequel est installé la distribution GNU/Linux fournie par la région AURA. Ce tutoriel s'applique à n'importe quel ordinateur (?) mais quelques spécificités locales seront précisées dans des parties notées Lycées AURA.Le tutoriel peut être suivi et appliqué pas à pas. Par les collègues des lycées de la région AURA, un playbook Ansible est proposé en fin d'article.
Prérequis
Ce tutoriel a été mis en œuvre sur une Ubuntu Noble Numbat. Il devrait fonctionner sur les versions d'Ubuntu supérieure, et les versions de Debian à partir de Trixie.
Il doit fonctionner avec d'autres distributions GNU/Linux, mais il faudra adapter certains détails de tutoriel, ce que je laisse au lecteur·ice patient·e.
Session restreinte au seul navigateur
Gnome propose GNOME Kiosk, qui est exactement ce dont nous avons besoin : a desktop environment suitable for fixed purpose, or single application deployments like wall displays and point-of-sale systems. Il est annoncé comme expérimental, mais il est disponible dans le gestionnaire de paquets d'Ubuntu et de Debian. Nous l'installons donc. Enfin, nous installons l'exemple de configuration utilisé plus tard, qui inclut
gnome-kioskcomme dépendance.sudo apt install gnome-kiosk-script-session
Lycées AURA Au moment où j'écris ces lignes, la version fournie par la région est Ubuntu 22.04 Jammy Jellyfish, sur laquelle GNOME Kiosk n'est pas disponible. Il faut donc commencer par mettre à jour l'ordinateur avec la commande
sudo do-release-upgrade(qui commencera par se plaindre que la mise à jour a été bloquée ; il faudra alors modifier le fichier de configuration indiqué pour indiquer que les mises à jour doivent être faites de LTS en LTS).En ligne de commande ou avec l'interface graphique, il faut créer l'utilisateur qui lancera la session. Nous utiliserons ici
cdi.kiosque.Lycées AURA L'image fournie par la région est configurée pour supprimer les comptes locaux à chaque redémarrage. Il faut donc créer avec la boîte à outil un compte élève
cdi.kiosque.Nous configurons maintenant GDM3 pour ne pas demander un identifiant et mot de passe à l'allumage de l'ordinateur : il doit se connecter automatiquement à la session de l'utilisateur
cdi.kiosque. Pour cela, dans le fichier/etc/gdm3/custom.conf, dans la section[daemon], ajouter les lignes suivantes :AutomaticLoginEnable=True AutomaticLogin=cdi.kiosque
À ce stade, l'ordinateur s'allume et se connecte avec le bon utilisateur, mais pas avec la bonne session. Nous voulons que la session utilisée soit une de celles fournies par GNOME Kiosque. Ce paquet en fournit deux :
search-app(disponible dans Ubuntu sous le nomgnome-kiosk-search-appliance), qui fait exactement ce que nous voulons (lancer un navigateur web en mode kiosque à une adresse prédéfinie), mais que je n'ai pas réussi à faire fonctionner ;kiosk-script(disponible dans Ubuntu sous le nomgnome-kiosk-script-session), qui lance un script arbitraire au démarrage.
C'est cette seconde session que nous lançons par défaut, en créant le fichier
/var/lib/AccountsService/users/cdi.kiosque:[User] Session=gnome-kiosk-script-wayland SystemAccount=false
L'ordinateur se lance maintenant en se connectant automatiquement à la bonne session, mais lance un logiciel d'exemple. Changeons cela pour que Firefox soit lancé automatiquement, en mode kiosque (en masquant les menus, barre d'URL, raccourcis, etc.). Pour cela, créer le fichier
~cdi.kiosk/.local/bin/gnome-kiosk-scriptavec le contenu suivant (à adapter en mettant l'URL souhaitée) :firefox --kiosk --private-window --new-instance https://0380081g.esidoc.fr sleep 1.0 exec "$0" "$@"
Ce fichier doit être exécutable :
chmod a+x ~cdi.kiosk/.local/bin/gnome-kiosk-script
Ce script :
- lance Firefox en mode kiosque, en fenêtre privée (sans enregistrer l'historique), sur la page d'accueil de CDI ;
- s'exécute à nouveau à l'infini lorsque Firefox est fermé.
Notez qu'une configuration supplémentaire peut (doit ?) être appliquée à Firefox ; cela est décrit plus tard.
Navigation restreinte au seul catalogue
Nous avons à ce stade un ordinateur qui se lance en ouvrant automatiquement la bonne session, en lançant Firefox sur le bon site web. Mais si ce site web contient des liens vers l'extérieur, ou que les utilisateur·ice·s utilisent les raccourcis claviers pour ouvrir une autre adresse, tout le web leur est accessible. Nous allons maintenant bloquer tous les sites web sauf celui souhaité.
Remarque : Cela fonctionne ici parce que, par chance, le site du CDI ne fait appel à aucun CDN. Si c'est le cas chez vous, il faudra adapter la suite du tutoriel pour autoriser également ces adresses, ce qui risque d'autoriser plus de choses que ce que vous souhaitiez…
Le principe général est que :
- un proxy est installé, qui interdit toutes les adresses sauf celle autorisée ;
- Firefox est configuré pour utiliser ce proxy ;
- un pare-feu est configuré pour forcer l'utilisation du proxy (ou pour être plus précis : pour interdire la non-utilisation du proxy).
Installation et configuration du proxy.
Installons le proxy Squid :
sudo apt install squid
La configuration habituelle de Squid est qu'il soit installé sur un serveur accessible uniquement à l'administrateur·ice système : les utilisateur·ice·s utilisent alors un autre ordinateur, dont les connexions vers l'extérieur passent par ce proxy. Ici, pour simplifier le réseau, le serveur proxy est installé sur le poste utilisé comme kiosque (pas besoin d'installer et gérer une autre machine physique ou virtuelle quelque part, pas besoin de configurer le réseau pour pouvoir accéder à cette machine). Il faut donc modifier la configuration par défaut de Squid qui autorise toutes les connexions venant de la même machine.
Dans le fichier
/etc/squid/squid.conf, commenter la ligne :http_access allow localhost(en ajoutant un croisillon devant) :# http_access allow localhostAjouter les deux fichiers suivant dans le dossier de configuration de Squid : le premier contient la liste des sites web à autoriser (un seul ici), et le second fait en sorte que tous les sites soient interdit, sauf la liste du premier fichier.
/etc/squid/conf.d/whitelist.txt.esidoc.fr
/etc/squid/conf.d/whitelist.confacl allowlist dstdomain '/etc/squid/conf.d/whitelist.txt' http_access allow allowlist http_access deny all
Je remarque en écrivant ces lignes que le proxy bloque aussi les mises à jour du système, mais je n'ai pas la machine sous la main pour tester.
Il reste à configurer le navigateur web Firefox pour utiliser ce proxy ; ceci sera fait dans la dernière partie.
Installation et configuration du pare-feux
Si l'on s'arrête là, il est (peut-être ?) possible de contourner le pare-feux, en ne le configurant pas. Puisque que Firefox est configuré pour l'utiliser, et interdire de changer la configuration du proxy, cette partie est peut-être inutle. Mais je préfère prendre le moins de risques possibles.
Notons que toutes les commandes iptables contiennent les arguments -m owner --uid-owner cdi.kiosque, qui font qu'elles ne s'appliquent qu'à l'utilisateur du kiosque : les autres utilisateurs (et les comptes d'administration de l'ordinateur) ne sont pas touchés (mais ils sont tout de même touchés par les règles du proxy Squid).
Installons le pare-feux iptables (cette étape est probablement inutile sur la plupart, voire tous, les systèmes Linux ou Unix, puisqu'iptables est souvent installé par défaut).
sudo apt install iptables
Si le seul accès extérieur autorisé est le site web, cela interdit les requêtes DNS, pourtant nécessaires pour visiter le site web. Commençons donc par les autoriser.
sudo iptables -A OUTPUT -p udp --dport 53 -m owner --uid-owner cdi.kiosque -j ACCEPT
Les requêtes vers le proxy sont autorisées :
sudo iptables -A OUTPUT -i lo -p tcp --dport 3128 -m owner --uid-owner cdi.kiosque -j ACCEPT
Toutes les autres requêtes sont interdites, en IPv4 comme en IPv6 :
sudo iptables -A OUTPUT -m owner --uid-owner cdi.kiosque -j REJECT sudo ip6tables -A OUTPUT -m owner --uid-owner cdi.kiosque -j REJECT
Ces requêtes sont valables… jusqu'au redémarrage de l'ordinateur. Pour qu'elles soient permanentes, il faut soit utiliser le module Ansible dédié (ce qui est décrit plus bas), soit configurer iptables pour sauvegarder les règles (je vous laisse utiliser un moteur de recherche pour cela).
Configuration du navigateur
Un fichier policies.json permet d'appliquer une configuration à tous les utilisateur·ice·s d'une même machine, ce qui est pertinent ici puisque l'ordinateur n'est utilisé que pour la consultation du catalogue. Voici le contenu du fichier /etc/firefox/policies/policies.json :
{ "policies": { "BlockAboutAddons": true, "BlockAboutConfig": true, "BlockAboutProfiles": true, "BlockAboutSupport": true, "DefaultBrowserSettingEnabled": false, "DisableAccounts": true, "DisableDeveloperTools": true, "DisableFirefoxStudies": true, "DisableTelemetry": true, "GenerativeAI": { "Enabled": false }, "Homepage": { "URL": "https://0380081g.esidoc.fr", "Locked": true }, "IPProtectionAvailable": false, "PasswordManagerEnabled": false, "Proxy": { "Mode": "manual", "Locked": true, "HTTPProxy": "localhost:3128", "UseHTTPProxyForAllProtocols": true, "UseProxyForDNS": true }, "SkipTermsOfUse": true } }
Voici les explications pour toutes ces règles (certaines sont nécessaire pour que tout fonctionne, d'autres sont un choix subjectif) :
Interdire de modifier certains paramètres du navigateur :
"BlockAboutAddons": true, "BlockAboutConfig": true, "BlockAboutProfiles": true, "BlockAboutSupport": true,Ne pas vérifier que Firefox est le navigateur par défaut :
"DefaultBrowserSettingEnabled": false,Interdire au navigateur de se connecter à différents comptes (on parle ici des comptes utilisés par le navigateur, comme Firefox Sync) :
"DisableAccounts": true,
Interdire d'ouvrir les outils de développement :
"DisableDeveloperTools": true,Ne pas utiliser les fonctions expérimentales :
"DisableFirefoxStudies": true,Ne pas envoyer d'informations de télémétrie à Mozilla :
"DisableTelemetry": true,Désactiver tous les outils d'IA générative :
"GenerativeAI": { "Enabled": false },Configurer la page d'accueil, et interdire d'en changer :
"Homepage": { "URL": "https://0380081g.esidoc.fr", "Locked": true },Désactiver le VPN intégré à Firefox :
"IPProtectionAvailable": false,Désactiver le gestionnaire de mot de passe :
"PasswordManagerEnabled": false,Forcer l'utilisation du proxy (configuré à la partie précédente), et interdire de le désactiver :
"Proxy": { "Mode": "manual", "Locked": true, "HTTPProxy": "localhost:3128", "UseHTTPProxyForAllProtocols": true, "UseProxyForDNS": true },Ne pas demander à l'utilisateur·ice s'il accepte les conditions d'utilisation :
"SkipTermsOfUse": true,
Playbook Ansible pour la région Rhône-Alpes
Je fournis ici un playbook pour Ansible (ainsi que les fichiers associés) pour appliquer cette configuration à tous les ordinateurs dont le nom commence par CDI-KIOSQUE. Voici les instructions pour l'appliquer.
Créer avec la boîte à outils un utilisateur
cdi.kiosque.Télécharger et extraire la configuration.
Modifier cette configuration en remplaçant :
- toutes les occurences au site web de mon CDI https://0380081g.esidoc.fr par le vôtre (deux occurences complètes, et une autre incomplète dans le fichier
kiosk/squid/conf.d/whitelist.txt) ; - toutes les occurences à
cdi.kiosquepar autre chose, si vous avez choisi un autre nom d'utilisateur.
- toutes les occurences au site web de mon CDI https://0380081g.esidoc.fr par le vôtre (deux occurences complètes, et une autre incomplète dans le fichier
Appliquer cette configuration. Si vous avez configuré votre parc d'ordinateurs pour une gestion centralisée avec
ansible-pull(comme décrit ici), cela se fait à la main avec cette commande (exécutée sur l'ordinateur cible), ou automatiquement à chaque démarrage de l'ordinateur si son nom commence parCDI-KIOSQUE.ansible-pull \ --url https://URL-DU-DEPOT-GIT-DE-VOTRE-CONFIGURATION \ --inventory $(hostname), \ --only-if-changed \ kiosk.yml
Et si tout ne fonctionne pas comme prévu, rejoignez le salon Tchap AideTech démarche NIRD (relatif à la démarche NIRD) ou un des salons Tchap des utilisateur·ice·s de GNU/Linux en région AURA.
Conclusion
Bon courage ! Vos documentalistes seront ravi·e·s !