Actualiser modules/yubikey-first-login.nix

This commit is contained in:
2026-08-18 11:20:31 +02:00
parent b2e655f665
commit 0a762d7d22
+185 -78
View File
@@ -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