From 94a10d654a46ee5afb43d19fd14facfadc9eae07 Mon Sep 17 00:00:00 2001 From: Olivier <1+olivier@noreply.raspot.in> Date: Tue, 18 Aug 2026 17:34:53 +0200 Subject: [PATCH] =?UTF-8?q?T=C3=A9l=C3=A9verser=20les=20fichiers=20vers=20?= =?UTF-8?q?"/"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PRODUCTION-CHECKLIST.md | 59 +++++++ README.md | 372 ++++++++++++++++++---------------------- 2 files changed, 227 insertions(+), 204 deletions(-) create mode 100644 PRODUCTION-CHECKLIST.md diff --git a/PRODUCTION-CHECKLIST.md b/PRODUCTION-CHECKLIST.md new file mode 100644 index 0000000..25231b1 --- /dev/null +++ b/PRODUCTION-CHECKLIST.md @@ -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. diff --git a/README.md b/README.md index 91a14d8..08d83ba 100644 --- a/README.md +++ b/README.md @@ -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.** --- -## 🎯 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` -Décrit l'environnement logiciel commun : - -- 🌐 Chromium ; -- 🦊 Firefox ESR ; -- 📄 OnlyOffice ; -- 💬 Teams ; -- ✉️ Outlook Web ; -- 🔧 Git et outils nécessaires au poste. +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 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 :
@@ -176,197 +169,168 @@ Lors de la première utilisation, l'utilisateur dispose d'un assistant graphique
-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é - -
- -### 🔐 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 : +## 🛡️ 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 -

+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. -

+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. - ---- - -
- -### 🛡️ NixOS Workstations - -**Déployer des postes homogènes, reproductibles et sécurisés sans transformer chaque machine en projet individuel.** - -
+> Cette licence est *source-available non commerciale* ; elle n'est pas une licence Open Source au sens OSI.