# 🛡️ 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.
```text
┌─────────────────────────────┐
│ 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
```text
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** :
```text
/etc/nixos/hardware-configuration.nix
```
La configuration du parc l'importe directement :
```nix
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.
```text
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 :
```text
┌────────────────────────────────┐
│ 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
```bash
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
```bash
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
```bash
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
```bash
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 :
```text
💿 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 :
- [`LICENSE`](./LICENSE)
- [`COMMERCIAL-LICENSE.md`](./COMMERCIAL-LICENSE.md)
> ℹ️ 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.**