373 lines
12 KiB
Markdown
373 lines
12 KiB
Markdown
<div align="center">
|
||
|
||
# 🛡️ 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.**
|
||
|
||
</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">
|
||
|
||

|
||

|
||

|
||

|
||

|
||

|
||
|
||
</p>
|
||
|
||
---
|
||
|
||
## 📜 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.
|
||
|
||
---
|
||
|
||
<div align="center">
|
||
|
||
### 🛡️ NixOS Workstations
|
||
|
||
**Déployer des postes homogènes, reproductibles et sécurisés sans transformer chaque machine en projet individuel.**
|
||
|
||
</div>
|