Actualiser modules/yubikey-first-login.nix
This commit is contained in:
+185
-78
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user