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, ... }: { pkgs, ... }:
let let
# ------------------------------------------------------------ # ============================================================
# Assistant interactif de changement du PIN # Assistant interactif de changement du PIN YubiKey
# ------------------------------------------------------------ # ============================================================
yubikeyPinChange = pkgs.writeShellScript "yubikey-pin-change" '' yubikeyPinChange = pkgs.writeShellScript "yubikey-pin-change" ''
set -u set -u
@@ -11,88 +11,200 @@ let
state_dir="$HOME/.local/state/nixos-workstations" state_dir="$HOME/.local/state/nixos-workstations"
marker="$state_dir/yubikey-pin-initialized" 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 if [ -e "$marker" ]; then
exit 0 exit 0
fi 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 "============================================================" separator
echo " INITIALISATION DE VOTRE YUBIKEY"
echo "============================================================"
echo 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
echo "Cette opération est obligatoire." printf " ''${YELLOW}Ne fermez pas cette fenêtre.''${RESET}\n"
echo echo
separator
echo echo
echo "Vous allez devoir saisir :"
echo # Petite pause pour que l'utilisateur lise l'écran
echo " 1. votre PIN temporaire actuel ;" ${pkgs.coreutils}/bin/sleep 2
echo " 2. votre nouveau PIN personnel ;"
echo " 3. une seconde fois votre nouveau PIN." # ----------------------------------------------------------
echo # Changement du PIN
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
if ${pkgs.yubikey-manager}/bin/ykman fido access change-pin; then if ${pkgs.yubikey-manager}/bin/ykman fido access change-pin; then
# Le marqueur est créé IMMÉDIATEMENT après que ykman # IMPORTANT :
# confirme le changement effectif du PIN. # le marqueur n'est créé qu'après retour positif de ykman.
${pkgs.coreutils}/bin/mkdir -p "$state_dir" ${pkgs.coreutils}/bin/mkdir -p "$state_dir"
${pkgs.coreutils}/bin/touch "$marker" ${pkgs.coreutils}/bin/touch "$marker"
success
printf " ''${GREEN}Votre nouveau PIN est maintenant actif.''${RESET}\n"
echo echo
echo "============================================================" printf " Utilisez désormais ce PIN pour vous connecter\n"
echo " LE PIN A ÉTÉ MODIFIÉ AVEC SUCCÈS" printf " avec votre YubiKey.\n"
echo "============================================================"
echo echo
echo "Vous pouvez maintenant utiliser votre nouveau PIN" printf " ''${GREY}Cette procédure ne sera plus affichée.''${RESET}\n"
echo "pour vos prochaines connexions."
echo
echo "Cette fenêtre va se fermer automatiquement."
echo 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 exit 0
else else
failure
printf " ''${RED}Le PIN de la YubiKey n'a pas été modifié.''${RESET}\n"
echo echo
echo "============================================================" printf " Votre session va être fermée afin de protéger\n"
echo " ÉCHEC DU CHANGEMENT DU PIN" printf " l'accès au poste.\n"
echo "============================================================"
echo echo
echo "Votre session va être fermée." printf " ''${YELLOW}La procédure sera automatiquement reproposée''${RESET}\n"
echo printf " ''${YELLOW}à votre prochaine connexion.''${RESET}\n"
echo "La procédure sera automatiquement reproposée"
echo "à votre prochaine connexion."
echo 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 exit 1
fi fi
''; '';
# ------------------------------------------------------------ # ============================================================
# Superviseur # 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 = yubikeyFirstLoginSupervisor =
pkgs.writeShellScript "yubikey-first-login-supervisor" '' pkgs.writeShellScript "yubikey-first-login-supervisor" ''
@@ -100,7 +212,7 @@ let
current_user="$(${pkgs.coreutils}/bin/id -un)" 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 if [ "$current_user" != "alice" ]; then
exit 0 exit 0
fi fi
@@ -108,21 +220,18 @@ let
state_dir="$HOME/.local/state/nixos-workstations" state_dir="$HOME/.local/state/nixos-workstations"
marker="$state_dir/yubikey-pin-initialized" marker="$state_dir/yubikey-pin-initialized"
# Initialisation déjà terminée. # Initialisation déjà effectuée.
if [ -e "$marker" ]; then if [ -e "$marker" ]; then
exit 0 exit 0
fi fi
# Laisse Plasma terminer son démarrage. # Laisse KDE terminer son démarrage.
${pkgs.coreutils}/bin/sleep 3 ${pkgs.coreutils}/bin/sleep 3
# Lance une instance indépendante de Konsole. # --------------------------------------------------------
# # Assistant plein écran
# --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.
${pkgs.kdePackages.konsole}/bin/konsole \ ${pkgs.kdePackages.konsole}/bin/konsole \
--separate \ --separate \
--fullscreen \ --fullscreen \
@@ -130,31 +239,29 @@ let
--hide-tabbar \ --hide-tabbar \
-e ${yubikeyPinChange} -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 if [ -e "$marker" ]; then
# PIN correctement changé.
exit 0 exit 0
fi fi
# Sinon : # Pas de marqueur :
# - fenêtre fermée volontairement ;
# - Ctrl+C ;
# - ykman en erreur ;
# - changement de PIN abandonné.
# #
# 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:-}" session_id="''${XDG_SESSION_ID:-}"
if [ -n "$session_id" ]; then if [ -n "$session_id" ]; then
${pkgs.systemd}/bin/loginctl terminate-session "$session_id" ${pkgs.systemd}/bin/loginctl terminate-session "$session_id"
else else
# Secours si XDG_SESSION_ID n'est exceptionnellement
# pas disponible.
${pkgs.systemd}/bin/loginctl terminate-user "$current_user" ${pkgs.systemd}/bin/loginctl terminate-user "$current_user"
fi fi
@@ -163,15 +270,15 @@ let
in in
{ {
# ------------------------------------------------------------ # ============================================================
# Lancement automatique à l'ouverture de la session KDE # Lancement automatique à l'ouverture de KDE
# ------------------------------------------------------------ # ============================================================
environment.etc."xdg/autostart/yubikey-first-login.desktop".text = '' environment.etc."xdg/autostart/yubikey-first-login.desktop".text = ''
[Desktop Entry] [Desktop Entry]
Type=Application Type=Application
Name=Initialisation YubiKey Name=Initialisation de la YubiKey
Comment=Initialisation obligatoire du PIN personnel de la YubiKey Comment=Configuration obligatoire de votre PIN personnel
Exec=${yubikeyFirstLoginSupervisor} Exec=${yubikeyFirstLoginSupervisor}
OnlyShowIn=KDE; OnlyShowIn=KDE;
NoDisplay=true NoDisplay=true