From 0a762d7d22b5fd7d2dae5fa38e8927bd81706e0e Mon Sep 17 00:00:00 2001 From: Olivier <1+olivier@noreply.raspot.in> Date: Tue, 18 Aug 2026 11:20:31 +0200 Subject: [PATCH] Actualiser modules/yubikey-first-login.nix --- modules/yubikey-first-login.nix | 263 ++++++++++++++++++++++---------- 1 file changed, 185 insertions(+), 78 deletions(-) diff --git a/modules/yubikey-first-login.nix b/modules/yubikey-first-login.nix index d168e3a..ad979c7 100644 --- a/modules/yubikey-first-login.nix +++ b/modules/yubikey-first-login.nix @@ -1,9 +1,9 @@ { pkgs, ... }: let - # ------------------------------------------------------------ - # Assistant interactif de changement du PIN - # ------------------------------------------------------------ + # ============================================================ + # Assistant interactif de changement du PIN YubiKey + # ============================================================ yubikeyPinChange = pkgs.writeShellScript "yubikey-pin-change" '' set -u @@ -11,88 +11,200 @@ let state_dir="$HOME/.local/state/nixos-workstations" marker="$state_dir/yubikey-pin-initialized" - # Si l'initialisation a déjà été effectuée, rien à faire. + # ---------------------------------------------------------- + # Couleurs ANSI + # ---------------------------------------------------------- + + RESET="\033[0m" + BOLD="\033[1m" + + BLUE="\033[38;5;39m" + CYAN="\033[38;5;45m" + GREEN="\033[38;5;82m" + YELLOW="\033[38;5;220m" + RED="\033[38;5;196m" + GREY="\033[38;5;245m" + WHITE="\033[38;5;255m" + + # ---------------------------------------------------------- + # Fonctions d'affichage + # ---------------------------------------------------------- + + separator() { + printf "''${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━''${RESET}\n" + } + + header() { + printf "\033[2J\033[H" + + echo + separator + echo + printf " ''${BOLD}''${CYAN}🔐 INITIALISATION DE VOTRE YUBIKEY''${RESET}\n" + echo + separator + echo + } + + step() { + number="$1" + text="$2" + + printf " ''${BOLD}''${CYAN}[%s]''${RESET} ''${WHITE}%s''${RESET}\n" \ + "$number" "$text" + } + + info() { + printf " ''${GREY}%s''${RESET}\n" "$1" + } + + success() { + echo + separator + echo + printf " ''${BOLD}''${GREEN}✔ INITIALISATION TERMINÉE''${RESET}\n" + echo + separator + echo + } + + failure() { + echo + separator + echo + printf " ''${BOLD}''${RED}✖ INITIALISATION NON TERMINÉE''${RESET}\n" + echo + separator + echo + } + + # ---------------------------------------------------------- + # Déjà initialisé + # ---------------------------------------------------------- + if [ -e "$marker" ]; then exit 0 fi - clear + # ---------------------------------------------------------- + # Annulation / interruption + # ---------------------------------------------------------- + + trap ' + printf "\n\n" + printf "''${RED}Initialisation interrompue.''${RESET}\n" + exit 130 + ' INT TERM + + # ---------------------------------------------------------- + # Écran d'accueil + # ---------------------------------------------------------- + + header + + printf " ''${WHITE}Bienvenue.''${RESET}\n" + echo + printf " Pour sécuriser votre accès au poste, vous devez personnaliser\n" + printf " le ''${BOLD}PIN de votre YubiKey''${RESET}.\n" + echo + + printf " ''${YELLOW}⚠ Cette opération est obligatoire.''${RESET}\n" + echo + + step "1/3" "Munissez-vous du PIN temporaire fourni par le service informatique." + echo + + step "2/3" "Choisissez un nouveau PIN personnel." + info "Ne réutilisez pas le PIN temporaire." + echo + + step "3/3" "Confirmez votre nouveau PIN." + echo + + separator + echo + + printf " ''${GREY}Le PIN est enregistré directement dans votre YubiKey.''${RESET}\n" + printf " ''${GREY}Il n'est ni enregistré sur le poste, ni envoyé au service informatique.''${RESET}\n" echo - echo "============================================================" - echo " INITIALISATION DE VOTRE YUBIKEY" - echo "============================================================" + separator echo - echo "Vous devez modifier le PIN temporaire de votre YubiKey." + + printf " ''${BOLD}''${WHITE}Insérez votre YubiKey et suivez les instructions.''${RESET}\n" echo - echo "Cette opération est obligatoire." + printf " ''${YELLOW}Ne fermez pas cette fenêtre.''${RESET}\n" + echo + separator echo - echo "Vous allez devoir saisir :" - echo - echo " 1. votre PIN temporaire actuel ;" - echo " 2. votre nouveau PIN personnel ;" - echo " 3. une seconde fois votre nouveau PIN." - echo - echo "IMPORTANT :" - echo "Ne fermez pas cette fenêtre avant la fin de la procédure." - echo - echo "Si cette fenêtre est fermée ou si l'opération échoue," - echo "votre session sera automatiquement fermée." - echo - echo "============================================================" - echo + + # Petite pause pour que l'utilisateur lise l'écran + ${pkgs.coreutils}/bin/sleep 2 + + # ---------------------------------------------------------- + # Changement du PIN + # ---------------------------------------------------------- if ${pkgs.yubikey-manager}/bin/ykman fido access change-pin; then - # Le marqueur est créé IMMÉDIATEMENT après que ykman - # confirme le changement effectif du PIN. + # IMPORTANT : + # le marqueur n'est créé qu'après retour positif de ykman. ${pkgs.coreutils}/bin/mkdir -p "$state_dir" ${pkgs.coreutils}/bin/touch "$marker" + success + + printf " ''${GREEN}Votre nouveau PIN est maintenant actif.''${RESET}\n" echo - echo "============================================================" - echo " LE PIN A ÉTÉ MODIFIÉ AVEC SUCCÈS" - echo "============================================================" + printf " Utilisez désormais ce PIN pour vous connecter\n" + printf " avec votre YubiKey.\n" echo - echo "Vous pouvez maintenant utiliser votre nouveau PIN" - echo "pour vos prochaines connexions." - echo - echo "Cette fenêtre va se fermer automatiquement." + printf " ''${GREY}Cette procédure ne sera plus affichée.''${RESET}\n" echo - ${pkgs.coreutils}/bin/sleep 5 + separator + echo + printf " Fermeture automatique" + for i in 1 2 3 4 5; do + printf "." + ${pkgs.coreutils}/bin/sleep 1 + done + + echo exit 0 else + failure + + printf " ''${RED}Le PIN de la YubiKey n'a pas été modifié.''${RESET}\n" echo - echo "============================================================" - echo " ÉCHEC DU CHANGEMENT DU PIN" - echo "============================================================" + printf " Votre session va être fermée afin de protéger\n" + printf " l'accès au poste.\n" echo - echo "Votre session va être fermée." - echo - echo "La procédure sera automatiquement reproposée" - echo "à votre prochaine connexion." + printf " ''${YELLOW}La procédure sera automatiquement reproposée''${RESET}\n" + printf " ''${YELLOW}à votre prochaine connexion.''${RESET}\n" echo - ${pkgs.coreutils}/bin/sleep 3 + separator + echo + printf " Fermeture de la session" + for i in 1 2 3; do + printf "." + ${pkgs.coreutils}/bin/sleep 1 + done + + echo exit 1 fi ''; - # ------------------------------------------------------------ + # ============================================================ # Superviseur - # ------------------------------------------------------------ - # - # Il reste actif indépendamment de Konsole. - # - # Si Konsole disparaît alors que le marqueur n'a pas été créé, - # la session graphique d'Alice est immédiatement terminée. - # + # ============================================================ yubikeyFirstLoginSupervisor = pkgs.writeShellScript "yubikey-first-login-supervisor" '' @@ -100,7 +212,7 @@ let current_user="$(${pkgs.coreutils}/bin/id -un)" - # Ce mécanisme ne concerne pour l'instant qu'Alice. + # Pour le moment, uniquement Alice. if [ "$current_user" != "alice" ]; then exit 0 fi @@ -108,21 +220,18 @@ let state_dir="$HOME/.local/state/nixos-workstations" marker="$state_dir/yubikey-pin-initialized" - # Initialisation déjà terminée. + # Initialisation déjà effectuée. if [ -e "$marker" ]; then exit 0 fi - # Laisse Plasma terminer son démarrage. + # Laisse KDE terminer son démarrage. ${pkgs.coreutils}/bin/sleep 3 - # Lance une instance indépendante de Konsole. - # - # --separate garantit que ce processus Konsole reste attaché - # au superviseur jusqu'à la fermeture de la fenêtre. - # - # Le plein écran rend également impossible une fermeture - # accidentelle via le bouton de décoration de fenêtre. + # -------------------------------------------------------- + # Assistant plein écran + # -------------------------------------------------------- + ${pkgs.kdePackages.konsole}/bin/konsole \ --separate \ --fullscreen \ @@ -130,31 +239,29 @@ let --hide-tabbar \ -e ${yubikeyPinChange} - # ---------------------------------------------------------- - # Konsole vient de se terminer. - # ---------------------------------------------------------- + # -------------------------------------------------------- + # L'assistant vient de se terminer. + # -------------------------------------------------------- - # Le changement du PIN a réussi : - # Alice peut continuer sa session normalement. if [ -e "$marker" ]; then + # PIN correctement changé. exit 0 fi - # Sinon : - # - fenêtre fermée volontairement ; - # - Ctrl+C ; - # - ykman en erreur ; - # - changement de PIN abandonné. + # Pas de marqueur : # - # Dans tous ces cas, on ferme la session. + # - utilisateur ayant fermé la fenêtre ; + # - Ctrl+C ; + # - erreur ykman ; + # - changement du PIN abandonné. + # + # Dans tous ces cas, on ferme la session d'Alice. session_id="''${XDG_SESSION_ID:-}" if [ -n "$session_id" ]; then ${pkgs.systemd}/bin/loginctl terminate-session "$session_id" else - # Secours si XDG_SESSION_ID n'est exceptionnellement - # pas disponible. ${pkgs.systemd}/bin/loginctl terminate-user "$current_user" fi @@ -163,15 +270,15 @@ let in { - # ------------------------------------------------------------ - # Lancement automatique à l'ouverture de la session KDE - # ------------------------------------------------------------ + # ============================================================ + # Lancement automatique à l'ouverture de KDE + # ============================================================ environment.etc."xdg/autostart/yubikey-first-login.desktop".text = '' [Desktop Entry] Type=Application - Name=Initialisation YubiKey - Comment=Initialisation obligatoire du PIN personnel de la YubiKey + Name=Initialisation de la YubiKey + Comment=Configuration obligatoire de votre PIN personnel Exec=${yubikeyFirstLoginSupervisor} OnlyShowIn=KDE; NoDisplay=true