🛡️ NixOS Workstations
Déploiement industrialisé d'environnements de bureau NixOS sécurisés
Une base NixOS reproductible pour construire, sécuriser et maintenir un parc de postes de travail homogènes.
🎯 Objectif du projet
NixOS Workstations a pour objectif d'industrialiser le déploiement de postes de travail NixOS en séparant clairement :
- 🧩 la configuration commune du parc ;
- 💻 la détection matérielle propre à chaque poste ;
- 📦 les logiciels et paramètres du bureau ;
- 👤 les comptes utilisateurs ;
- 🔐 les mécanismes d'authentification ;
- 🔑 l'utilisation de clés FIDO2 / YubiKey ;
- ✨ l'expérience de finalisation du poste à la première connexion.
L'idée est qu'un poste puisse être réinstallé puis reconstruit à partir du dépôt Git avec un minimum d'opérations manuelles.
┌─────────────────────────────┐
│ Dépôt Git │
│ nixos-workstations │
└──────────────┬──────────────┘
│
┌───────────────┼────────────────┐
│ │ │
▼ ▼ ▼
📦 Logiciels 🔐 Sécurité 🖥️ Bureau KDE
│ │ │
└───────────────┼────────────────┘
│
▼
💻 Poste NixOS
│
🔑 FIDO2 / YubiKey
│
▼
✅ Poste opérationnel
✨ Principes
| Principe | Objectif | |
|---|---|---|
| 🧬 | Configuration déclarative | Décrire l'état attendu du poste dans Git |
| ♻️ | Reproductibilité | Pouvoir reconstruire un poste de manière cohérente |
| 🧱 | Modularité | Séparer logiciels, utilisateurs, sécurité et UX |
| 🔐 | Sécurité native | S'appuyer sur les mécanismes NixOS plutôt que les contourner |
| 🔑 | FIDO2 / YubiKey | Fournir une authentification moderne aux utilisateurs |
| 🖥️ | Expérience utilisateur | Fournir un bureau KDE Plasma cohérent et simple |
| 🧪 | Validation progressive | build → dry-activate → test → switch |
| 🧰 | Industrialisation | Limiter les opérations spécifiques à chaque poste |
🏗️ Architecture du dépôt
nixos-workstations/
├── configuration.nix
├── LICENSE
├── COMMERCIAL-LICENSE.md
├── u2f-mappings
│
├── first-login-ui/
│ ├── CMakeLists.txt
│ ├── org.raspot.nixosfirstlogin.desktop
│ └── src/
│ ├── CMakeLists.txt
│ ├── main.cpp
│ └── Main.qml
│
└── modules/
├── software.nix
├── users.nix
├── security.nix
├── yubikey-first-login.nix
└── first-login-ui.nix
💻 Matériel propre à chaque machine
Le fichier matériel généré par NixOS n'est pas stocké dans le dépôt commun :
/etc/nixos/hardware-configuration.nix
La configuration du parc l'importe directement :
imports = [
/etc/nixos/hardware-configuration.nix
./modules/software.nix
./modules/users.nix
./modules/security.nix
./modules/yubikey-first-login.nix
./modules/first-login-ui.nix
];
Ainsi, les UUID, partitions et périphériques propres à une installation restent locaux tandis que les règles communes restent centralisées dans Git.
🧩 Modules principaux
📦 software.nix
Décrit l'environnement logiciel commun :
- 🌐 Chromium ;
- 🦊 Firefox ESR ;
- 📄 OnlyOffice ;
- 💬 Teams ;
- ✉️ Outlook Web ;
- 🔧 Git et outils nécessaires au poste.
👤 users.nix
Décrit les comptes locaux attendus et leurs rôles :
- 🛠️ compte d'administration locale ;
- 👩💻 comptes utilisateurs standards ;
- 👥 appartenance aux groupes nécessaires ;
- 🔐 mécanismes d'initialisation des secrets lorsque nécessaire.
🛡️ security.nix
Centralise les paramètres d'authentification et les mappings FIDO2/U2F.
Utilisateur
│
├──── 🔐 mot de passe
│
└──── 🔑 YubiKey / FIDO2
🔑 yubikey-first-login.nix
Gère le workflow de personnalisation initiale des secrets liés au poste et à la YubiKey.
✨ first-login-ui.nix
Installe l'interface graphique plein écran utilisée lors de la finalisation du poste.
L'assistant graphique est une composante du projet, pas sa finalité.
✨ Finalisation du poste utilisateur
Lors de la première utilisation, l'utilisateur dispose d'un assistant graphique intégré au bureau KDE.
👋 Bienvenue → 🔐 Mot de passe → 🔑 YubiKey → ✅ Poste prêt
L'objectif est de rendre les opérations de personnalisation simples et compréhensibles, sans exposer l'utilisateur aux outils système.
🔐 Mot de passe
- 🔒 saisie masquée par défaut ;
- 👁️ bouton pour afficher ou masquer les secrets ;
- 📊 indicateur de robustesse ;
- 💡 recommandations informatives ;
- ✅ confirmation obligatoire ;
- 🟢 un mot de passe faible n'est pas bloqué volontairement.
🔑 YubiKey
- 🔢 saisie du PIN temporaire ;
- 👁️ affichage/masquage du PIN ;
- 🔁 choix et confirmation du nouveau PIN ;
- ✅ validation avant la fin du parcours.
✅ Poste prêt
L'écran final récapitule visuellement les opérations réalisées avant de rendre le poste à l'utilisateur.
🛡️ Sécurité
🔐 L'interface graphique ne doit pas réimplémenter les mécanismes de sécurité du système.
L'architecture sépare l'interface des opérations sensibles :
┌────────────────────────────────┐
│ Qt Quick / QML │
│ Présentation et validation │
└───────────────┬────────────────┘
│
▼
┌────────────────────────────────┐
│ Backend contrôlé │
├────────────────────────────────┤
│ 🔐 Mot de passe → passwd NixOS │
│ 🔑 PIN YubiKey → ykman │
└────────────────────────────────┘
Principes retenus :
- 🚫 pas de modification directe de
/etc/shadow; - 🚫 pas de réimplémentation artisanale de PAM ;
- ✅ utilisation des mécanismes NixOS prévus pour les mots de passe ;
- ✅ utilisation des outils FIDO2/YubiKey dédiés ;
- ✅ séparation entre compte administrateur et utilisateur standard ;
- ✅ validation des changements avant activation persistante.
🧪 Cycle de validation
Une modification du dépôt n'est pas directement appliquée avec switch.
1️⃣ Construction
sudo nixos-rebuild build \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
🧱 Construit la nouvelle configuration sans l'activer.
2️⃣ Prévisualisation de l'activation
sudo nixos-rebuild dry-activate \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
🔎 Permet d'inspecter les changements d'activation prévus.
3️⃣ Test temporaire
sudo nixos-rebuild test \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
🧪 Active la configuration pour validation sans en faire la génération de démarrage par défaut.
4️⃣ Validation définitive
sudo nixos-rebuild switch \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
✅ Rend la configuration active et persistante pour les prochains démarrages.
🚀 Vision de déploiement
L'objectif est de réduire progressivement la préparation d'un poste à une chaîne standardisée :
💿 Installation NixOS
│
▼
🧬 Génération du matériel local
│
▼
📥 Récupération du dépôt Git
│
▼
🧱 Construction de la configuration
│
▼
🛡️ Application du socle de sécurité
│
▼
👤 Affectation de l'utilisateur
│
▼
🔑 Préparation FIDO2 / YubiKey
│
▼
✨ Finalisation graphique
│
▼
✅ Poste prêt
À terme, cette chaîne doit pouvoir être complétée par :
- 🧰 installation automatisée ;
- 🗂️ inventaire des machines ;
- 🧩 profils matériels ;
- 👥 affectation déclarative utilisateurs/postes ;
- 🔄 mises à jour centralisées par Git ;
- 📋 intégration avec les outils de gestion de parc.
🧰 Technologies
📜 Licence
Le projet est distribué sous PolyForm Noncommercial License 1.0.0.
✅ Autorisé
- utilisation non commerciale ;
- étude du code ;
- modification ;
- partage dans les limites prévues par la licence.
🚫 Exploitation commerciale
Toute exploitation commerciale nécessite une autorisation ou une licence commerciale distincte accordée par le titulaire des droits.
Voir :
ℹ️ PolyForm Noncommercial est une licence source-available non commerciale et non une licence open source au sens OSI.
🛡️ NixOS Workstations
Déployer des postes homogènes, reproductibles et sécurisés sans transformer chaque machine en projet individuel.