12 KiB
🛡️ NixOS Workstations
Déploiement industrialisé de postes de travail NixOS sécurisés
Une base déclarative et reproductible pour déployer, sécuriser et maintenir des environnements de bureau NixOS homogènes.
🎯 Objectif
NixOS Workstations fournit un socle commun permettant de construire un parc de postes de travail NixOS avec :
- 🧬 une configuration déclarative versionnée dans Git ;
- 📦 un ensemble logiciel homogène ;
- 🖥️ KDE Plasma 6 ;
- 👤 des comptes locaux maîtrisés ;
- 🔐 une authentification locale de secours ;
- 🔑 FIDO2 / YubiKey ;
- ✨ une finalisation graphique du poste lors de la première utilisation ;
- 💻 une séparation stricte entre configuration commune et matériel propre à chaque machine.
┌───────────────────────────┐
│ Git │
│ nixos-workstations │
└─────────────┬─────────────┘
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
📦 Logiciels 👤 Utilisateurs 🛡️ Sécurité
│ │ │
└────────────────┼────────────────┘
│
▼
🖥️ NixOS + KDE Plasma
│
🔐 Mot de passe
🔑 FIDO2 / YubiKey
│
▼
✅ Poste opérationnel
✨ Principes
| Principe | Objectif | |
|---|---|---|
| 🧬 | Déclaratif | Décrire l'état attendu du poste dans Git |
| ♻️ | Reproductible | Reconstruire un poste de manière cohérente |
| 🧱 | Modulaire | Séparer logiciels, utilisateurs, sécurité et UX |
| 🔐 | Natif NixOS | Utiliser les mécanismes système plutôt que les contourner |
| 🔑 | FIDO2 | Utiliser une clé de sécurité comme moyen d'authentification principal |
| 🧰 | Industrialisable | Éviter les fichiers de configuration complets spécifiques à chaque poste |
| 🧪 | Validation progressive | build → dry-activate → test → switch |
🏗️ Architecture
nixos-workstations/
├── configuration.nix
├── u2f-mappings
├── LICENSE
├── COMMERCIAL-LICENSE.md
├── PRODUCTION-CHECKLIST.md
│
├── workstation-setup/
│ ├── CMakeLists.txt
│ ├── org.raspot.nixosworkstations.setup.desktop
│ └── src/
│ ├── CMakeLists.txt
│ ├── main.cpp
│ ├── Main.qml
│ ├── ProvisioningBackend.h
│ └── ProvisioningBackend.cpp
│
└── modules/
├── software.nix
├── users.nix
├── security.nix
└── workstation-setup.nix
💻 Matériel propre à chaque poste
Le fichier généré lors de l'installation reste local à la machine :
/etc/nixos/hardware-configuration.nix
Il n'est pas partagé dans le dépôt commun.
imports = [
/etc/nixos/hardware-configuration.nix
./modules/software.nix
./modules/users.nix
./modules/security.nix
./modules/workstation-setup.nix
];
Les UUID de partitions et autres informations propres au matériel ne peuvent ainsi pas écraser la configuration d'un autre poste.
🧩 Modules
📦 software.nix
Déploie l'environnement logiciel commun : Chromium, Firefox ESR, OnlyOffice, Teams, Outlook Web, Git et les outils FIDO2 nécessaires.
👤 users.nix
Décrit les comptes locaux et leurs rôles. Les mots de passe restent mutables afin que l'utilisateur puisse personnaliser son secret local avec passwd.
Dans ce lab, le mot de passe temporaire d'alice est volontairement déclaré dans users.nix avec initialHashedPassword.
Mot de passe temporaire du lab : LaboTest@1980
Avec users.mutableUsers = true, ce hash sert à la création initiale du compte. Une fois le mot de passe changé par l'utilisateur, les activations suivantes conservent le nouveau mot de passe local.
Pour un déploiement réel, le dépôt sera privé et la stratégie de secret initial pourra être adaptée au processus d'exploitation.
🛡️ security.nix
Déploie le mapping utilisateur ↔ YubiKey et configure l'authentification PAM U2F/FIDO2 utilisée par le poste.
✨ workstation-setup.nix
Déploie l'assistant plein écran de finalisation du poste et son lancement automatique pour l'utilisateur concerné.
Le nom de l'utilisateur n'est pas codé dans l'application : il est déclaré dans la configuration NixOS :
nixosWorkstations.workstationSetup = {
enable = true;
user = "alice";
};
✨ Finalisation du poste
Lors de la première ouverture de session de l'utilisateur :
👋 Bienvenue → 🔐 Mot de passe → 🔑 YubiKey → ✅ Poste prêt
🔐 Mot de passe local
- 👁️ affichage/masquage des champs ;
- 📊 indicateur de robustesse purement informatif ;
- ✅ mot de passe actuel obligatoire ;
- ✅ confirmation du nouveau mot de passe ;
- 🟢 aucun blocage UI lié à une robustesse jugée faible ;
- 🔒 changement réel effectué par
/run/wrappers/bin/passwd.
🔑 PIN YubiKey
- 👁️ affichage/masquage du PIN ;
- ✅ PIN temporaire obligatoire ;
- ✅ choix et confirmation du nouveau PIN ;
- 🔐 changement réel effectué par
ykman fido access change-pin; - ⚠️ aucune boucle automatique en cas de mauvais PIN.
🚪 Assistant obligatoire
Tant que les deux opérations n'ont pas réellement réussi :
- le bouton final n'est pas disponible ;
- une fermeture classique de la fenêtre est refusée ;
- une minimisation est immédiatement ramenée en plein écran ;
- l'assistant sera reproposé à la prochaine ouverture de session si la configuration reste incomplète.
Les étapes ne sont considérées terminées qu'après création des marqueurs :
~/.local/state/nixos-workstations/password-initialized
~/.local/state/nixos-workstations/yubikey-pin-initialized
🛡️ Traitement des secrets
┌───────────────────────────────┐
│ Qt Quick / QML │
│ saisie utilisateur │
└───────────────┬───────────────┘
│ pipe privé
▼
┌───────────────────────────────┐
│ backend Qt contrôlé │
└───────────────┬───────────────┘
│
┌────────┴────────┐
▼ ▼
/run/wrappers/bin/ ykman FIDO2
passwd
│ │
▼ ▼
/etc/shadow YubiKey
Principes retenus :
- 🚫 aucun mot de passe ou PIN dans les arguments de processus ;
- 🚫 aucun secret définitif utilisateur écrit dans Git ;
- 🧪 le mot de passe temporaire du lab est volontairement versionné dans
users.nix; - 🚫 aucune modification directe de
/etc/shadow; - 🚫 aucun module PAM artisanal ;
- 🚫 aucun reset automatique de YubiKey ;
- ✅ wrapper
passwdfourni par NixOS ; - ✅ outil Yubico officiel pour FIDO2 ;
- ✅ logs des helpers désactivés ;
- ✅ core dumps désactivés pendant le provisioning ;
- ✅ une seule tentative FIDO2 par validation utilisateur.
🔐 Mot de passe temporaire du lab
Le compte alice est créé avec un mot de passe temporaire connu pour faciliter les essais reproductibles :
LaboTest@1980
Son hash est déclaré directement dans :
modules/users.nix
L'assistant demande ensuite à l'utilisateur de remplacer ce mot de passe temporaire par son mot de passe personnel. Avec users.mutableUsers = true, le nouveau mot de passe est conservé lors des activations suivantes.
Cette décision est volontaire pour le lab. Elle évite une étape locale supplémentaire avant chaque nouvelle installation de test.
🧪 Déploiement
1. Construction
sudo nixos-rebuild build \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
2. Simulation d'activation
sudo nixos-rebuild dry-activate \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
3. Test temporaire
sudo nixos-rebuild test \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
4. Activation persistante
Après validation complète de la checklist :
sudo nixos-rebuild switch \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
👉 Voir PRODUCTION-CHECKLIST.md avant un switch.
🔭 Industrialisation future
Le socle est conçu pour évoluer vers :
Inventaire / GLPI / CSV
│
▼
Utilisateur + poste + profil matériel
│
▼
Configuration NixOS commune
│
▼
Installation automatisée
│
▼
Finalisation utilisateur FIDO2
Les prochaines briques possibles sont notamment Disko, un inventaire machines/utilisateurs et une installation unattended.
⚖️ Licence
Le projet est distribué sous PolyForm Noncommercial 1.0.0.
✅ utilisation et modification non commerciales selon les conditions de la licence ;
🚫 exploitation commerciale sans autorisation ;
💼 une exploitation commerciale peut faire l'objet d'un accord séparé avec le titulaire des droits.
Voir LICENSE et COMMERCIAL-LICENSE.md.
Cette licence est source-available non commerciale ; elle n'est pas une licence Open Source au sens OSI.
Correctifs v1.1 du setup
La version 1.1 durcit la brique workstation-setup :
- l'utilisateur cible n'est plus compilé dans le binaire ; le lanceur le transmet avec
--target-user; - les chemins des helpers sont générés dans
Config.h, sans macro CMake fragile ; - le binaire ne quitte plus silencieusement en cas de mauvais utilisateur ;
--diagnoseaffiche l'utilisateur courant, l'utilisateur cible et l'état des marqueurs ;- un journal sans secret est écrit dans
~/.local/state/nixos-workstations/setup.log; - les buffers explicites contenant des secrets sont effacés dès que possible ;
- les timeouts des helpers sont distingués des autres erreurs ;
programs.yubikey-manager.enable = truefournit ykman avec les règles udev NixOS nécessaires ;- une seule invocation de
ykmanest effectuée par tentative de changement de PIN.
Diagnostic manuel :
nixos-workstations-setup --target-user alice --diagnose
Lancement manuel de l'interface :
nixos-workstations-setup --target-user alice