337 lines
11 KiB
Markdown
337 lines
11 KiB
Markdown
<div align="center">
|
|
|
|
# 🛡️ 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.**
|
|
|
|
</div>
|
|
|
|
---
|
|
|
|
## 🎯 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.
|
|
|
|
```text
|
|
┌───────────────────────────┐
|
|
│ 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
|
|
|
|
```text
|
|
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** :
|
|
|
|
```text
|
|
/etc/nixos/hardware-configuration.nix
|
|
```
|
|
|
|
Il n'est pas partagé dans le dépôt commun.
|
|
|
|
```nix
|
|
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`.
|
|
|
|
```text
|
|
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 :
|
|
|
|
```nix
|
|
nixosWorkstations.workstationSetup = {
|
|
enable = true;
|
|
user = "alice";
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## ✨ Finalisation du poste
|
|
|
|
Lors de la première ouverture de session de l'utilisateur :
|
|
|
|
<div align="center">
|
|
|
|
### 👋 Bienvenue → 🔐 Mot de passe → 🔑 YubiKey → ✅ Poste prêt
|
|
|
|
</div>
|
|
|
|
### 🔐 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 :
|
|
|
|
```text
|
|
~/.local/state/nixos-workstations/password-initialized
|
|
~/.local/state/nixos-workstations/yubikey-pin-initialized
|
|
```
|
|
|
|
---
|
|
|
|
## 🛡️ Traitement des secrets
|
|
|
|
```text
|
|
┌───────────────────────────────┐
|
|
│ 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 `passwd` fourni 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 :
|
|
|
|
```text
|
|
LaboTest@1980
|
|
```
|
|
|
|
Son hash est déclaré directement dans :
|
|
|
|
```text
|
|
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
|
|
|
|
```bash
|
|
sudo nixos-rebuild build \
|
|
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
|
|
```
|
|
|
|
### 2. Simulation d'activation
|
|
|
|
```bash
|
|
sudo nixos-rebuild dry-activate \
|
|
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
|
|
```
|
|
|
|
### 3. Test temporaire
|
|
|
|
```bash
|
|
sudo nixos-rebuild test \
|
|
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
|
|
```
|
|
|
|
### 4. Activation persistante
|
|
|
|
Après validation complète de la checklist :
|
|
|
|
```bash
|
|
sudo nixos-rebuild switch \
|
|
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
|
|
```
|
|
|
|
👉 Voir [`PRODUCTION-CHECKLIST.md`](PRODUCTION-CHECKLIST.md) avant un `switch`.
|
|
|
|
---
|
|
|
|
## 🔭 Industrialisation future
|
|
|
|
Le socle est conçu pour évoluer vers :
|
|
|
|
```text
|
|
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`](LICENSE) et [`COMMERCIAL-LICENSE.md`](COMMERCIAL-LICENSE.md).
|
|
|
|
> Cette licence est *source-available non commerciale* ; elle n'est pas une licence Open Source au sens OSI.
|