Files
nixos-workstations/README.md
T

373 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<div align="center">
# 🛡️ NixOS Workstations
### Déploiement industrialisé d'environnements de bureau NixOS sécurisés
![NixOS](https://img.shields.io/badge/NixOS-26.05-5277C3?style=for-the-badge&logo=nixos&logoColor=white)
![KDE Plasma](https://img.shields.io/badge/KDE_Plasma-6-1D99F3?style=for-the-badge&logo=kde&logoColor=white)
![Security](https://img.shields.io/badge/Sécurité-FIDO2%20%2F%20YubiKey-111111?style=for-the-badge)
![Deployment](https://img.shields.io/badge/Déploiement-Déclaratif-7EBAE4?style=for-the-badge&logo=nixos&logoColor=white)
![Git](https://img.shields.io/badge/Configuration-Git-F05032?style=for-the-badge&logo=git&logoColor=white)
![License](https://img.shields.io/badge/Licence-PolyForm_Noncommercial-F59E0B?style=for-the-badge)
**Une base NixOS reproductible pour construire, sécuriser et maintenir un parc de postes de travail homogènes.**
</div>
---
## 🎯 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.
<div align="center">
### 👋 Bienvenue → 🔐 Mot de passe → 🔑 YubiKey → ✅ Poste prêt
</div>
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é
<div align="center">
### 🔐 L'interface graphique ne doit pas réimplémenter les mécanismes de sécurité du système.
</div>
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
<p align="center">
![Nix](https://img.shields.io/badge/Nix-Configuration_déclarative-5277C3?style=flat-square&logo=nixos&logoColor=white)
![NixOS](https://img.shields.io/badge/NixOS-Workstations-5277C3?style=flat-square&logo=nixos&logoColor=white)
![KDE](https://img.shields.io/badge/KDE_Plasma-Desktop-1D99F3?style=flat-square&logo=kde&logoColor=white)
![Qt](https://img.shields.io/badge/Qt_Quick-QML-41CD52?style=flat-square&logo=qt&logoColor=white)
![FIDO2](https://img.shields.io/badge/FIDO2-YubiKey-111111?style=flat-square)
![Git](https://img.shields.io/badge/Git-Source_of_truth-F05032?style=flat-square&logo=git&logoColor=white)
</p>
---
## 📜 Licence
![Licence](https://img.shields.io/badge/SPDX-PolyForm--Noncommercial--1.0.0-F59E0B?style=flat-square)
![Commercial](https://img.shields.io/badge/Usage_commercial-Autorisation_requise-EF4444?style=flat-square)
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.
---
<div align="center">
### 🛡️ NixOS Workstations
**Déployer des postes homogènes, reproductibles et sécurisés sans transformer chaque machine en projet individuel.**
</div>