Téléverser les fichiers vers "/"

This commit is contained in:
2026-08-18 17:34:53 +02:00
parent e726882e6a
commit 94a10d654a
2 changed files with 227 additions and 204 deletions
+59
View File
@@ -0,0 +1,59 @@
# Checklist de mise en production — NixOS Workstations
## Avant activation
```bash
cd ~/nixos-workstations
sudo nixos-rebuild build \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
sudo nixos-rebuild dry-activate \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
```
## Test contrôlé
1. Vérifier que `localadm` se connecte toujours par mot de passe.
2. Vérifier que `/etc/nixos/hardware-configuration.nix` est bien le fichier local du poste.
3. Exécuter :
```bash
sudo nixos-rebuild test \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
```
4. Fermer la session `localadm` et ouvrir la session `alice`.
5. Vérifier que l'assistant plein écran démarre automatiquement.
6. Tester avec le mot de passe temporaire du lab `LaboTest@1980` et le PIN temporaire réel de la YubiKey.
7. Vérifier qu'un mauvais PIN produit une erreur et **ne déclenche aucune tentative automatique supplémentaire**.
8. Vérifier qu'après succès les deux fichiers existent :
```bash
ls -l ~/.local/state/nixos-workstations/
```
Attendu :
```text
password-initialized
yubikey-pin-initialized
```
9. Se déconnecter/reconnecter : l'assistant ne doit plus démarrer.
10. Tester l'authentification YubiKey + nouveau PIN, puis le mot de passe local de secours.
## Passage persistant
Uniquement après validation complète :
```bash
sudo nixos-rebuild switch \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix
```
## Important
- Ne jamais supprimer/réinitialiser la YubiKey en cas d'erreur de PIN.
- Ne jamais modifier manuellement `/etc/shadow`.
- Le retour à une ancienne génération NixOS ne restaure pas les mots de passe mutables.
+168 -204
View File
@@ -2,51 +2,51 @@
# 🛡️ NixOS Workstations
### Déploiement industrialisé d'environnements de bureau NixOS sécurisés
### Déploiement industrialisé de postes de travail 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)
![Security](https://img.shields.io/badge/Sécurité-FIDO2%20%2F%20YubiKey-111827?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)
![Status](https://img.shields.io/badge/Statut-Candidat_Production-2563EB?style=for-the-badge)
![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.**
**Une base déclarative et reproductible pour déployer, sécuriser et maintenir des environnements de bureau NixOS homogènes.**
</div>
---
## 🎯 Objectif du projet
## 🎯 Objectif
**NixOS Workstations** a pour objectif d'industrialiser le déploiement de postes de travail NixOS en séparant clairement :
**NixOS Workstations** fournit un socle commun permettant de construire un parc de postes de travail NixOS avec :
- 🧩 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.
- 🧬 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
─────────────────────────────┐
Dépôt Git │
nixos-workstations
─────────────┬─────────────
┌───────────────────────────┐
Git
│ nixos-workstations │
└─────────────┬─────────────┘
┌───────────────┼────────────────┐
│ │ │
▼ ▼ ▼
📦 Logiciels 🔐 Sécurité 🖥 Bureau KDE
│ │ │
└───────────────┼────────────────┘
───────────────┼────────────────┐
│ │
▼ ▼
📦 Logiciels 👤 Utilisateurs 🛡 Sécurité
│ │
───────────────┼────────────────┘
💻 Poste NixOS
🖥️ NixOS + KDE Plasma
🔐 Mot de passe
🔑 FIDO2 / YubiKey
@@ -59,51 +59,52 @@ L'idée est qu'un poste puisse être réinstallé puis reconstruit à partir du
| | 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 |
| 🧬 | **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` |
| 🧰 | **Industrialisation** | Limiter les opérations spécifiques à chaque poste |
---
## 🏗️ Architecture du dépôt
## 🏗️ Architecture
```text
nixos-workstations/
├── configuration.nix
├── u2f-mappings
├── LICENSE
├── COMMERCIAL-LICENSE.md
├── u2f-mappings
├── PRODUCTION-CHECKLIST.md
├── first-login-ui/
├── workstation-setup/
│ ├── CMakeLists.txt
│ ├── org.raspot.nixosfirstlogin.desktop
│ ├── org.raspot.nixosworkstations.setup.desktop
│ └── src/
│ ├── CMakeLists.txt
│ ├── main.cpp
── Main.qml
── Main.qml
│ ├── ProvisioningBackend.h
│ └── ProvisioningBackend.cpp
└── modules/
├── software.nix
├── users.nix
├── security.nix
── yubikey-first-login.nix
└── first-login-ui.nix
── workstation-setup.nix
```
### 💻 Matériel propre à chaque machine
### 💻 Matériel propre à chaque poste
Le fichier matériel généré par NixOS **n'est pas stocké dans le dépôt commun** :
Le fichier généré lors de l'installation reste **local à la machine** :
```text
/etc/nixos/hardware-configuration.nix
```
La configuration du parc l'importe directement :
Il n'est pas partagé dans le dépôt commun.
```nix
imports = [
@@ -111,64 +112,56 @@ imports = [
./modules/software.nix
./modules/users.nix
./modules/security.nix
./modules/yubikey-first-login.nix
./modules/first-login-ui.nix
./modules/workstation-setup.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.
Les UUID de partitions et autres informations propres au matériel ne peuvent ainsi pas écraser la configuration d'un autre poste.
---
## 🧩 Modules principaux
## 🧩 Modules
### 📦 `software.nix`
crit l'environnement logiciel commun :
- 🌐 Chromium ;
- 🦊 Firefox ESR ;
- 📄 OnlyOffice ;
- 💬 Teams ;
- ✉️ Outlook Web ;
- 🔧 Git et outils nécessaires au poste.
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 attendus et leurs rôles :
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`.
- 🛠️ compte d'administration locale ;
- 👩‍💻 comptes utilisateurs standards ;
- 👥 appartenance aux groupes nécessaires ;
- 🔐 mécanismes d'initialisation des secrets lorsque nécessaire.
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`
Centralise les paramètres d'authentification et les mappings FIDO2/U2F.
Déploie le mapping utilisateur ↔ YubiKey et configure l'authentification PAM U2F/FIDO2 utilisée par le poste.
```text
Utilisateur
├──── 🔐 mot de passe
└──── 🔑 YubiKey / FIDO2
### ✨ `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";
};
```
### 🔑 `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
## ✨ Finalisation du poste
Lors de la première utilisation, l'utilisateur dispose d'un assistant graphique intégré au bureau KDE.
Lors de la première ouverture de session de l'utilisateur :
<div align="center">
@@ -176,197 +169,168 @@ Lors de la première utilisation, l'utilisateur dispose d'un assistant graphique
</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 local
### 🔐 Mot de passe
- 👁️ 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`.
- 🔒 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.
### 🔑 PIN YubiKey
### 🔑 YubiKey
- 🔢 saisie du PIN temporaire ;
- 👁️ affichage/masquage du PIN ;
- 🔁 choix et confirmation du nouveau PIN ;
-validation avant la fin du parcours.
- ✅ 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.
### ✅ Poste prêt
### 🚪 Assistant obligatoire
L'écran final récapitule visuellement les opérations réalisées avant de rendre le poste à l'utilisateur.
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
```
---
## 🛡️ 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 :
## 🛡️ Traitement des secrets
```text
┌───────────────────────────────
│ Qt Quick / QML
Présentation et validation
└───────────────┬───────────────
┌───────────────────────────────┐
│ Qt Quick / QML │
saisie utilisateur
└───────────────┬───────────────┘
pipe privé
┌───────────────────────────────
Backend contrôlé
────────────────────────────────┤
│ 🔐 Mot de passe → passwd NixOS
│ 🔑 PIN YubiKey → ykman │
└────────────────────────────────┘
┌───────────────────────────────┐
backend Qt contrôlé │
──────────────────────────────
┌────────┴────────┐
▼ ▼
/run/wrappers/bin/ ykman FIDO2
passwd
│ │
▼ ▼
/etc/shadow YubiKey
```
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.
- 🚫 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.
---
## 🧪 Cycle de validation
## 🔐 Mot de passe temporaire du lab
Une modification du dépôt n'est pas directement appliquée avec `switch`.
Le compte `alice` est créé avec un mot de passe temporaire connu pour faciliter les essais reproductibles :
### 1️⃣ Construction
```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
```
> 🧱 Construit la nouvelle configuration sans l'activer.
### 2️⃣ Prévisualisation de l'activation
### 2. Simulation d'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
### 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. Activation persistante
### 4️⃣ Validation définitive
Après validation complète de la checklist :
```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.
👉 Voir [`PRODUCTION-CHECKLIST.md`](PRODUCTION-CHECKLIST.md) avant un `switch`.
---
## 🚀 Vision de déploiement
## 🔭 Industrialisation future
L'objectif est de réduire progressivement la préparation d'un poste à une chaîne standardisée :
Le socle est conçu pour évoluer vers :
```text
💿 Installation NixOS
Inventaire / GLPI / CSV
🧬 Génération du matériel local
Utilisateur + poste + profil matériel
📥 Récupération du dépôt Git
Configuration NixOS commune
🧱 Construction de la configuration
Installation automatisée
🛡️ Application du socle de sécurité
👤 Affectation de l'utilisateur
🔑 Préparation FIDO2 / YubiKey
✨ Finalisation graphique
✅ Poste prêt
Finalisation utilisateur FIDO2
```
À 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.
Les prochaines briques possibles sont notamment Disko, un inventaire machines/utilisateurs et une installation unattended.
---
## 🧰 Technologies
## ⚖️ Licence
<p align="center">
Le projet est distribué sous **PolyForm Noncommercial 1.0.0**.
![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)
✅ 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.
</p>
Voir [`LICENSE`](LICENSE) et [`COMMERCIAL-LICENSE.md`](COMMERCIAL-LICENSE.md).
---
## 📜 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>
> Cette licence est *source-available non commerciale* ; elle n'est pas une licence Open Source au sens OSI.